bigywater.tech
Flask · 172

Gunicorn 启动 Flask

gunicorn 命令该怎么写?工厂函数怎么传?配置有几个来源、谁覆盖谁?不重启服务怎么调 worker 数?这篇用真实的 gunicorn 把每种写法与信号的结果跑一遍。

命令行 > 环境变量 > 配置文件
gunicorn 配置来源的优先级,实测 worker 数 1、2、3
SIGTTIN / SIGTTOU
给 master 发信号运行时加或减一个 worker
--check-config
部署前检查配置与应用能否加载的选项

入口写法

实测 · 本机执行输出
  app:app(模块级的 app 变量)               → {"name":"module-level","pid":62361}
  "app:create_app()"(调用工厂)           → {"name":"default","pid":62365}
  "app:create_app('prod')"(带参数的工厂)   → {"name":"prod","pid":62367}
  模块不存在                              → 退出,['[2026-10-02 15:26:09 +0800] [62369] [ERROR] Shutting down: Master', '[2026-10-02 15:26:09 +0800] [62369] [ERROR] Reason: Worker failed to boot.']
  变量不存在                              → 退出,['[2026-10-02 15:26:11 +0800] [62385] [ERROR] Shutting down: Master', '[2026-10-02 15:26:11 +0800] [62385] [ERROR] Reason: App failed to load.']

上一篇:Flask Development Server 与生产服务器;下一篇:uWSGI 与 Flask。

配置的优先级

实测 · 本机执行输出
  只有配置文件                             → worker 进程数 3
  GUNICORN_CMD_ARGS 里写 --workers 2   → worker 进程数 2
  命令行 -w 1(同时有上面两者)                  → worker 进程数 1

unix socket

实测 · 本机执行输出
  curl --unix-socket → {"name":"module-level","pid":62449} | socket 文件权限: 0o777

用信号管理

实测 · 本机执行输出
  启动:worker 2 个
  发 SIGTTIN 后: 3 个
  发 SIGTTOU 后: 2 个
  发 SIGHUP 后:2 个,其中与 HUP 之前相同的 pid 0 个(旧 worker 被换掉了)

部署前检查

实测 · 本机执行输出
  合法:退出码 0
  变量不存在:退出码 1 | ["gunicorn.errors.AppImportError: Failed to find attribute 'nosuch' in 'app'."]

分步演示

Gunicorn 启动 Flask
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。gunicorn
    • 没有验证:SIGUSR2 的二进制热升级、配置文件里的钩子函数(on_starting、post_fork 等)、systemd 下的 Type=notify 与 socket activation、--reload 在开发时的行为、绑定多个地址
    京ICP备2026067502号-1京公网安备11010502063487号