启用upstream keepalive连接池需在upstream块中配置keepalive、keepalive_requests和keepalive_timeout,并在proxy_pass中设置proxy_http_version 1.1和proxy_set_header Connection '',同时确保后端支持HTTP/1.1持久连接。

启用 upstream 的 keepalive 连接池,能显著降低后端服务(如应用服务器)的 TCP 连接建立与释放开销,尤其在高并发、短连接场景下效果明显。关键不是简单加一行 keepalive,而是配对调整上游连接复用策略与客户端连接管理逻辑。
upstream 中正确配置 keepalive 连接池
Nginx 的 keepalive 指令必须放在 upstream 块内,且需配合 keepalive_requests 和 keepalive_timeout 协同使用:
- keepalive N:定义每个 worker 进程为该 upstream 保留的空闲长连接最大数量(非总连接数),建议设为 32–200,视后端实例数和并发量调整;
- keepalive_requests M:单个 keepalive 连接最多转发 M 个请求后主动关闭,默认 100,高负载下可适当调高(如 1000),避免连接长期占用但低频使用;
- keepalive_timeout T:空闲连接保持存活时间(秒),默认 60s,建议设为 15–30s,兼顾复用率与及时回收。
示例配置:
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 64;
keepalive_requests 500;
keepalive_timeout 20s;
}proxy_pass 必须禁用默认连接关闭行为
即使 upstream 启用了 keepalive,若 proxy_pass 默认发送 Connection: close,后端仍会断连。需显式开启 HTTP/1.1 并清理连接头:
- 添加
proxy_http_version 1.1;,确保使用 HTTP/1.1 协议(支持持久连接); - 添加
proxy_set_header Connection '';,清空 Connection 头,避免 Nginx 自动注入close; - 无需手动设
Keep-Alive头,Nginx 会根据 upstream 配置自动处理。
对应 location 示例:
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
# 其他常用头如 Host、X-Real-IP 可继续保留
}注意后端服务的 keepalive 兼容性
上游连接池能否真正复用,取决于后端是否接受并维持 HTTP/1.1 持久连接:
- Spring Boot 默认嵌入 Tomcat 支持 keepalive,但需确认
server.tomcat.connection-timeout不过短(建议 ≥ 30s); - Node.js(Express + http.Server)需确保未手动调用
res.end()后立即req.socket.destroy(); - Go 的
net/http默认启用 keepalive,但若启用了SetKeepAlivesEnabled(false)则需关闭。
可通过抓包或后端日志观察 Connection: keep-alive 响应头及连接复用情况验证。
监控与调优建议
连接池是否生效,不能只看配置,要结合指标判断:
- 观察 Nginx 的
ngx_http_upstream_module状态变量,如upstream_keepalive(当前空闲连接数); - 检查后端 TCP 连接状态:
ss -tan | grep :8080 | grep ESTAB | wc -l,对比优化前后连接数是否明显下降; - 压测时关注后端 TIME_WAIT 数量、SYN 重传率及平均建连耗时(如通过
tcpdump + tshark分析 handshake RTT)。
若空闲连接数长期为 0,常见原因是后端响应带 Connection: close,或客户端请求头含 Connection: close 未被清除。

















