想把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
正常运行则显示如下:
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 # 重新加载配置
有了这三样东西相辅相成,在服务器上放个程序跑还是比较放心的,记得配置好各自的日志,发现异常速看日志,这里用的只是它们的冰山一角,更复杂的需求去翻文档