提升Nginx后端连接复用效率需协调客户端、Nginx与后端三者节奏:合理设置upstream.keepalive(建议按后端单实例空闲连接数×1.2)、启用HTTP/1.1并清理Connection头、分层对齐超时参数、优先选用least_conn负载算法。

要提升 Nginx 负载均衡中后端连接的保持效率,关键不是“尽量多连”,而是让每个连接真正被复用起来、不闲置、不堆积、不超时断开。核心在于协调好客户端行为、Nginx 代理层配置和后端服务能力三者之间的节奏。
后端长连接池大小(keepalive)要匹配实际并发需求
Nginx 的 upstream.keepalive 参数控制每个 worker 进程与后端之间可缓存的空闲连接数。设得太小(如默认 0 或 5),会导致频繁建连;设得太大(如 256+),又可能撑满后端连接上限或浪费内存。
- 建议初始值按「后端单实例最大空闲连接数 × 1.2」设定,例如 Tomcat 默认 maxConnections=200,则 keepalive 可设为 240
- 注意:该值是 per-worker 的,若启用了 4 个 worker,实际最多可能建立 4×keepalive 条空闲连接
- 可通过 nginx -t && nginx -s reload 动态调整后观察 nginx_stub_status 中 Active connections 和 upstream connection stats 的变化
必须显式启用 HTTP/1.1 并清理 Connection 头
即使客户端发来 Keep-Alive 请求,Nginx 默认仍可能以 HTTP/1.0 转发,或携带 Connection: close,导致后端无法复用连接。
- proxy_http_version 1.1 是强制项,不可省略
- proxy_set_header Connection "" 用于清除 Nginx 自动添加的 Connection 头(避免传给后端造成歧义)
- 若涉及 WebSocket,还需额外设置
proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection "upgrade"
超时参数需分层对齐,避免“假断连”
连接中断往往不是因为真故障,而是各层超时设置错位造成的主动关闭。重点对齐三组时间:
- keepalive_timeout(客户端侧)应略小于后端服务的 idle timeout(如 Spring Boot 的 server.connection-timeout)
- proxy_read_timeout 应大于后端最长业务响应时间,但不宜超过 keepalive_timeout,否则连接可能在读取中被回收
- proxy_send_timeout 主要影响大文件上传或流式响应,一般设为 300s 已足够,过高易掩盖慢后端问题
优先选用 least_conn 算法应对长连接倾斜
轮询(round-robin)在长连接场景下容易失衡:先建立连接的后端持续接收复用请求,而新上线节点长期空闲。least_conn 则实时感知各后端当前活跃连接数,动态分配新连接。
- 配置方式简单:在 upstream 块内第一行写 least_conn;
- 搭配 max_conns 可防止单节点过载(例如
server 192.168.1.10:8080 max_conns=1024;) - 实测表明,在 5k+ 持久连接场景下,least_conn 比轮询降低连接数标准差达 65%


















