调优keepalive_timeout的核心目标是平衡连接复用与资源释放,需协同upstream keepalive、proxy_http_version 1.1及后端keep-alive配置,避免502错误和空闲堆积。

调优 keepalive_timeout 的核心目标不是单纯“设大”,而是让 Nginx 与上游(如后端应用服务器)维持足够稳定的长连接,避免频繁 TCP 握手和 TLS 协商开销,同时防止连接空闲堆积、占用过多资源。关键在于匹配上游服务的 keepalive 能力和实际请求节奏。
确认上游是否真正支持并启用长连接
很多后端(如 Spring Boot、Node.js、Gunicorn)默认不开启或限制 keepalive,Nginx 单方面延长 timeout 没用,甚至导致连接被上游主动关闭后出现 502 Bad Gateway 或 upstream prematurely closed connection 错误。
- 检查上游服务配置:例如 Spring Boot 需显式设置
server.tomcat.connection-timeout=-1(禁用超时)+server.tomcat.keep-alive-timeout=60;Node.js HTTP Server 需设置server.keepAliveTimeout = 60000 - 用
curl -v http://upstream/查看响应头是否有Connection: keep-alive,且无Connection: close - 抓包验证:用
tcpdump或 Wireshark 观察是否复用同一 TCP 连接发送多个请求
合理设置 Nginx 的 keepalive_timeout 和 upstream keepalive 指令
Nginx 有两个层级的 keepalive 控制:HTTP 层面向客户端的 keepalive_timeout,以及 upstream 层面向后端的 keepalive(连接池大小)和 keepalive_requests(单连接请求数)。三者需协同:
-
keepalive_timeout 75;—— 建议 60–90 秒,略小于上游的 keep-alive timeout(如上游设 60s,则 Nginx 设 55s),避免 Nginx 主动关连接而上游还等着复用 -
upstream backend { ... keepalive 32; }—— 开启连接池,值建议为并发连接数的 1/4~1/2(如峰值 QPS 1000、平均响应 100ms,理论并发约 100,keepalive 设 16–32) - 在 location 中启用长连接复用:
proxy_http_version 1.1;+proxy_set_header Connection '';(清空 Connection 头,避免传close)
监控连接复用效果,而非盲目调大
真正有效的优化要看指标,不是数值本身:
- 观察
nginx_stub_status中Active connections与Reading/Writing/Waiting比例,若 Waiting 高但 Writing 低,说明连接空闲多、复用率低 - 用
ss -tnpo | grep :80 | grep ESTAB | wc -l查看当前 ESTABLISHED 连接数,对比upstream keepalive设置是否被充分利用 - 检查 Nginx error log 是否有
upstream sent too big header或recv() failed (104: Connection reset by peer)—— 常是上下游 timeout 不一致所致
注意 TLS 握手损耗的叠加影响
若上游启用了 HTTPS,TLS session resumption(会话复用)比 TCP keepalive 更关键。仅靠延长 keepalive_timeout 无法规避 TLS full handshake:
- 确保上游 TLS 支持
session tickets或session cache,并在 Nginx upstream 中启用:proxy_ssl_session_reuse on; - 避免在 proxy_pass 中使用变量动态域名(如
proxy_pass https://$host),会导致 SSL session 无法复用 - 对高安全要求场景,可结合
ssl_session_cache shared:SSL:10m+ssl_session_timeout 4h提升复用率











