Flask部署| gunicorn、nginx部署flask项目,并用supervisor来管理进程
本科的时候做公众号,开始提供学生教务查询服务,后端从PHP转到Python,无论是使用django还是flask,部署都没PHP那么方便,每次修改程序完,都是ps ax,然后再kill,再run。emmmmmm,其实一直都知道supervisor,之前配置过几次,都没配成功 ,也就没耐心好好去学一学,刚好寒假想重新学一下flask,就尝试了一下,配置成功,顺便记录下,以便以后的使用。
Flask项目开发
emmmmmm,这里就不赘述了,我这里部署的是自己根据Flask官方文档进行练习的项目,如果觉得还不错,可以给个star哦
Github地址:https://github.com/LDouble/Flask-Learning
用gunicorn运行Flask项目
Flask自带server性能等问题,没办法部署到生产环境,之前用的时候,官方提供了很多种方案,详情见http://www.pythondoc.com/flask/deploying/,我是误打误撞选择了gunicorn,而且觉得用起来挺舒服的。
-
安装gunicorn
pip3 install gunicorn
-
通过命令启动程序
gunicorn --workers=2 test:app # test为模块名,test:app,意味着我的test.py中的服务器实例化对象为app workers=2 代表2个进程
[2018-02-18 16:50:18 +0800] [4858] [INFO] Starting gunicorn 19.7.1
[2018-02-18 16:50:18 +0800] [4858] [INFO] Listening at: http://127.0.0.1:8000 (4858) #默认运行在8000端口
[2018-02-18 16:50:18 +0800] [4858] [INFO] Using worker: sync #
[2018-02-18 16:50:18 +0800] [4863] [INFO] Booting worker with pid: 4863
[2018-02-18 16:50:18 +0800] [4864] [INFO] Booting worker with pid: 4864
其它更多参数以及说明参考
http://docs.gunicorn.org/en/stable/run.html#commands
http://blog.csdn.net/y472360651/article/details/78538188
- 编写配置文件
那么多配置文件,我们要是全部都在命令行输入,岂不是太麻烦了,所以我们可以通过加载配置文件来运行程序。配置文件的参数和上面提到的差不多,可以按照自己的需要选择何时的参数即可。
import os
from gevent import monkey
monkey.patch_all()
import multiprocessing
debug = False
bind = "0.0.0.0:5001"
pidfile = "gunicorn.pid"
logfile = "error.log"
workers = multiprocessing.cpu_count()*2 + 1
worker_class = "gevent" # 异步非阻塞
reload = True # 自动重新加载
#daemon = True
gunicorn -c gunc.py hello:app #运行程序
supervisor 配置管理进程
- 安装supervisor并生成配置文件模板
pip install supervisor #因为supervisor目前只支持py2,所以不能用pip3进行安装 emmmmmm
echo_supervisord_conf > supervisor.conf # 导出配置模板
# 然后supervisor.conf 尾部添加内容如下:
[program:hello_world] ;hello_word 是自己给进程取的名,随意
command=gunicorn -c gunc.py hello:app ; supervisor启动命令
directory=/www/Flask-Learning/hello_world ; 项目的文件夹路径
startsecs=0 ; 启动时间
stopwaitsecs=0 ; 终止等待时间
autostart=false ; 是否自动启动
autorestart=false ; 是否自动重启
stdout_logfile=/www/log/hello.log ; log 日志
stderr_logfile=/www/log/hello.err ; 错误日志
# 加载配置文件并启动supervisor
supervisord -c supervisor.conf
# 管理项目
supervisorctl reload :修改完配置文件后重新启动supervisor
supervisorctl status :查看supervisor监管的进程状态
supervisorctl start 进程名 :启动XXX进程 进程名就是你刚刚配置文件的进程名
supervisorctl stop 进程名 :停止XXX进程
supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl update:根据最新的配置文件,启动新配置
- 开机自动启动supervisor
# Ubuntu为例
vim /etc/rc.local
#添加以下内容
supervisord -c path/supervisor.conf # path是supervisor.conf的路径
supervisorctl start all #启动所有的程序
Nginx实现反向代理
至于为什么要用Nginx实现反向代理,各有自己的需求,这个在知乎上也有讨论,可以看看https://www.zhihu.com/question/38528616,我是因为一个服务器上有多个应用,而且期末的时候需要考虑到负载均衡。
反向代理和平常的反向代理一样的,
vim /etc/nginx/site-enable/default
# 添加server
server {
listen 80;
server_name hello_flask.it592.com;
root /www/Flask-Learning/hello_world;
location / {
proxy_pass http://127.0.0.1:5001; #gunicorn运行的端口
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
部署完毕
这大概就是完整的部署过程了,我的网站地址:http://hello_flask.it592.com/api/