从配置方式到 Worker 选型,一文讲清楚 Gunicorn 如何搭配 uvicorn 部署 Python Web 应用
在开发阶段,你直接用 uvicorn main:app 就能跑起来。
但在生产环境中,你需要一个进程管理器来:
创建 gunicorn_config.py
# gunicorn_config.py
import multiprocessing
# 绑定地址和端口
bind = "0.0.0.0:8000"
# Worker 进程数(建议 CPU 核数 × 2 + 1)
workers = multiprocessing.cpu_count() * 2 + 1
# Worker 类(关键!)
worker_class = "uvicorn.workers.UvicornWorker"
# 超时设置
timeout = 120
# 日志配置
accesslog = "-"
errorlog = "-"
# 日志级别
log_level = "info"
启动命令:
gunicorn -c gunicorn_config.py main:app
所有参数写在命令里:
gunicorn \
main:app \
-w 4 \
-k "uvicorn.workers.UvicornWorker" \
-b "0.0.0.0:8000" \
--timeout 120
| 参数 | 含义 | 推荐值 |
|---|---|---|
-w / workers |
Worker 进程数量 | CPU 核数 × 2 + 1 |
-k / worker_class |
Worker 工作模式(核心!) | 见下方详细表格 |
-b / bind |
绑定地址:端口 | 0.0.0.0:8000 |
--timeout |
Worker 超时时间(秒) | 120 或 300 |
-c |
指定配置文件路径 | gunicorn_config.py |
worker_class 决定了 Gunicorn 的 Worker 用什么模式处理请求,
这是整个配置中最关键的一个参数。
一个 Worker 同时只能处理一个请求。
如果请求 A 在等数据库响应,这个 Worker 就被阻塞了,
请求 B 必须排队等待。
一个 Worker 可以同时处理多个请求。
当请求 A 在等 IO 时,Worker 切去处理请求 B。
高并发场景下效率远高于同步。
| worker_class | 说明 | 适用场景 |
|---|---|---|
sync(默认) |
同步 Worker,每个请求独占一个进程/线程 | Flask/Django 等 WSGI 应用;低并发、CPU 密集型任务 |
gevent |
异步 Worker,基于 gevent 协程库 | 高并发 I/O 密集型;长连接(WebSocket、聊天室) |
eventlet |
异步 Worker,基于 eventlet 协程库 | 同 gevent,I/O 密集型高并发 |
tornado |
Tornado 框架的 Worker | 已有 Tornado 应用的迁移场景 |
gthread |
线程 Worker | 需要线程并发的混合场景 |
uvicorn.workers.UvicornWorker |
Uvicorn ASGI Worker(最常用!) | FastAPI / Starlette(我们用的就是这个) |
uvicorn.workers.UvicornH11Worker |
Uvicorn + H11 纯 Python 实现 | 不需要 uvloop 时使用(兼容性更好) |
worker_class 必须设置为pip install "uvicorn[standard]" (包含 uvloop、httptools 等加速组件)
不同类型的项目升级,应该怎么选?
WSGI 项目继续用默认的 sync worker 即可。如果有大量长连接需求,可换为 gevent。
# Flask 默认即可
gunicorn app:app -w 4
# 或用 gevent 处理长连接
gunicorn app:app -w 4 -k gevent
ASGI 框架必须配合 UvicornWorker 才能发挥异步优势。
gunicorn main:app \
-w 4 \
-k "uvicorn.workers.UvicornWorker"
每个 worker 都是一个独立的 uvicorn 进程,Gunicorn master 负责在它们之间分发请求。
# 4 个 UvicornWorker 并发运行
gunicorn main:app -w 4 \
-k "uvicorn.workers.UvicornWorker"
# ↓ 等价于同时跑 4 个 uvicorn 进程
如果服务器环境不支持 uvloop(如某些 ARM 平台、Windows),用纯 Python 实现的 H11Worker 作为替代。
gunicorn main:app \
-w 4 \
-k "uvicorn.workers.UvicornH11Worker"
gunicorn main:app -w 4 跑 FastAPI,-k uvicorn.workers.UvicornWorker