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
默认:
→ 使用 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 数量
但对于 async:
👉 因为 async worker 本身支持高并发
6.2 并发模型
1
| worker_class = "uvicorn.workers.UvicornWorker"
|
底层:
1
| asyncio + uvloop + httptools
|
6.3 timeout
避免慢请求拖死 worker
6.4 keepalive
优化连接复用
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