轮询负载均衡必须显式配置KeepAlive才能复用连接、降低建连开销、提升吞吐,关键在于稳住客户端到Nginx、Nginx到后端、后端服务三段连接:第一段设keepalive_timeout 60s和keepalive_requests 500–1000;第二段在upstream中配keepalive 32,并在location中设proxy_http_version 1.1和proxy_set_header Connection '';第三段需后端如Tomcat、Node.js、Go等调整超时参数并禁用Connection: close。

轮询负载均衡本身不自动启用长连接,必须显式配置 KeepAlive 才能复用连接、降低建连开销、提升吞吐。关键不在“开了轮询”,而在“三段连接都稳住复用”。
客户端到 Nginx 的连接保持
这是第一段,决定前端是否愿意复用连接:
- keepalive_timeout 设为 60s(常见范围 45–75s),表示 Nginx 允许客户端空闲多久仍维持连接;
- keepalive_requests 建议设为 500~1000,尤其适合单页应用或高频 API 场景,避免连接过早关闭;
- HTTP/1.1 下 Connection: keep-alive 是默认行为,无需手动添加响应头,加了反而可能干扰。
Nginx 到后端的连接池启用
这是第二段,也是最容易漏配的核心环节:
- 在 upstream 块中写 keepalive 32(常见值 16–64),代表每个 worker 进程最多维护 32 个空闲长连接;
- 在 location 中必须同时配置:
proxy_http_version 1.1(HTTP/1.0 不支持复用)
proxy_set_header Connection ''(清空客户端传来的 close 头,否则后端直接断连); - 缺任意一项,Nginx 都会退化为短连接,为每个请求新建 TCP 连接。
后端服务的协同配合
这是第三段,决定复用能否真正落地:
- Tomcat:connectionTimeout 至少设为 75000ms(即 75s),应大于 Nginx 的 keepalive_timeout;
- Node.js:检查 server.keepAliveTimeout 和 headersTimeout 是否足够;
- Go:http.Server.IdleTimeout 需 > Nginx 空闲超时;
- 所有后端响应头中不应含 Connection: close,且默认使用 HTTP/1.1 协议。
验证是否真正生效
不能只看配置,要从连接状态确认:
- 在 Nginx 机器上运行:
ss -tan | grep :8080 | grep ESTAB | wc -l,压测中连接数应在 keepalive 设定值附近波动(如设 32,观察值稳定在 25–32); - 在后端机器上运行:
ss -s | grep -i time,TIME_WAIT 数量应明显下降(通常降幅达 60% 以上); - 日志中可搜索 “reuse connection” 类关键词,确认复用行为被记录。



















