Nginx upstream keepalive 真正生效需 upstream 连接池、HTTP/1.1 协议强制、后端长连接支持三者对齐:配置 keepalive N、keepalive_requests M、keepalive_timeout T;location 中设 proxy_http_version 1.1 和 proxy_set_header Connection ""; 后端 connectionTimeout 等需 ≥ Nginx keepalive_timeout;通过 ss、tcpdump 和 debug 日志验证复用。

要在 Nginx 中真正用好 upstream keepalive 实现后端长连接复用,核心不是加一行 keepalive 32,而是让 upstream 连接池、HTTP 协议行为、后端服务响应三者对齐。配错一个环节,连接就无法复用,压测时仍会出现大量 TIME_WAIT 或重复 SYN。
upstream 块内必须声明 keepalive 连接池
这是复用的物理基础。Nginx 默认对每个请求都新建后端 TCP 连接,不缓存空闲连接。需显式启用连接池:
-
keepalive N:每个 worker 进程最多缓存 N 个空闲长连接到该 upstream 的单台后端(不是全局总数);例如设keepalive 32,4 个 worker + 2 台后端,理论最大空闲连接为 4 × 2 × 32 = 256 条 -
keepalive_requests M:单个 keepalive 连接最多处理 M 次请求后主动关闭;默认 100 容易导致频繁断连,高并发下建议调至 500–1000,防止单连接长期低频占用 -
keepalive_timeout T:空闲连接在池中保留时长(秒);必须小于后端服务的空闲超时(如 Tomcat 的connectionTimeout),推荐设为 20–30 秒
proxy 层必须强制 HTTP/1.1 并清空 Connection 头
仅 upstream 配了 keepalive 不生效——Nginx 默认用 HTTP/1.0 转发,而 HTTP/1.0 不支持持久连接。后端收到请求后直接返回并关闭连接,keepalive 形同虚设。
- 在
location块中添加proxy_http_version 1.1;,强制升级协议版本 - 必须加
proxy_set_header Connection "";,清空客户端传来的Connection: close等干扰头,避免透传给后端导致其误判为短连接 - 无需手动设置
Keep-Alive响应头,那是客户端行为,Nginx 作为代理不生成该头
后端服务必须真正支持并维持长连接
Nginx 的 keepalive 只控制“发出端”,后端才是连接生命周期的最终决定者:
- 后端响应头中应含
Connection: keep-alive(HTTP/1.1 默认行为,一般无需手动加) - 检查后端配置:Tomcat 的
connectionTimeout应 ≥ Nginx 的keepalive_timeout;Node.js 的server.keepAliveTimeout、Go 的http.Server.IdleTimeout同理 - 避免错误响应(如 500、404)或 WAF 干预返回
Connection: close,这类响应会立即释放连接,无法复用
验证是否真正复用而非“纸面配置”
不能只看配置文件,要从连接状态和流量行为确认:
- 用
ss -tan | grep :后端端口 | grep ESTAB | wc -l观察连接数是否稳定在keepalive设定值附近(如设 32,压测中维持在 25–32) - 用
tcpdump -i any port 后端端口 -nn -c 100抓包,查看是否有大量重复 SYN/SYN-ACK(未复用典型特征) - 开启 Nginx debug 日志(
error_log logs/error.log debug;),搜索reuse connection或keepalive关键词,确认复用行为



















