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