Deploy Flask Project
近来迁移了自家的服务器,顺便记录一下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 virtualenv
cd /opt/flask_proj
virtualenv venv
pip3 install -r requirements.txt
其中:
1)安装virtualenv需要用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