2018年10月

近来迁移了自家的服务器,顺便记录一下Flask项目的部署。

这里采用Nginx + Supervisor + Python3 + uWSGI + Flask的方案。其中建议把uWSGI替换成Gunicorn,据说采用纯Python实现的Gunicorn,更方便打包为Dockor镜像,并且性能几乎跟Supervisor一样。这个留待以后再研(折)究(腾)。

新服务器采用Debian 9,部署过程参考以下文章:
Flask+uwsgi+Nginx部署应用
https://www.jianshu.com/p/84978157c785


1. 安装项目虚拟环境

假设项目文件夹为`/opt/flask_proj`,安装命令如下:

sudo apt update
sudo apt install python3 python3-pip
sudo pip3 install vertualenv
cd /opt/flask_proj
virtualenv venv
pip3 install -r requirements.txt

其中:
1)安装vertualenv需要用root用户,否则不会安装到/usr/local/bin/virtualenv,并且需要自行添加到path。
2)requirements.txt为flask项目所需的库。这个要看项目是否需要安装。
3)如果是迁移项目,可以在迁移前生成requirements.txt文件:pip3 freeze > requirements.txt


2. 安装uWSGI

如果requirements.txt里已包含uWSGI,则不用重复安装。安装命令如下:

pip3 install uwsgi

在项目文件夹下,新建uWSGI配置文件config.ini,参考内容如下:

[uwsgi]
master = true
home = venv
wsgi-file = manage.py
callable = app
socket = :5001
processes = 4
threads = 2
buffer-size = 32768

3. 安装supervisor

安装命令如下:

sudo apt-get install supervisor

在文件夹/etc/supervisor/conf.d下新建项目对应的配置文件,例如flask_proj.conf,参考内容如下:

[program:flask_proj]
# 启动命令入口
command=/opt/flask_proj/venv/bin/uwsgi /opt/flask_proj/config.ini
# 命令程序所在目录
directory=/opt/flask_proj
# 运行命令的用户名
user=user
autostart=true
autorestart=true
# 日志地址
stdout_logfile=/opt/flask_proj/logs/uwsgi_supervisor.log

启动supervisor服务:

sudo service supervisor start

4. 安装Nginx

一般安装系统自带的版本就够用了:

sudo apt install nginx

在文件夹/etc/nginx/sites-available下新建配置文件flask_proj,参考内容如下:

server {
    listen 443 ssl http2 default_server;
    #listen [::]:443 ssl;
    server_name www.abc.xyz;

    ssl_certificate /etc/letsencrypt/live/www.abc.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.abc.xyz/privkey.pem;

    index index.html index.htm;

    gzip            on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    #gzip_proxied    expired no-cache no-store private auth;
    gzip_comp_level 5;
    gzip_types      text/html text/css text/javascript text/json text/plain text/xml application/javascript application/json application/soap+xml application/x-javascript application/x-www-form-urlencoded application/xhtml+xml application/xml;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5001;
        uwsgi_param UWSGI_PYHOME /opt/flask_proj/venv;
        uwsgi_param UWSGI_CHDIR /opt/flask_proj;
        uwsgi_param UWSGI_SCRIPT manage:app;
        uwsgi_read_timeout 100;
    }  
}

注意:
1)这里只配置了https,相关的SSL证书,可以到https://letsencrypt.org/免费申请。
2)开启了gzip压缩。

最后添加链接文件,并重启Nginx:

sudo ln -s /etc/nginx/sites-available/flask_proj /etc/nginx/sites-enable/flask_proj
sudo service nginx restart