要真正启用upstream长连接池,必须协议(HTTP/1.1)、请求头(Connection空值)与keepalive连接池三者对齐;需在upstream块中配置keepalive N、location中设proxy_http_version 1.1和proxy_set_header Connection "",并合理设置keepalive_timeout和keepalive_requests,最后通过ss命令及压测验证连接复用效果。

要让 Nginx 真正复用与后端的 TCP 连接,不能只写 keepalive 32 就完事。必须协议、请求头、连接池三者对齐,否则长连接就是纸面配置,压测时连接数仍会随 QPS 暴涨。
必须配齐的三项基础配置
缺一不可,否则 upstream keepalive 形同虚设:
-
启用 HTTP/1.1 协议:在
location或server块中添加proxy_http_version 1.1;。HTTP/1.0 不支持持久连接,不设此项,后端默认断连。 -
清空 Connection 请求头:加上
proxy_set_header Connection '';。否则 Nginx 可能把客户端传来的Connection: close转发给后端,触发主动关闭。 -
声明连接池大小:在
upstream块内设置keepalive 32;(建议值 16–64)。它表示每个 worker 进程最多缓存多少个空闲连接到该后端,不是全局总数。
Nginx与后端长连接生命周期控制
只设连接数不够,还需约束单连接“活多久”和“干多少活”,避免堆积或过早释放:
-
keepalive_timeout:建议设为 20–45 秒,且必须小于后端服务的空闲超时(如 Tomcat 的
connectionTimeout)。若 Nginx 想复用,后端已关,复用就失败。 - keepalive_requests:默认 100 易引发高频建连;高并发 API 场景建议设为 500–1000;React 类前端可设至 2000,覆盖一次完整页面交互链路。
连接池大小需匹配后端实际承载力
数值不能拍脑袋定,要结合后端能力反推,并排除常见干扰:
- 若后端单实例最大连接数为 2000,Nginx 有 4 个 worker,按 70% 安全水位反推:
2000 × 0.7 ÷ 4 ≈ 35,keepalive设 32 或 48 更稳妥。 - 后端返回
Connection: close(常见于错误响应、调试开关开启、WAF 干预),Nginx 会立即释放该连接,无法复用。需检查后端日志与响应头。 - 健康检查若过于频繁且未用 HTTP/1.1 + match 配置,会意外耗尽空闲连接;负载策略建议用
least_conn或hash $remote_addr,缓解连接倾斜。
用数据确认是否真正生效
别只看配置有没有写,要用观测手段验证效果:
- 在 Nginx 机器上执行:
ss -tan | grep :8080 | grep ESTAB | wc -l,压测中连接数应稳定在worker_processes × keepalive附近,而非随 QPS 持续上涨。 - 抓包观察连续请求是否复用同一源端口 → 目标端口组合;若每次都是新 SYN,说明没复用。



















