Gunicorn工作模式

1.gunicorn本质

gunicorn 配置:

1
worker_class = "uvicorn.workers.UvicornWorker"

本质是在 Gunicorn 作为 master 进程管理器 + Uvicorn 作为 ASGI worker 的组合模式。

2.核心架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            ┌───────────────┐
│ Gunicorn │ (master)
│ 进程管理/负载 │
└──────┬────────┘
│ fork
┌──────────┼──────────┐
│ │ │
┌────────────┐┌────────────┐┌────────────┐
│ Uvicorn ││ Uvicorn ││ Uvicorn │
│ Worker ││ Worker ││ Worker │
│ (ASGI) ││ (ASGI) ││ (ASGI) │
└────┬───────┘└────┬───────┘└────┬───────┘
│ │ │
▼ ▼ ▼
Async App Async App Async App
(FastAPI等) (FastAPI等) (FastAPI等)

3.为什么要这样配置

3.1 Gunicorn vs Uvicorn 角色分工

组件 职责
Gunicorn 多进程管理、负载均衡、优雅重启
Uvicorn ASGI server(事件循环 + 高性能IO)

👉 Gunicorn 本身是 WSGI server(同步模型)
👉 Uvicorn 是 ASGI server(异步模型)


3.2 为什么不用纯 gunicorn

默认:

1
gunicorn app:app

→ 使用 sync worker
→ 不支持 async(FastAPI / WebSocket / asyncio)


3.3 为什么不用纯 uvicorn

1
uvicorn app:app --workers 4

问题:

  • 进程管理弱(没有成熟的 master-worker 模型)
  • reload / graceful shutdown 能力较弱
  • 生产稳定性不如 Gunicorn

3.4 组合优势(生产推荐)

能力 gunicorn + uvicorn
多进程
async 支持
WebSocket
优雅重启
高并发

4.gunicorn推荐运行方式

4.1 命令行

1
2
3
4
gunicorn app:app \
-k uvicorn.workers.UvicornWorker \
-w 4 \
-b 0.0.0.0:8000

4.2 config.py

1
2
3
workers = 4
worker_class = "uvicorn.workers.UvicornWorker"
bind = "0.0.0.0:8000"

5.适用场景

5.1 必须使用该模式

  • FastAPI
  • Starlette
  • WebSocket服务
  • asyncio IO密集型服务

6.关键参数调优

6.1 worker 数量

1
workers = CPU核数 * 2 + 1

但对于 async:

1
workers = CPU核数

👉 因为 async worker 本身支持高并发


6.2 并发模型

1
worker_class = "uvicorn.workers.UvicornWorker"

底层:

1
asyncio + uvloop + httptools

6.3 timeout

1
timeout = 30

避免慢请求拖死 worker


6.4 keepalive

1
keepalive = 25

优化连接复用


7.部署架构

flowchart LR
    Client --> LB[Load Balancer / Nginx]
    LB --> Gunicorn
    Gunicorn --> Uvicorn1
    Gunicorn --> Uvicorn2
    Gunicorn --> Uvicorn3
    Uvicorn1 --> App
    Uvicorn2 --> App
    Uvicorn3 --> App
    App --> Redis
    App --> DB