flask应用部署管理方案
21年下半年,工作的时候写了很多flask小应用。随着小应用越来越多,管理起来很麻烦。这几天从网上搜索整理了一个关于flask应用部署管理的方案。
基本思路: supervisor(管理应用)+Gunicorn(高性能的Python WSGI UNIX HTTP服务器,代替flask的开发服务器)+flask(程序)|Django|Tornado等
supervisor:我们可以把flask应用交给supervisor来管理,它实现了对托管程序的启动、终止、重启、状态监控、日志查询等功能。安装方便(pip install supervisor),附加了一个简单的监控页面。(应用再多也不担心了)
Gunicorn :Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.(flask文档里建议我们不要在生产环境中使用自带的开发服务器,嗯,其实我并没有感受到这个问题,因为我的小程序,用户很少很少(十位数以内),不过论正式的场合,应用一些官方推荐的技术也是有道理的)
官方文档:
- supervisor :http://supervisord.org/index.html
- Gunicorn:https://docs.gunicorn.org/en/latest/index.html
实践:
- 在服务器上安装python环境。
- 创建虚拟环境,安装应用依赖包。
- 安装supervisor 和Gunicorn (安装到对应的虚拟环境里即可,嗯,关于离线安装各种python包,建议可以先在外网的开发环境里,整理出依赖包,然后pip download 这些包,可以的话,环境最好和生产环境一致)
- 上传flask程序。
- 创建supervisor 的配置文件。
$ mkdir /etc/supervisor
$ echo_supervisord_conf > /etc/supervisor/supervisord.conf
# 这个是supervisor自带的一个配置生成工具。项目很多,我这里自己写了一个简单的
配置案例:
# 配置的时候,请删除我写的备注,这个是不被supervisor识别的
[program:demo1]
command=/home/yxy/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 main:app
# 指定gunicorn所在的位置(如果是虚拟环境,就写到虚拟环境,如果全局,就不用了),指定绑定的端口,flask入口 (main是flask文件名,app是实例名)
directory=/home/yxy/workspace/demo1
# 指定flask应用位置
autorestart=true
stderr_logfile=/home/yxy/workspace/demo1/err.log
stdout_logfile=/home/yxy/workspace/demo1/out.log
# 日志
user=yxy
# 指定执行程序的用户,注意要和supervisor保持一致。
stopsignal=INT
[program:demo2]
# 可以指定多个应用
command=/home/yxy/venv/bin/gunicorn -w 4 -b 0.0.0.0:5001 main:app
directory=/home/yxy/workspace/demo2
autorestart=true
stderr_logfile=/home/yxy/workspace/demo2/err.log
stdout_logfile=/home/yxy/workspace/demo2/out.log
user=yxy
stopsignal=INT
[inet_http_server]
port=0.0.0.0:9001
username=yxy
password=yxy
# 配置web管理页面的端口,用户和地址
[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=1
user=yxy
# 指定一些supervisor的配置,可以忽略这部分,保持系统默认也可以。
启动:
supervisord -c /etc/supervisor/supervisord.conf
访问页面:http://地址:9001
基本的管理都可以在这里进行操作了。
常用的相关管理命令
$ supervisorctl restart <application name> ;重启指定应用
$ supervisorctl stop <application name> ;停止指定应用
$ supervisorctl start <application name> ;启动指定应用
$ supervisorctl restart all ;重启所有应用
$ supervisorctl stop all ;停止所有应用
$ supervisorctl start all ;启动所有应用
# 重启supervisor。
$ systemctl reload supervisor.service
$ service supervisor reload
# 终止supervisor
# 启动的时候会有一个supervisord.pid文件生成,里面有进程ID。
$ systemctl stop supervisor.service
$ service supervisor stop
具体可以参考这个文章:https://zhuanlan.zhihu.com/p/301151674/
备注:
1. 可以编写gunicorn的配置文件来管理一些服务相关的。(supervisor管理的是机器上的进程,gunicorn管理的具体的应用),参考文章:https://zhuanlan.zhihu.com/p/301163333/
2. 上面的一些命令,可能是在Ubuntu上的,centos的话,可能需要调整一下,具体到官方文档查询一下即可。
参考的一些资料:
1. https://zhuanlan.zhihu.com/p/97471798
2.https://zhuanlan.zhihu.com/p/79227989
3. https://www.jianshu.com/p/0b9054b33db3
4. https://www.jianshu.com/p/260f18aa5462