优化nginx短连接开销的关键是启用upstream keepalive连接池,通过keepalive、keepalive_requests和keepalive_timeout参数调优实现长连接复用,并配合proxy_http_version 1.1与清空connection头,再选用least_conn算法均衡连接分布。

优化 Nginx 负载均衡器处理短连接频繁创建的开销,核心不是“加速建连”,而是**让连接复用起来**——把原本每个请求都新建 TCP 连接的短连接模式,转变为复用已有连接的长连接模式。Nginx 本身不维护传统内存池,但通过 upstream keepalive 连接池机制,能显著抑制三次握手、TLS 握手、TIME_WAIT 堆积和系统调用开销。
启用并调优 upstream keepalive 连接池
这是最关键的一步。仅靠 proxy_http_version 或头部设置无法生效,必须在 upstream 块中显式配置:
- keepalive N:每个 worker 进程为该后端(IP+端口)缓存的空闲长连接数。不是总连接数,而是 per-worker per-server。建议从 32 开始,高并发可设为 64–128;过高易导致后端端口耗尽或连接堆积
- keepalive_requests M:单个长连接最多转发 M 次请求后主动关闭。默认 100,短连接场景下可提高至 500–2000,避免因计数到限而无谓断连重连
- keepalive_timeout T:空闲连接保留在池中的秒数。需比后端服务的 keepalive timeout 至少短 5–10 秒(例如 Nginx 设 20s,后端 Tomcat 设 30s),否则连接可能被后端先关闭
示例:
upstream api {server 10.0.3.20:8080;
keepalive 64;
keepalive_requests 1000;
keepalive_timeout 20s;
}
配套 proxy 层协议与头部设置
upstream 启用 keepalive 后,还需确保 Nginx 主动使用 HTTP/1.1 并清除干扰头,否则仍会退化为短连接:
- proxy_http_version 1.1:强制升级协议,是持久连接的前提
- proxy_set_header Connection "":清空 Connection 头,防止 Nginx 自动注入 close 或被中间设备误判
- 无需手动加 Keep-Alive 头,Nginx 会根据 upstream 配置自动协商
对应 location 示例:
location /v2/ {proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
}
选用 least_conn 负载均衡算法
在长连接复用场景下,轮询(round robin)容易造成连接分布不均:部分后端因连接复用率高而堆积大量长连接,其余节点却空闲。least_conn 算法优先将新请求分发给当前活跃连接数最少的后端,天然适配连接复用逻辑:
- 在 upstream 块中直接添加 least_conn; 指令
- 实测显示,在 API 网关类高频短请求场景中,该策略可使各后端连接数标准差降低 50% 以上
- 若需会话保持,ip_hash 仍可用,但要注意其与 keepalive 的协同效果较弱,慎用于纯短连接优化目标
确认后端服务支持并合理配置 keepalive
上游连接池能否真正复用,最终取决于后端是否接受并维持 HTTP/1.1 持久连接:
-
Spring Boot(Tomcat):检查
server.tomcat.connection-timeout,建议 ≥ 30s;避免在过滤器中提前关闭响应流 -
Node.js(Express):确保未在响应后调用
req.socket.destroy();使用res.end()即可 -
Go(net/http):默认启用 keepalive,但若显式调用
SetKeepAlivesEnabled(false)则需关闭该设置 - 可借助
ss -tan | grep :8080 | wc -l对比优化前后后端 ESTABLISHED 连接数变化,验证是否生效











