nginx upstream keepalive 真正生效需协议(proxy_http_version 1.1)、头部(proxy_set_header connection '')、连接池(upstream keepalive n)三者严格对齐,缺一不可;并协同调优keepalive_timeout(须小于后端idle超时)、keepalive_requests(推荐500–5000),且后端必须支持长连接、禁用connection: close。

要让 Nginx 的 upstream keepalive 连接池真正提升后端连接复用率,不能只写一行 keepalive 32。必须协议、头部、连接池三者对齐,缺一不可,否则配置无效,复用率几乎为零。
必须配齐的三项核心配置
这三项是生效前提,任意一项缺失都会导致连接池不工作:
-
upstream 块内声明连接池大小:例如
keepalive 32;,表示每个 worker 进程最多缓存 32 个空闲连接到该后端(不是全局总数,也不是并发上限); -
location 中启用 HTTP/1.1:加
proxy_http_version 1.1;,HTTP/1.0 不支持持久连接,不设此项后端默认断连; -
清空 Connection 请求头:加
proxy_set_header Connection '';,防止客户端传来的Connection: close被透传给后端,触发主动关闭。
配套参数要协同调优
只设连接数不够,还需控制单连接生命周期,避免“老而不死”或“用完即弃”:
-
keepalive_timeout 30s;:空闲连接在池中保留时长,必须比后端 idle timeout 小 5–10 秒(如 Tomcat
connectionTimeout=60000ms,Nginx 设30s或45s); - keepalive_requests 1000;:单个连接最多处理 1000 次请求后主动释放,高并发 API 场景推荐 500–5000,避免因长期复用引发状态异常;
- 数值建议按后端能力反推:keepalive ≈ 后端单实例稳定并发 × 0.7 ÷ worker 进程数(例如后端撑 2000 连接、Nginx 有 4 个 worker,推荐设 32 或 48)。
后端服务必须配合支持
Nginx 保持了连接,但后端若主动关闭,复用就失败:
- Tomcat:确保
Connector中keepAliveTimeout ≥ Nginx 的 keepalive_timeout(单位毫秒),且未设置过短的connectionTimeout; - Node.js:检查
server.keepAliveTimeout和headersTimeout是否足够; - Go:确认
http.Server.IdleTimeout> Nginx 空闲超时; - 所有后端响应头中不应含
Connection: close,尤其注意错误响应、WAF 干预或调试开关开启时可能自动添加。
验证是否真复用,不靠猜
配置完成必须实测确认,仅看 nginx.conf 没用:
- 在 Nginx 机器执行:
ss -tan | grep :后端端口 | grep ESTAB | wc -l,压测中连接数应稳定在keepalive设定值附近(如设 32,观察值在 25–32 波动); - 在后端机器查:
ss -s | grep -i time,TIME_WAIT 数量应明显下降(通常降幅超 60%); - 抓包验证:
tcpdump -i any port 后端端口 -nn -c 100,若大量重复 SYN/SYN-ACK,说明未复用。











