nginx长连接负载均衡需配置上游keepalive连接池、least_conn调度算法及websocket/grpc协议适配。具体包括:1. upstream中设keepalive 32并配合http/1.1与connection头清理;2. 启用least_conn实现连接数感知调度;3. websocket需透传upgrade头,grpc需启用http/2。

要让 Nginx 负载均衡真正支持长连接集群共享,关键不是“让所有后端共享同一个 TCP 连接”,而是让 Nginx 与每个后端之间**各自维护稳定、可复用的长连接池**,同时把客户端的长连接请求**智能、均衡地分发到连接负载更轻的后端节点上**。这本质上是“连接感知型”调度,而非连接透传或跨节点共享。
1. 启用上游长连接池(核心基础)
在 upstream 块中配置 keepalive,它定义的是 Nginx 每个 worker 进程与每个后端服务器之间最多保持多少个空闲长连接:
-
keepalive 32;表示每个 worker 对每台后端最多缓存 32 个空闲连接(非总连接数) - 该值需略高于后端单节点平均并发连接数 × 0.8~1.2,过小会频繁建连,过大浪费内存
- 必须配合
proxy_http_version 1.1和清除Connection头,否则连接无法复用
2. 使用 least_conn 调度算法(避免连接倾斜)
长连接生命周期长,轮询(round-robin)容易导致某些后端堆积大量连接而其他节点闲置。应启用连接数感知调度:
- 在
upstream中添加least_conn; - Nginx 会实时统计各后端当前活跃连接数,新请求优先转发给连接数最少的节点
- 这对 WebSocket、gRPC、API 网关等长时连接场景效果显著,实测连接分布偏差可从 >50% 降至
3. 同步超时设置,防止连接提前中断
客户端、Nginx、后端三端的 keepalive 超时需形成合理梯度,避免中间层主动断连:
- 客户端侧:HTTP 请求头带
Connection: keep-alive(现代浏览器默认) - Nginx 侧:
keepalive_timeout 75s;(放在 http 或 server 块) - 后端侧:如 Tomcat 的
connectionTimeout="90000",需 > Nginx 的proxy_read_timeout - 推荐组合:
proxy_read_timeout 60s;<keepalive_timeout 75s;< 后端 idle timeout
4. 针对 WebSocket / gRPC 的特殊适配
普通 HTTP 长连接靠 Connection: keep-alive 即可,但 WebSocket 和 gRPC 需显式协议升级支持:
- WebSocket 必须透传
Upgrade和Connection: upgrade头 - 配置
map $http_upgrade $connection_upgrade { default upgrade; '' close; } - 在 location 中设置:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection $connection_upgrade; - gRPC(HTTP/2)需开启
http2监听,并确保proxy_pass使用 https:// 或 http2 协议前缀











