配置Nginx代理

首先复制默认配置,然后在默认配置上进行修改:

cd /etc/nginx/sites-available

cp default xxx_web

这里主要是对server_name和网站路由进行修改。修改示例:

server_name xxx.com *.xxx.com;
client_max_body_size 100m;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass unix:/path_to_sock/xxx_com.sock;
}

考虑到我还需要往网站上上传一些文件,需要对nginx的默认最大文件大小进行修改。

现在就可以enable该sites了,

ln -s /etc/nginx/sites-available/xxx_web /etc/nginx/sites-enabled/xxx_web

nginx默认情况下会enable默认的网站配置default,需要删除掉。

rm /etc/nginx/sites-enabled/default

现在就可以启动nginx服务,并且enable nginx服务使得nginx能够开机启动。

systemctl enable nginx

systemctl start nginx

如果发现启动过程中出现了一些问题,比如配置语法错误等等,可以查看log信息:

systemctl status nginx 或者 journalctl -xe

创建python环境

为了方便维护和下载安装python的依赖库,强烈建议使用anaconda来安装python。

创建conda环境:

conda create -n flask python=3.5

source activate flask

conda install flask

conda install -c xxx uwsgi

最后一个指令中要指明非官方的channel,因为官方维护的并没有uwsgi。具体的channel可以google。

配置uwsgi-emperor环境

默认的uwsgi安装过程中,并没有添加uwsgi的systemd服务,因此需要我们自己添加。具体如下:

cd /etc/systemd/system

nano emperor.uwsgi.service 

修改得到如下的service配置信息:

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
WorkingDirectory=~
User=xxx_user
Group=xxx_group
Environment="PATH=/home/xxx_user/miniconda3/envs/flask/bin"
ExecStart=/home/xxx_user/miniconda3/envs/flask/bin/uwsgi --ini path_to/uwsgi-config/emperor.ini
RuntimeDirectory=uwsgi
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

这里采用了uwsgi教程中推荐的emperor-vassal模式,具体的emperor的uwsgi配置如下:

[uwsgi]
emperor = /home/xxx_user/web/uwsgi-config/vassals
logto = /home/xxx_user/web/uwsgi-emperor.log

上面第一行表示uwsgi vassal的路径。我们只需要把我们具体要代理的网站配置放到这个文件夹路径下,就可以自动加载这些网站了。第二行则是uwsgi的log file,方便调试。

这里需要主要,由于我都是安装在个人路径下,最后是制定运行的User和Group,避免权限问题。

另外由于我的python是在一个独立的conda environment下的,必须把Path环境切换过去,如Environment=

最后就可以像配置nginx那样启动和开机启动uwsgi。

配置uwsgi-vassal

现在开始配置最终的网站后端。

上面介绍了我们只需要将uwsgi的配置文件放在emperor = /home/xxx_user/web/uwsgi-config/vassals这个路径下面。具体的:

nano xxx_com.ini

编辑得到如下配置:

[uwsgi]

master = true
processes = 4
virtualenv = /home/xxx_user/miniconda3/envs/flask/lib/python3.5
socket = /home/xxx_user/web/xxx_com.sock
chmod-socket = 666
vacuum = true

die-on-term = true

chdir = /home/xxx_user/web/xxx_com/sites
module = main:app

这里需要主要修改socket的mod,不然,由于nginx是以其他用户身份启动的,会导致nginx无法访问socket。这里指定的socket必须与nginx指定的scok对应。