Gunicorn worker数设为2×CPU核心数反而更慢,因其同步阻塞模型导致I/O等待时空转,上下文切换和资源争用加剧;推荐起始值workers=4或(CPU核心数+1),并优先选用gevent或UvicornWorker。

为什么Gunicorn worker数设成2×CPU核心数反而更慢
默认按 2 × CPU核心数 配置 workers 是常见误区。Gunicorn 的 worker 是同步阻塞模型,每个 worker 在等待网络 I/O(比如下游 HTTP 请求响应)时完全空转,不释放 GIL 也不让出 CPU —— 这和 Node.js 或 asyncio 完全不同。
实际压测中,worker 数超过 4~8 后,上下文切换开销、内存占用、连接池争用会明显拖慢整体吞吐。尤其当你的 Flask/FastAPI 应用大量调用外部 API(如支付、短信),大部分时间卡在 requests.get() 或 httpx.AsyncClient 等 I/O 操作上。
- 推荐起始值:从
workers = 4开始,配合worker_class = "gevent"或"uvicorn.workers.UvicornWorker"(后者仅限 ASGI 应用) - 若坚持用 sync worker,
workers = (CPU核心数 + 1)更稳妥,再通过worker_connections = 1000(需搭配eventlet或gevent)提升并发承载 - 别盲目加
max_requests来“防内存泄漏”——它只是强制重启 worker,掩盖了真正的问题(如全局变量累积、未关闭的数据库连接)
Nginx转发后 request.remote_addr 总是 127.0.0.1
这是 Nginx 默认不透传客户端真实 IP 导致的。Gunicorn 收到的请求始终来自 127.0.0.1,request.remote_addr 自然失效,影响日志、限流、地域判断等逻辑。
关键不是改 Gunicorn,而是确保 Nginx 正确设置 X-Forwarded-For 和 X-Real-IP,并让 Python Web 框架信任这些头。
- Nginx 配置里必须有:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - Flask 用户需启用
from werkzeug.middleware.proxy_fix import ProxyFix,并在 app 初始化后加app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1) - FastAPI 用户用
TrustAll或TrustHeaders中间件,且注意trusted_hosts参数要包含 Nginx 所在 IP(如["127.0.0.1", "10.0.0.5"]),不能只写["*"](不安全)
Gunicorn日志里满屏 “Connection reset by peer” 却没报错
这不是应用崩溃,而是客户端(浏览器、移动端、爬虫)在响应还没发完时主动断开了连接——比如用户切走页面、APP 进入后台、运营商中间设备 kill 空闲连接。Gunicorn 把它记为 warning,但 Python 层根本收不到异常,try/except 捕获不到。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
这类日志本身无需处理,但若比例突然升高(>5%),说明前端体验或网络链路有问题,而不是后端要改代码。
- 检查 Nginx 的
proxy_read_timeout和proxy_send_timeout是否过短(建议 ≥60s) - 确认 Gunicorn 的
timeout(默认30s)是否小于业务最长响应时间;若接口偶发耗时 45s,就该调高,否则 worker 会被强杀,留下 “Worker failed to boot” 类似错误 - 不要在视图函数里写
print()或手动 flush 日志来“确认执行到了哪”——这会干扰响应流,加剧 connection reset 概率
静态文件交给Nginx还是Python服务
绝对交给 Nginx。哪怕只放一个 favicon.ico,也别让 Flask 的 send_from_directory 或 FastAPI 的 StaticFiles 处理。
Python 进程每接一个静态请求,就要开文件句柄、读磁盘、构造 HTTP 响应头、走完整中间件链——而 Nginx 用零拷贝 sendfile() 系统调用,性能差一个数量级,还白白消耗 worker。
- Nginx 配置示例:
location /static { alias /var/www/myapp/static/; expires 1y; add_header Cache-Control "public, immutable"; } - 确保
alias路径末尾有斜杠,且与 Python 中url_for("static", filename="...")的路径前缀一致(如都用/static/) - 如果用了 CDN,把
expires改成max-age=31536000,并确保源站 Nginx 不加Cache-Control: no-cache覆盖它
最易被忽略的是:开发时用 python -m http.server 或 Flask 内置 server 跑静态没问题,一上生产还沿用同一套路径逻辑,结果所有图片 CSS JS 全走 Python,QPS 直接腰斩。上线前务必核对 Nginx 的 location 规则是否生效、是否覆盖了所有静态资源路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










