Nginx upstream 中配置 keepalive 32 仅设连接池容量,需配合 proxy_http_version 1.1、proxy_set_header Connection '' 及后端支持才能实现长连接复用。

在 upstream 块中配置 keepalive 指令,是开启 Nginx 与后端服务器之间长连接复用的关键一步。它本身不启用长连接,而是定义连接池容量——即每个 worker 进程可缓存的空闲 HTTP/1.1 连接数。要真正生效,必须配合 proxy 层协议和头部控制。
upstream 块内添加 keepalive 参数
在 upstream 定义中直接写入 keepalive 指令,数值建议设为 16–64:
-
keepalive 32;表示每个 worker 进程最多维持 32 个到该 upstream 的空闲长连接 - 值过小(如 4)会导致连接频繁新建;过大(如 512)可能耗尽 socket 资源,尤其在多 upstream 或高并发时
- 无需为每个 server 单独配,它是作用于整个 upstream 组的连接池上限
proxy 层必须同步启用 HTTP/1.1 并清理 Connection 头
仅写 keepalive 32 不起作用。Nginx 必须以 HTTP/1.1 方式转发请求,并避免继承客户端的 Connection: close:
-
proxy_http_version 1.1;— 强制使用 HTTP/1.1 协议(keepalive 依赖此版本) -
proxy_set_header Connection '';— 清空客户端传来的 Connection 头,防止后端误判为短连接 - 推荐补充:
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,保持原始上下文
确认后端服务支持并维持 keepalive
Nginx 的 keepalive 只管“发出去的连接”,后端必须能接收、复用并合理保活:
- 后端响应默认应含
Connection: keep-alive(HTTP/1.1 下通常自动添加) - 检查后端 keepalive timeout 设置,建议不低于 Nginx 的
keepalive_timeout(默认 65s),避免单边断连 - 对 Tomcat、Node.js、Go 等常见服务,需确认未显式关闭 keepalive(如 Tomcat 的
connectionTimeout过短或disableUploadTimeout强制影响)
验证长连接是否实际复用
配置完成后,不能只看语法是否通过,要观察运行态行为:
- 执行
netstat -ano | findstr :,观察 ESTABLISHED 连接数是否稳定在几十个左右,而非随请求激增后快速归零 - 查看 Nginx access log 中
$upstream_addr字段,若反复出现相同 IP:PORT(如10.0.1.10:8080),说明连接被复用 - 用 curl 发送连续请求并加
-v,观察响应头是否含Connection: keep-alive,且 TCP 连接未重置











