要真正提升负载均衡集群全链路效率,关键在于客户端→nginx→后端服务三段长连接全部稳定复用且行为协同:第一段由keepalive_timeout(60s)和keepalive_requests(500–1000)控制;第二段需upstream中配置keepalive 32、proxy_http_version 1.1及proxy_set_header connection '';第三段要求后端如tomcat、node.js等保持超时大于nginx设置且禁用connection: close;验证须通过ss命令观察estab连接数稳定、time_wait显著下降及debug日志确认复用。

要真正提升负载均衡集群的全链路效率,关键不是只在某一层“开了 keepalive”,而是让客户端→Nginx→后端服务三段连接全部稳定复用,且行为协同。配置错一个环节,长连接就形同虚设。
客户端到 Nginx 的长连接控制
这是第一段,决定前端是否愿意复用连接:
-
keepalive_timeout 设为 60s(或 45–75s 区间),表示 Nginx 允许客户端空闲多久不发请求仍保持连接;
-
keepalive_requests 建议调高至 500~1000,避免单连接刚处理几十个请求就被关闭,尤其对单页应用(SPA)或 API 调用密集场景更友好;
- 不必手动加 Connection: keep-alive 响应头,HTTP/1.1 下这是默认行为,加了反而可能干扰。
Nginx 到后端的连接池启用
这是第二段,也是最容易配错的核心环节:
- upstream 块中必须写
keepalive 32(数值按后端单实例并发能力 × 0.7 ÷ worker 进程数估算,常见值 16–64);
- 对应 proxy 上下文中必须配齐两项:
-
proxy_http_version 1.1(HTTP/1.0 不支持复用);
-
proxy_set_header Connection ''(清空客户端传来的 close 头,否则后端收到就断连);
- 缺任意一项,Nginx 都会绕过连接池,为每个请求新建后端 TCP 连接。
后端服务的长连接配合
这是第三段,决定复用能否真正落地:
- Tomcat:确保
connectionTimeout ≥ Nginx 的 keepalive_timeout(例如 Nginx 设 60s,Tomcat 至少设 75000ms);
- Node.js:检查
server.keepAliveTimeout 和
headersTimeout 是否足够;
- Go:确认
http.Server.IdleTimeout > Nginx 空闲超时;
- 所有后端响应头中不应含
Connection: close,且默认使用 HTTP/1.1 协议。
验证是否真正生效
别只看配置文件,要从实际连接状态判断:
- 在 Nginx 机器上执行:
ss -tan | grep :后端端口 | grep ESTAB | wc -l,压测中连接数应稳定在 keepalive 设定值附近(如设 32,观察值在 25–32 波动);
- 在后端机器上查:
ss -s | grep -i time,TIME_WAIT 数量应明显下降(降幅通常达 60% 以上);
- 开启 Nginx debug 日志,搜索
"reuse connection" 或
"free keepalive connection",确认复用日志高频出现。