想把Web应用放在服务器上跑,需要进行服务器部署,其中用到这三个东西:

  • Gunicorn:高性能的Web服务器,在实际生产环境下,flask自带的web服务器难以满足,所以要把Web应用跑在这上面
  • Nginx:也是一个Web服务器,相当于一个中间人,可以进行反向代理、负载均衡等
  • Supervisor:Linux/Unix下的一个进程管理工具(守护程序),负责监听、启动、重启一个或多个进程,用它来守护Web应用正常运行

Gunicorn

用pip或apt-get安装都可以, 这里用pip:

pip install gunicorn

安装成功后,在程序目录下写一个wsgi.py文件,用来指向Web应用的入口,内容如下:

import sys
from os.path import abspath
from os.path import dirname
import app


sys.path.insert(0, abspath(dirname(__file__)))

# 这个application 指向Flask的实例
application = app.app

跑一下看看是否正常:

gunicorn wsgi --bind 0.0.0.0:5000 --pid /tmp/flask.pid

正常运行则显示如下:

Snipaste_2019-06-05_13-45-05.jpg

Nginx

安装:

apt-get install nginx

成功安装后去改配置文件,修改/etc/nginx/sites-enabled/default

# 这里只是简单配置,详细配置网上有文档
server {
    listen 80;                             # 监听端口
    server_name example.org;               # 放域名,用地址也行

    location / {
        proxy_pass http://127.0.0.1:5000;  # 这里是指向 gunicorn host 的地址
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

  }

如果要配置80的代理,不能在conf.d目录下配置,应该替换/etc/nginx/sites-enabled/default文件中的配置,或者把include /etc/nginx/sites-enabled/*注释掉。

改完重启一下nginx: service nginx restart

Supervisor

Supervisor 是一个 C/S 模型的程序,supervisord 是 server 端,supervisorctl 是 client 端

安装: apt-get install supervisor

成功安装后会默认开机自启

然后去改配置文件,Supervisor默认的配置在/etc/supervisord.conf中,里面引入了/etc/supervisor/conf.d/ 下的 .conf 文件,所以去/etc/supervisor/conf.d/下创建自己的.conf文件

# 程序名称,在 supervisorctl 中通过这个值来对程序进行一系列的操作
[program:myapp]                        
# 可以通过 environment 来添加需要的环境变量,常见用法是使用指定的虚拟环境
environment=PATH="/home/app_env/bin"   
# 启动命令需要写全,注意我这里的gunicorn是在虚拟环境中安装的,所以路径在虚拟环境下
command=/home/app_env/bin/gunicorn wsgi --bind 127.0.0.1:5000 --pid /tmp/myflask.pid
# 用哪个用户启动                       
user=debian              
# 程序的启动目录             
directory=/home/app/         
# 程序异常退出后自动重启          
autorestart=True                       
# 在 supervisord 启动的时候也自动启动
autostart=True                         
# 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录
stdout_logfile = /data/log/stdout.log  
# 把 stderr 重定向到 stdout,默认 false
redirect_stderr=True                   
# stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20MB         
# stdout 日志文件备份数
stdout_logfile_backups = 20            

用 supervisord 管理时,gunicorn 的 daemon 选项需要设置为 False

supervisorctl操作:

supervisorctl + [命令]
[命令]
help                     # 查看帮助
status                   # 查看程序状态
stop program_name        # 关闭程序
start program_name       # 启动程序
restart program_name     # 重启程序
tail -f program_name     # 查看程序日志
update                   # 重新加载配置

有了这三样东西相辅相成,在服务器上放个程序跑还是比较放心的,记得配置好各自的日志,发现异常速看日志,这里用的只是它们的冰山一角,更复杂的需求去翻文档