一文搞懂 flask gunicorn supervisor 的作用和关系
- 使用 flask 搭建 python 网页应用
Flask是一个使用 Python 编写的轻量级 Web 应用框架
类似于Laravel
是使用 PHP 编写的 Web 应用框架 - 使用 gunicorn 作为 flask 的 http 服务器
Gunicorn是一个专用于 python 的 http 服务器
类似于nginx
是常用于 html 的 http 服务器 - supervisor 管理进程
supervisor 把其它应用的进程作为其子进程进行管理,还可以管理远程服务器上的进程
https://github.com/wenyamu/python_demo
创建 python 环境
docker compose -f python.yml up -d
1 | version: '3' |
查看 python 和 pip 版本
1 | 查看 python 版本 |
安装程序运行用到的包
1 | pip install gunicorn flask gevent pymysql |
flask 项目目录结构
1 | / |
新建 /python/flasktest.py
1 | from flask import Flask, render_template, url_for, request |
代码段设置的解释
1 | app = Flask(__name__, |
新建 /python/templates/index.html
1 |
|
启动 flask 应用
1 | 进入项目根目录 |
使用 ip:5000 访问 得到如下结果
1 |
|
gunicorn 启动 flask 应用
gunicorn 作用类似于 nginx,只不过它是专用于 python 的 http 服务器
1 | gunicorn 命令详解 |
gconf80.py 配置文件
1 | #gconf80.py 内容开始 与 gconf443.py 相比,端口80改成443,多了ssl配置 |
gunicorn 的 gevent 模式
单进程直接运行 python http 服务时, 当有两个并发请求过来时, 进程只能先处理一个请求, 等第一个请求处理完成后, 才能处理第二个, 势必影响用户的体验。
那么单进程的时候, 如何能提高并发处理能力?
大多数情况下, 我们的服务中, 导致性能低下的原因是I/O, 比如对数据库的读写, 发送 http 请求等等, 当进程进行I/O的时候, 是不占用CPU时间的, 这个时候, CPU可以被腾出来处理其他请求。
gevent 就是完成这个工作的。幸运的是, 我们不需要自己实现这部分功能, gunicorn 实现了 gevent 模式的运行方式(-k 参数指定), 允许你的 python web 更高性能的处理业务,例如:
1 | gunicorn \ |
supervisor 项目目录结构
1 | / |
各文件的功能说明
flasktest.py
web程序文件,是用 python 写的 web 页的功能代码。类似于 php 写的 web 页 xxx.php 文件是一个意思。
gconf80.py
作为启动 gunicorn 的配置文件,对 gunicorn 的监听端口,线程数等参数进行设置。
supervisor_conf/flask80.conf
作为 supervisor 管理的子进程的配置文件,对 gunicorn 进程的一些管理。gunicorn 就是用来启动 flask web 程序的,示例如下。
1 | [program:flask_app80] |
supervisor_flaskapp.conf
作为启动 supervisor 时的主配置文件,主配置文件中会引入 flask80.conf 子配置文件。
supervisor 管理进程
supervisor 的多进程管理,就类似于nginx 的多站点管理,每个站点一个配置文件,然后在nginx主配置文件中引用。
- supervisor是一个进程管理系统,它通过fork/exec的方式将这些被管理的进程当作它的子进程来启动,若该子进程异常中断,则父进程可以准确地获取子进程异常中断的信息。
- supervisor 可以通过 web 界面对进程进行启动、停止、重启操作
以下是 nginx 进程的配置,示例参考
1 | [program:nginx] |
安装 supervisor
1 | pip install supervisor |
/python/supervisor_flaskapp.conf
这里需要说明一下,为什么把 /etc/supervisor/supervisord.conf 主配置文件引入到 supervisor_flaskapp.conf 中
一般正常的操作是,启动 supervisor 使用的是主配置文件 supervisord.conf,并需要在主配置文件的结尾处修改引入路径,如下
1 | [include] |
这里之所以在 supervisor_flaskapp.conf 中使用如下方式
1 | [include] |
就是为了不修改 supervisord.conf 主配置文件的前提下,把主配置文件的内容引入到 /python/supervisor_flaskapp.conf 文件中,并把它作为启动 supervisor 使用的主配置文件。
1 | supervisor_flaskapp.conf 内容开始 |
/python/supervisor_conf/flask80.conf
1 | flask80.conf 与 flask443.conf 不同之处 |
启动 supervisord 进程
1 | /usr/local/bin/supervisord -c /python/supervisor_flaskapp.conf |
打开 supervisor 进程管理界面 ip:8000
gunicorn 与 supervisor 总结
gconf80.py 作为 gunicorn 的配置文件,进程
gunicorn -c /python/gconf80.py flasktest:app
gunicorn 进程写在 supervisor 配置文件中,进程
supervisord -c /python/supervisor_flaskapp.conf
所以 supervisord < gunicorn 套娃
supervisor 远程管理进程
项目目录结构
1 | / |
监控程序
/python/supervisor_monit/monit.py
1 | from flask import Flask, render_template, url_for, request, jsonify, redirect |
监控程序的模板文件
/python/supervisor_monit/templates/monit.html
1 |
|
监控程序的配置文件
/python/supervisor_monit/gconf_monit.py
1 | #gconf_monit.py |
启动监控程序
1 | 当配置文件 gconf_monit.py 中未指定 chdir 时, |
使用 ip:5000 查看监控
附件
其它 supervisor 命令
1 | 启动、停止、重启应用、查看状态 |