启用 Nginx upstream 长连接需配置 keepalive、proxy_http_version 1.1 和 proxy_set_header Connection ''; 并匹配后端连接池容量,避免 Connection: close 响应及超时不一致导致失效。
使用 Nginx 保持长连接,能显著减少 TCP 握手和 TLS 协商开销,降低后端服务因连接频繁新建导致的超时、拒绝或响应失败,从而提升整体响应成功率。
启用 upstream 长连接
Nginx 默认每次请求都会新建后端连接,需显式配置复用连接。在
块中添加以下指令:
keepalive 32;
:设置每个 worker 进程与后端服务器之间最多缓存 32 个空闲长连接
keepalive_timeout 60s;
(可选):控制空闲连接在 Nginx 端的最大保留时间
keepalive_requests 1000;
(可选):单个长连接最多承载的请求数,防止单连接长期占用
注意:
必须配合
和
使用,否则后端可能主动关闭连接。
正确透传 Connection 控制头
HTTP/1.1 默认启用长连接,但 Nginx 作为代理时会重置
头。需显式清除该头,避免干扰后端判断:
proxy_http_version 1.1;
:强制使用 HTTP/1.1 协议通信
proxy_set_header Connection '';
:清空 Connection 头(不是设为 keep-alive),让后端自行决定是否复用
若后端是 HTTP/2,还需确保 Nginx 与后端走 TLS 并启用
,且不设置 Connection 相关头
匹配后端连接池容量
长连接数不能超过后端服务的连接池上限,否则引发拒绝连接(如 Spring Boot 的 Tomcat 默认 maxConnections=8192,但实际可用连接受线程数和 OS 限制):
估算公式:
例如:4 个 worker、keepalive=32 → 最多 128 连接;后端若为双实例、每实例连接池 200,则总量 400,128 在安全范围内
可通过
或后端监控指标(如 Tomcat 的 activeConnections)验证实际连接复用效果
规避常见失效场景
即使配置正确,以下情况仍会导致长连接无法复用:
后端返回
响应头(常见于异常响应或调试模式),Nginx 将立即关闭该连接
后端主动超时断连(如 Nginx
> 后端 idle timeout),需对齐两端超时设置
启用了
且响应体大,可能触发流式传输中断连接
SSL/TLS 会话复用未开启(尤其 HTTPS 回源),可在 upstream 中加
加速握手
不复杂但容易忽略,关键是 upstream 配置、协议版本、头部清理、后端容量四者协同生效。
upstreamkeepaliveproxy_http_version 1.1;proxy_set_header Connection '';Connectionhttp_v2upstream keepalive × worker_processes ≤ 后端总连接池容量 × 安全系数(建议 0.7)netstat -an | grep : | wc -l Connection: closekeepalive_timeoutproxy_buffering offssl_session_reuse on;