Nginx长连接需客户端、Nginx、后端三方超时协同对齐:keepalive_timeout 30 25表示Nginx 30秒关连接并告知客户端最多保持25秒;proxy_read_timeout须≤该值且<后端超时;upstream keepalive值应匹配实际并发需求。

要让 Nginx 在负载均衡场景下真正发挥长连接优势,keepalive_timeout 不能只在 Nginx 配置里设一个数——它必须和客户端、Nginx 自身代理行为、后端服务三者协同对齐。错位会导致连接被意外关闭、复用失败、甚至请求超时。
客户端与 Nginx 的 keepalive_timeout 对齐
客户端(如浏览器、App SDK、HTTP 客户端库)是否复用连接,取决于它收到的响应头中 Keep-Alive: timeout=XX 或 HTTP/1.1 默认行为。Nginx 的 keepalive_timeout 第一个值控制自身关闭空闲连接的时间,第二个值(可选)会写入响应头告知客户端。
- 若只写
keepalive_timeout 30;:Nginx 在连接空闲 30 秒后关闭,但不发Keep-Alive头,客户端可能按自身默认策略(如 Chrome 通常为 5–60 秒)决定复用时长,存在提前断连风险 - 推荐写法:
keepalive_timeout 30 25;:Nginx 30 秒关连接,同时告诉客户端“请最多保持 25 秒”,留出 5 秒缓冲,避免客户端在最后一刻发请求时遭遇 RST - 对于 API 客户端(如 OkHttp、Apache HttpClient),需确认其是否尊重
Keep-Alive头;若不支持,应统一靠客户端侧配置连接池最大空闲时间 ≤ Nginx 的第一个 timeout 值
Nginx 与后端服务的 keepalive_timeout 对齐
Nginx 和后端(如 Spring Boot/Tomcat、Node.js、Go HTTP Server)之间是另一条 TCP 连接,这条链路的稳定性由 upstream keepalive 和后端自身的超时共同决定,而 keepalive_timeout(作用于 client → nginx)不直接影响此段——但间接影响很大。
- 后端的连接超时(如 Tomcat 的
connectionTimeout)必须 > Nginx 的proxy_read_timeout,否则后端可能先断连,Nginx 收到 reset 后无法复用该连接 -
proxy_read_timeout又应 ≤ Nginx 的keepalive_timeout(client → nginx 段),否则客户端还在等响应,Nginx 却已关闭连接,导致502 Bad Gateway - 典型安全区间示例:
→ Nginxkeepalive_timeout 60 55;
→proxy_read_timeout 45s;
→ 后端server.connection-timeout=50000(50s)
upstream keepalive 与连接池的实际约束
upstream 块里的 keepalive N 是每个 worker 进程维护的「空闲连接池大小」,它和 keepalive_timeout(client 侧)无直接数值关系,但逻辑上需匹配流量特征:
- 若后端每秒处理 100 请求,平均响应耗时 200ms,则单个 worker 理论需至少
100 × 0.2 = 20条空闲连接来支撑复用;设keepalive 32是合理起点 - 该值不是越大越好:每条空闲连接占用约 4–8KB 内存;若设为 200 而实际并发连接仅 30,会造成内存浪费且延迟回收失效连接
- 当连接池满时,Nginx 仍会新建连接,但不会复用——此时
keepalive_timeout对 client 侧的意义就大打折扣,因为后端连接频繁重建,整体长连接收益下降
全链路对齐检查清单
上线前建议逐项确认:
- 客户端发起请求时带
Connection: keep-alive(HTTP/1.1 默认) - Nginx server 块启用
proxy_http_version 1.1并清空 connection 头:proxy_set_header Connection "" - Nginx
keepalive_timeout第二个值 ≤ 客户端连接池最大空闲时间 - Nginx
proxy_read_timeoutconnectionTimeout,且proxy_read_timeout≤keepalive_timeout第一个值 - upstream 的
keepalive N≥ 单 worker 预估峰值并发连接数 × 平均响应时间(秒) - 通过
netstat -an | grep :8080 | grep ESTAB | wc -l观察后端连接数是否稳定在keepalive × worker_processes附近,而非持续增长



















