必须同时配置upstream keepalive N、proxy_http_version 1.1和proxy_set_header Connection ''三者,缺一不可;仅配keepalive无效,因Nginx默认用HTTP/1.0转发且可能透传Connection: close导致后端断连。

要让 Nginx 与后端服务器之间真正复用 TCP 连接,不能只靠默认配置——必须显式启用 upstream 长连接,并配对关键 HTTP 协议参数。否则每请求新建连接,会显著增加系统开销和延迟。
在 upstream 块中启用 keepalive
这是最核心的一步,且必须写在 http 块内、upstream 定义中,不能放在 server 或 location 里:
-
keepalive N:N 是每个 worker 进程对单台后端保留的空闲长连接数(例如
keepalive 32) - 后端有 2 台、Nginx 有 4 个 worker,则最多缓存 32 × 2 × 4 = 256 个空闲连接
- 该值不是越大越好,需结合后端连接池容量(如 Tomcat 的
maxConnections)设置,避免后端拒绝连接
配套设置 HTTP/1.1 和 Connection 头
仅写 keepalive 不生效,因为 Nginx 默认用 HTTP/1.0 转发,而 HTTP/1.0 不支持长连接:
- proxy_http_version 1.1:强制升级到 HTTP/1.1 协议
-
proxy_set_header Connection "":清空客户端传来的
Connection: close等干扰头,防止后端误判为短连接 - 这两项必须同时出现在
location或server的 proxy 相关配置中
区分清楚两类 keepalive 参数
很多人混淆了控制「客户端→Nginx」和「Nginx→后端」的参数:
- keepalive_timeout 和 keepalive_requests:只影响浏览器到 Nginx 的连接,和后端无关
-
upstream keepalive N:专用于 Nginx 到后端服务的连接复用,生命周期由后端决定(如 Node.js 的
server.keepAliveTimeout) - 若后端未开启长连接支持(如 Spring Boot 默认关闭),Nginx 即使配全也会收到
upstream prematurely closed connection
验证是否生效
光看配置没用,得通过实际行为确认:
- 查 Nginx error log:没有频繁出现
upstream prematurely closed connection或connect() failed - 用
ss -tan | grep :8080 | wc -l观察到稳定存在的 ESTABLISHED 连接(而非瞬时飙升后归零) - 后端服务监控其活跃连接数是否趋于平稳,而非随 QPS 线性增长


















