Flask教程(十二)项目部署

软硬件环境

前言

Flask框架内部实现了一个简易的Web服务器,因此在之前的教程中,我们并没有去单独安装Web服务器,但是如果项目要在生产环境中部署的话,其内置的服务器是不适合的,既不够稳定,也无法承受大量请求的并发,Flask+gunicorn+nginx+supervisor是最常用的Flask应用部署方案,本文就来一步一步进行Flask应用程序的部署

什么是WSGI

Web Server Gateway Interface,即web服务器网关接口,是Web服务器和Web应用程序或框架之间的一种简单而通用的接口,它是一种协议,一种规范,专门用来解决众多Web服务器和Web应用程序或框架的兼容性问题有了WSGI,你不用担心你写的Web应用程序只能运行在某一款Web服务器上

gunicorn

目前Flask官方列出了5个常用的WSGI容器,它们都实现了WSGI,我们使用最常用的gunicorn

flask

它的安装非常方便,使用pip即可

pip install gunicorn

接下来就可以启动gunicorn服务了,我们使用 Flask教程(十)表单处理Flask-WTF 中的示例,进入到源码目录,执行gunicorn -w 2 -b :5000 run:app

在windows中并不能使用gunicorn,我们可以将服务部署在ubuntu上

命令中的-w指的是处理请求的进程数,-b是指绑定本机ip,可以省略掉不写,使用的端口是5000,run:app指的是run.py中的flask app,更多参数帮助可以参照gunicorn -h

flask

这时候在浏览器中访问http://192.168.1.140:5000,这里的192.168.1.140是ubuntu系统的ip地址

flask

效果与Flask内置服务器是一模一样的

nginx

nginx是一个功能强大的反向代理服务器,我们使用nginx来转发gunicorn服务。为什么要在gunicorn之上再加层nginx呢?一方面nginx可以补充gunicorn在某些方面的不足,如SSL支持、高并发处理、负载均衡处理等,另一方面如果是做一个web网站,除了服务之外,肯定会有一些静态文件需要托管,这方面也是nginx的强项

首先安装nginx

sudo apt install nginx

编辑配置文件/etc/nginx/sites-available/default,修改location /如下

# 注意下这里的监听端口,访问的时候会用到
listen 80 default_server;
listen [::]:80 default_server;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
proxy_pass http://localhost:5000/;
proxy_redirect off;

proxy_set_header Host $http_post;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

接下来重启nginx服务

sudo /etc/init.d/nginx restart

这时候一定要确保gunicorn服务已经启动,然后访问http://192.168.1.140

flask

supervisor

supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制,更详细的使用方法请参考之前的文章 https://xugaoxiang.com/2019/12/04/supervisor/

首先创建/etc/supervisor/conf.d/gunicorn.conf文件,这是gunicorn服务的配置文件

[program:gunicorn]
command=/home/waws/anaconda3/bin/gunicorn -w 2 -b :5000 run:app
directory=/home/waws/workshop/Flask-10-wtf
autostart=true
autorestart=true
user=waws
redirect_stderr=true

接着还是同样的方法创建nginx的配置文件,/etc/supervisor/conf.d/nginx.conf,内容是

[program:nginx]
command=/usr/sbin/nginx -g 'daemon on;'
autostart=true
autorestart=true
user=root
redirect_stderr=true

nginx是需要root权限的,所以user应该设置成root。最后就可以重启supervisor

sudo /etc/init.d/supervisor restart 

重启成功后,我们来查看下gunicornnginx是否启动正常

flask

以及Flask应用是否正常

flask