要提升负载均衡性能,必须区分并正确配置upstream keepalive(控制Nginx与后端连接池大小)和client keepalive_timeout(控制Nginx与客户端连接时长);启用upstream keepalive需同时满足proxy_http_version 1.1、proxy_set_header Connection ''、keepalive N三项,且后端服务(如Tomcat)须配置合理的keepAliveTimeout。

要真正提升负载均衡集群性能,keepalive 配置不能只写一行 keepalive 32 就完事。关键在于分清“谁跟谁保持连接”,并让前后端行为对齐——否则配置等于没配。
明确两套 keepalive:别混为一谈
Nginx 里有两组完全独立的 keepalive 控制逻辑,作用对象不同,必须分开理解:
-
upstream keepalive:控制 Nginx 与后端服务(如 Tomcat、Spring Boot)之间的空闲长连接池大小,例如
keepalive 32;。它不控制时间,只管“最多留几个空闲连接待复用”。 -
客户端 keepalive_timeout:控制 Nginx 与浏览器/APP 等客户端之间连接保持多久,例如
keepalive_timeout 65s;。它影响前端复用率,但对后端连接复用毫无作用。
启用 upstream keepalive 的三要素缺一不可
只在 upstream 块里写 keepalive 32,Nginx 仍会为每个请求新建后端连接。必须同步满足以下三项:
- 显式启用 HTTP/1.1:
proxy_http_version 1.1; - 清除客户端传来的 Connection 头,防止继承
close:proxy_set_header Connection '';(注意是空字符串,不是"Keep-Alive") - 设置连接池容量:
keepalive 32;(建议值 = 单 worker 进程预期并发后端连接数 × 1–2 倍;通常 16–64 安全,超大流量可测压后调至 128)
后端服务必须配合,否则前功尽弃
Nginx 保持了连接,但后端如果主动断开,照样白搭。需检查:
- Tomcat:确认
server.xml中Connector启用了keepAliveTimeout(建议 ≥ 75s),且未设connectionTimeout过短(如 - Spring Boot 内嵌 Tomcat:通过
server.tomcat.connection-timeout=60000和server.tomcat.keep-alive-timeout=75000显式配置 - Node.js(Express/Koa):确保未禁用
keepAlive(HTTP Server 默认开启,但反向代理下需验证) - 健康检查请求:若用
health_check,务必使用 HTTP/1.1 并避免带Connection: close,否则会快速耗尽空闲连接池
验证是否真生效,别靠猜
上线后必须验证,方法直接有效:
- 看后端
ss -s | grep TIME_WAIT:开启 keepalive 后,TIME_WAIT 数量应明显下降(降幅 40%+ 是典型表现) - 开 Nginx debug 日志:
error_log /var/log/nginx/debug.log debug;,搜索keepalive connection reused或create new keepalive connection,确认复用行为 - 抓包比对:用 tcpdump 抓 Nginx 到后端的流量,观察相同 IP:Port 对是否复用 TCP 连接发送多个 HTTP 请求










