Nginx 中 nginx.conf 的 upstream 连接池参数优化

作者:袖梨 2026-07-13
要让 Nginx upstream 连接池真正复用长连接,必须协同配置 keepalive(按后端能力×0.6~0.8÷worker数设定)、keepalive_requests(500~5000)、keepalive_timeout(比后端idle timeout小5~10秒),并在location中显式设置proxy_http_version 1.1和proxy_set_header Connection '',且keepalive指令须严格置于upstream块内。

要让 Nginx 的 upstream 连接池真正复用长连接、降低建连开销和后端压力,不能只写一行 keepalive 32。必须协议、头部、连接池三者对齐,参数协同调优,并结合后端实际能力设置。

keepalive 数值:按后端单实例能力反推

它表示每个 worker 进程为该 upstream 中每台后端服务器最多缓存的空闲长连接数,不是总连接上限,也不等于并发数。

  • 公式建议:keepalive ≈ 后端单实例稳定并发连接数 × 0.6~0.8 ÷ worker 进程数
  • Tomcat 默认 maxConnections=200,4 个 worker → 推荐设 keepalive 3248
  • Node.js / Go 类轻量服务,单实例稳撑 1000 并发、8 个 worker → 可设 keepalive 96
  • Windows 或内存受限环境,32~64 是安全起点;避免盲目设 1000+,易触发 fd 耗尽或连接被后端 RST

配套参数必须同步生效

仅配置 keepalive 不起作用。以下三项缺一不可:

  • keepalive_requests 1000;:单个空闲连接最多转发 1000 次请求后关闭,默认 100 太保守,API 场景推荐 500~5000
  • keepalive_timeout 30s;:空闲连接在池中保留时间,必须比后端 idle timeout 小 5~10 秒(如 Tomcat connectionTimeout=60s,Nginx 设 30~45s)
  • proxy_http_version 1.1;proxy_set_header Connection "";:必须放在 location 块中,否则 Nginx 仍用 HTTP/1.0 短连接发请求

位置与语法必须严格合规

keepalive 指令只能出现在 upstream { } 块内,且必须在 http 块下定义。

  • 错误写法:server 10.0.1.10:8080 keepalive 64; —— keepalive 必须独立成行
  • 错误位置:嵌套在 serverlocation 内 → 启动报错 unknown directive "keepalive"
  • 正确结构:
    upstream api_backend {    server 10.0.1.10:8080;    server 10.0.1.11:8080;    keepalive 48;}

验证是否真正生效

配置完不等于跑通,需实测确认连接复用状态:

  • 运行 ss -tan | grep :8080 | grep ESTAB | wc -l(替换为你的后端端口),观察连接数是否稳定在预期范围,而非持续增长或剧烈波动
  • 压测对比开启前后:后端 TIME_WAIT 数量下降、P95 延迟降低、建连耗时减少
  • 检查后端响应头是否含 Connection: keep-alive;若返回 close 或缺失,说明中间有设备干扰或后端未配合

相关文章

精彩推荐