Flask维护手册
前言
本文作为行为数据组所有 flask 相关接口的运维操作指南和记录。
api编写手册1
采用 flask 框架编写 API,配合 supervisor、gunicorn、nginx 进行部署。其中 gunicorn 用于做 WSGI HTTP 服务器,比直接使用 flask 稳定;supervisor 用户守护进程,用于管理应用的启动/关闭等;nginx 用于反代,统一管理路径相关配置。
文档组织结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
venv/ # 虚拟环境
logs/ # 项目日志
flaskr/ # 项目主体
- views/
- ...
docs/ # 项目文档
nginx-logs/ # nginx日志(可选,部署在10.30.127.32上不需要)
gunicorn-logs/ # gunicorn日志
readme.md
nginx-xxx-port.conf # nginx配置
gunicorn.py # gunicorn配置
supervisor_xxx.ini # supervisor配置
app.py # 程序入口
.gitignore
文档说明
venv/表示虚拟环境,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交logs/表示项目日志,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交nginx-logs/表示nginx日志(可选),开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交gunicorn-logs/表示gunicorn日志,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交flaskr/存放程序主体文件,结构参考一般的flask-rest-api开发docs/存放项目文档nginx-xxx-port.conf为项目nginx配置supervisor_xxxx.ini为项目supervisor配置gunicorn.py为项目gunicorn配置app.py程序启动入口,由于项目中采用相对导入的方法,故开发调试时不能直接启动,需要在根目录下创建启动模块.gitignore
环境安装
- 安装nginx,让系统部安装
- 安装supervisor
1 2 3 4
sudo su yum install supervisor systemctl enable supervisor systemctl start supervisor
部署手册
sudo sucd /data/wwwrootgit clone https://pscgit.jjmatch.cn/wurk/dhl-product.gitcd dhl-productpython3 -m venv venvsource venv/bin/activatepip install -r requirements.txt -i https://pypi.srv.jj.cn/simple/sudo ln -s /data/wwwroot/dhl-product/supervisor_apitutorial.ini /etc/supervisord.d/supervisor_apitutorial.inisupervisorctl updatesupervisorctl restart apitutorial- 根据
/data/wwwroot/dhl-product/nginx_apitutorial_13452.conf修改/usr/local/nginx/conf/vhost/vhosts.conf文件,没有则创建即可,记得备份 /usr/local/nginx/sbin/nginx -t/usr/local/nginx/sbin/nginx -s reload
更新手册(仅程序主体逻辑)
git pullsupervisorctl restart apitutorial
下线手册
supervisorctl stop apitutorialsudo rm /etc/supervisord.d/supervisor_apitutorial.inisupervisorctl update- 注释
/usr/local/nginx/conf/vhost/vhosts.conf相关部分 /usr/local/nginx/sbin/nginx -t/usr/local/nginx/sbin/nginx -s reload
更新手册(包含配置)
- 执行下线操作
- 执行部署操作
线上代码调整1
核心观点是尽量不在线上直接修改代码,因为ssh操作不直观。针对线上代码调整一般存储如下步骤:
紧急修改
- 线上 git clone xxxx
- 线上 vim xxxx
- 线上 确保无误后
git commit -a - 线上 git push
- 本地 git pull
- 本地 git push
- 线上 git pull
为避免出错和麻烦,线上修改后,一定要git push。避免线上和主库出现冲突后,线上vim修改文件解决冲突不便的麻烦。
对于线上临时修改的复原使用 git checkout . ,即丢弃当前的所有临时修改。
服务部署
简单的服务部署可以参考实际案例:2025-10-21-写一个Flask服务响应WebHook.md。
生产环境的部署见前面两节。1
gunicorn 配置
因为虚机是不能连外网的,所以生成 venv 配置文件夹的方法都比较特殊。
生成 venv 配置文件夹:
1
2
3
4
5
6
7
8
9
cd /data/wwwroot/evt-proj-2026/evt-proj-2026
# 正常环境下:
python3 -m venv venv
# 非联网环境下
python3 -m venv venv --system-site-packages
# 激活:
source venv/bin/activate
# 若需要退出的话:
deactivate
生成 gunicorn 执行文件:
1
2
3
4
5
6
7
cd /data/wwwroot/evt-proj-2026/evt-proj-2026
echo "import sys; from gunicorn.app.wsgiapp import run; sys.exit(run())" > venv/bin/gunicorn
chmod +x venv/bin/gunicorn
ls -l venv/bin/
从其他已有所需库的项目中拷贝必要文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/flask* venv/lib/python3.7/site-packages/
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/gunicorn* venv/lib/python3.7/site-packages/
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/werkzeug* venv/lib/python3.7/site-packages/
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/itsdangerous* venv/lib/python3.7/site-packages/
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/jinja2* venv/lib/python3.7/site-packages/
cp -r /data/wwwroot/eom-product/venv/lib/python3.7/site-packages/click* venv/lib/python3.7/site-packages/
cp /data/wwwroot/evt2_0/evt/venv/bin/gunicorn venv/bin/
服务升级
本节以位于 10.30.127.32 上的 mis-esp 为例,介绍 flask 服务的升级步骤
-
本地修改代码:在 Windows 本地,通过 VSCode 修改代码。
-
本地推送:将本地修改在 git 上提交并推送到远端。
-
备份服务器当前代码:
-
先切换到目标路径:
1
cd /data/wwwroot -
执行如下命令打包:
1
tar -czvf evtprodapi20251224.tar.gz evtprodapi/
-
命令参数解释:
c:create,创建新的压缩包(核心参数,标识打包操作)。z:gzip,使用 gzip 压缩算法(最终生成.gz格式的压缩包)。v:verbose,显示打包 / 压缩的详细过程(可选,加上能看到哪些文件被处理,方便核对)。f:file,指定输出的压缩包文件名(必须放在参数最后,紧跟文件名)。evtprodapi/:要打包的目标文件夹(末尾加/表示打包文件夹内的所有内容,不加也可以,效果基本一致)。
-
-
服务器代码目录:
1
cd /data/wwwroot/evtprodapi -
拉取最新代码:(mis-esp 中有多个远端仓库,需指定分支)
1
git pull hansb master
-
查看 Supervisor 当前运行和管理的所有服务:(方便确认目标服务)
1
supervisorctl status
-
根据如下文件进一步确认服务配置:
1
/etc/supervisord.conf
其它服务的配置位于如下文件夹内:
1
/etc/supervisord.d/
-
确认了目标服务后,通过如下命令重启:(evtprod_esp_mis 对应的服务名称是 evtprod)
1
supervisorctl restart evtprod
服务拉起
2026年1月12日:运维反馈 eom 用不了,需要确认一下服务状态。
根据文档 Eom维护手册 检查 centos 上 EOMAPI 的服务状态,若有问题的话直接拉起。
相关知识
Gunicorn
Gunicorn 是 Python Web 项目的「生产环境服务器」。它的工作就是:
接收用户的访问请求 → 交给你的 Python Web 应用处理 → 把结果返回给用户
标准的上线架构为:
用户请求 → Nginx(反向代理)→ Gunicorn(WSGI 服务器)→ Flask/Django(应用)
Gunicorn 解决了如下问题:
- 自带服务器太弱:Flask/Django 自带服务器只能开发用,不能上线
- 扛不住并发:Gunicorn 可以开多个进程,同时处理几百人访问
- 稳定可靠:崩溃自动重启,适合 7×24 小时运行
- 搭配 Nginx:正式部署 =
Nginx+Gunicorn+Python 应用
Gunicorn 命令:
1
2
# Flask 项目启动
gunicorn -w 4 -b 0.0.0.0:5000 app:app
-w 4:开 4 个工作进程(处理并发)-b:绑定端口,让外部访问
venv
venv = 给每个项目单独造一间「独立Python小房间」
核心作用:环境隔离
服务器只有一套系统Python,装着各种全局包:
- A 项目要用 Flask1.1
- B 项目要用 Flask2.3
- 混装在一起直接冲突炸锅
venv 解决:
每个项目自己一间房:
- 自己的 Python 解释器:
- 各用各版本,绝不冲突
- 删项目只删自己 venv,不影响全局
- 环境干净、迁移规范
- 自己的 site-packages 依赖包
- 自己的 pip/gunicorn:互不干扰,完全隔离
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【系统Python 只当底座,干净不动】
↓
┌──── 项目A venv �──┐
│ 专属Python解释器 │
│ 专属Flask1.1 │
│ 专属gunicorn │
│ 自己装自己的包 │
└───────────────────┘
┌──── 项目B venv ───┐
│ 专属Python解释器 │
│ 专属Flask2.3 │
│ 专属新版依赖 │
│ 和A完全隔离 │
└───────────────────┘