提升Nginx反向代理连接复用需三者齐备:upstream中配置keepalive连接池、proxy层启用HTTP/1.1并清除Connection头、后端服务支持长连接;缺一不可。

要提升 Nginx 反向代理到后端的连接复用效率,关键不是“开了 keepalive 就行”,而是 upstream 与 proxy 层协同生效——仅在 upstream 块写 keepalive 32 不起作用,必须三者齐备:连接池定义、协议升级、请求头清理。
upstream 块中必须声明 keepalive 连接池
这是复用的物理基础。Nginx 默认对每个请求都新建后端 TCP 连接,不缓存空闲连接。需显式启用连接池:
-
keepalive N:每个 worker 进程最多缓存 N 个空闲长连接(非总连接数)。建议值 = 后端单实例稳定并发数 × 0.6~0.8。例如后端 Tomcat
maxConnections=200,可设为120~160 -
keepalive_requests N:单个 keepalive 连接最多承载 N 次请求后主动关闭。默认 100 易导致频繁断连,生产环境推荐
1000~10000(取决于后端稳定性) -
keepalive_timeout Ns:空闲连接在池中保留时长(秒)。必须小于后端服务的 keepalive timeout(如 Nginx 设 60s,后端至少设 75s),推荐
30s~60s
proxy 上下文中强制启用 HTTP/1.1 并清除干扰头
即使 upstream 配了 keepalive,若请求仍走 HTTP/1.0 或携带 Connection: close,Nginx 会绕过连接池直接建新连接:
- proxy_http_version 1.1:必须显式声明,HTTP/1.0 不支持 keepalive
-
proxy_set_header Connection '':清空客户端传来的 Connection 头(如
close),避免误传给后端导致其主动断连 - 可选但推荐:
proxy_set_header Host $host和proxy_set_header X-Real-IP $remote_addr,保持原始上下文
确保后端服务真正支持并维持长连接
Nginx 的 keepalive 只控制“发出端”,后端才是连接生命周期的最终决定者:
- 后端响应头中应含
Connection: keep-alive(HTTP/1.1 默认行为,一般无需手动加) - 检查后端配置:Tomcat 的
connectionTimeout应 ≥ Nginx 的keepalive_timeout;Node.js 的server.keepAliveTimeout、Go 的http.Server.IdleTimeout同理 - 避免使用禁用 keepalive 的老服务(如某些 IIS 默认配置或旧版 PHP-FPM)
验证是否真正复用而非“纸面配置”
不能只看配置文件,要从连接状态和流量行为确认:
- 用
ss -tan | grep :后端端口 | grep ESTAB | wc -l观察连接数是否稳定在keepalive设定值附近(如设 32,压测中维持在 25~32) - 用
tcpdump -i any port 后端端口 -nn -c 100抓包,查看是否有大量重复 SYN/SYN-ACK(未复用典型特征) - 对比开启前后:TIME_WAIT 数量是否下降、P95 延迟是否降低 10%~40%、TPS 是否提升 20%~100%+



















