文章

Flask维护手册

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

文档说明

  1. venv/ 表示虚拟环境,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交
  2. logs/ 表示项目日志,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交
  3. nginx-logs/ 表示nginx日志(可选),开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交
  4. gunicorn-logs/ 表示gunicorn日志,开发时这个文件夹下可为空,但是需要添加.gitkeep文件,保证git提交时这个目录会被提交
  5. flaskr/ 存放程序主体文件,结构参考一般的flask-rest-api开发
  6. docs/ 存放项目文档
  7. nginx-xxx-port.conf 为项目nginx配置
  8. supervisor_xxxx.ini 为项目supervisor配置
  9. gunicorn.py 为项目gunicorn配置
  10. app.py程序启动入口,由于项目中采用相对导入的方法,故开发调试时不能直接启动,需要在根目录下创建启动模块
  11. .gitignore

环境安装

  1. 安装nginx,让系统部安装
  2. 安装supervisor
    1
    2
    3
    4
    
    sudo su
    yum install supervisor
    systemctl enable supervisor
    systemctl start supervisor
    

部署手册

  1. sudo su
  2. cd /data/wwwroot
  3. git clone https://pscgit.jjmatch.cn/wurk/dhl-product.git
  4. cd dhl-product
  5. python3 -m venv venv
  6. source venv/bin/activate
  7. pip install -r requirements.txt -i https://pypi.srv.jj.cn/simple/
  8. sudo ln -s /data/wwwroot/dhl-product/supervisor_apitutorial.ini /etc/supervisord.d/supervisor_apitutorial.ini
  9. supervisorctl update
  10. supervisorctl restart apitutorial
  11. 根据/data/wwwroot/dhl-product/nginx_apitutorial_13452.conf修改/usr/local/nginx/conf/vhost/vhosts.conf文件,没有则创建即可,记得备份
  12. /usr/local/nginx/sbin/nginx -t
  13. /usr/local/nginx/sbin/nginx -s reload

更新手册(仅程序主体逻辑)

  1. git pull
  2. supervisorctl restart apitutorial

下线手册

  1. supervisorctl stop apitutorial
  2. sudo rm /etc/supervisord.d/supervisor_apitutorial.ini
  3. supervisorctl update
  4. 注释 /usr/local/nginx/conf/vhost/vhosts.conf 相关部分
  5. /usr/local/nginx/sbin/nginx -t
  6. /usr/local/nginx/sbin/nginx -s reload

更新手册(包含配置)

  1. 执行下线操作
  2. 执行部署操作

线上代码调整1

核心观点是尽量不在线上直接修改代码,因为ssh操作不直观。针对线上代码调整一般存储如下步骤:

紧急修改

  1. 线上 git clone xxxx
  2. 线上 vim xxxx
  3. 线上 确保无误后 git commit -a
  4. 线上 git push
  5. 本地 git pull
  6. 本地 git push
  7. 线上 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 解决了如下问题:

  1. 自带服务器太弱:Flask/Django 自带服务器只能开发用,不能上线
  2. 扛不住并发:Gunicorn 可以开多个进程,同时处理几百人访问
  3. 稳定可靠:崩溃自动重启,适合 7×24 小时运行
  4. 搭配 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完全隔离        │
└───────────────────┘

参考

  1. 本地文档《flask部署手册readme.md》——若宽 ↩︎ ↩︎2 ↩︎3

本文由作者按照 CC BY 4.0 进行授权