Nginx超长连接负载均衡需分层控制生命周期、精准匹配协议特性并协同上下游:一要区分WebSocket/gRPC/SSE等协议配置透传与版本支持;二要梯度设置connect/send/read超时避免悬连;三要启用upstream keepalive并强制HTTP/1.1复用;四须对齐系统级keepalive_timeout与后端超时、K8s优雅终止及健康检查。

Nginx 负载均衡处理超长连接请求(如 WebSocket、gRPC、长轮询、SSE 或持续心跳的 API 连接),关键不是“延长所有超时硬扛”,而是分层控制生命周期、精准匹配各端行为、避免连接堆积与资源错配。重点在于让客户端、Nginx、后端三者在连接空闲、复用、关闭节奏上保持协同。
一、区分连接类型,配置对应协议支持
超长连接不等于“统一设大 timeout”,不同协议有完全不同的握手和保活机制:
-
WebSocket:依赖
Upgrade协议升级,必须透传Upgrade和Connection: upgrade头; -
gRPC(HTTP/2):需启用
http2监听,proxy_pass必须用https://或明确带http2前缀,且后端支持 HTTP/2; -
长轮询 / SSE:本质仍是 HTTP/1.1,靠
keep-alive+ 合理proxy_read_timeout控制等待窗口; -
普通长连接 API(如 Keep-Alive 接口):只需确保
Connection: keep-alive透传,不干扰复用链路。
二、收紧并梯度设置三类超时参数
超时不是越大越好,错位会导致连接“悬而不断”或“断得过早”:
-
proxy_connect_timeout 1–3s:建连失败快速释放 worker,防阻塞; -
proxy_send_timeout 10–20s:发完请求后,等后端接收完成的时间(尤其上传场景可略调高); -
proxy_read_timeout:按场景差异化设置——- 长轮询:设为业务最长等待时间 + 5–10s(如等 45s,则设 55s);
- WebSocket:可设为
86400(24 小时),但前提是后端真实支持长稳连接; - SSE:通常设 30–60s,配合服务端定期发送
:注释保活; - 普通 API:建议 60–90s,略大于后端心跳间隔。
三、启用 upstream keepalive 并强制复用链路
这是防止后端被压垮的底层保障:
- 在
upstream块中添加keepalive 32;(常见取值 16–64,按后端单节点并发均值 × 1.2 估算); - 对应
location中必须配置:proxy_http_version 1.1; proxy_set_header Connection "";
否则 Nginx 可能转发
Connection: close,导致后端拒绝复用; - 禁用
ip_hash或固定hash,避免连接长期绑定单点;改用least_conn;,让新请求落到当前连接数最少的后端。
四、系统级与后端协同兜底
单靠 Nginx 配置无法闭环,需上下游对齐:
- Nginx 的
keepalive_timeout(如75s)必须 < 后端connectionTimeout(如 Tomcat 设90000ms); - Kubernetes 环境下,Pod 退出前通过
preStop+terminationGracePeriodSeconds(建议 ≥30s)预留连接自然释放窗口; - 启用健康检查:
health_check interval=10s fails=3 passes=2,及时剔除无响应节点,避免请求打到僵死连接。
不复杂但容易忽略


















