要让Nginx与后端真正复用TCP连接,必须同时配置upstream块内keepalive指令、location中proxy_http_version 1.1和proxy_set_header Connection '',且后端服务须支持长连接;缺一不可,否则仍频繁建连。

要让 Nginx 与后端服务之间真正复用 TCP 连接、避免每次请求都经历三次握手,关键不是“开了 keepalive 就行”,而是三项配置必须同时生效——缺一不可。
upstream 块里正确写 keepalive
keepalive 指令只能出现在 http 块下的 upstream 块内部,不能放在 server 或 location 里,否则启动直接报错:unknown directive "keepalive"。
- 每个 upstream 组只允许一个 keepalive 指令,例如
keepalive 32 - 它表示:每个 worker 进程对该后端最多缓存 32 个空闲连接
- 若你有 4 个 worker、1 台后端,理论最大空闲连接数是 128;建议初始值按 (预估峰值并发 ÷ worker_processes) × 1.2 计算
location 中强制 HTTP/1.1 + 清空 Connection 头
Nginx 默认用 HTTP/1.0 转发,即使 upstream 配了 keepalive,后端收到请求后仍会立即关闭连接——长连接形同虚设。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 必须在 proxy 所在的 location 块中添加:
proxy_http_version 1.1;proxy_set_header Connection ""; - 注意:
Connection ""是空字符串,不是"keep-alive",也不是"close" - 这两行必须成对出现,且仅写在 location 内(server 或 http 级别无效)
后端服务必须真正支持并维持长连接
Nginx 的 keepalive 连接池能否复用,最终取决于后端是否接受、保持并按时清理连接。一旦后端提前断连,Nginx 池中连接就变成“空转”,所有优化归零。
-
Spring Boot(Tomcat):确认
server.tomcat.connection-timeout ≥ 30s,且maxKeepAliveRequests不为 -1 或过小(建议设为 10000) -
Node.js(Express):检查是否误调
req.socket.destroy();默认支持 Keep-Alive,但显式销毁会破坏连接复用 -
Go(net/http):默认开启,但若代码中调用
SetKeepAlive(false)就会失效
keepalive_timeout 和 keepalive_requests 不作用于 upstream
这两个参数常被误用于 upstream 长连接控制,其实它们只影响 Nginx 与客户端之间的连接:
-
keepalive_timeout 65s:控制客户端连接空闲多久后关闭 -
keepalive_requests 1000:单个客户端连接最多处理多少请求后关闭 - 真正控制 upstream 连接池生命周期的是:
—keepalive(连接数上限)
— 后端自身的空闲超时(如 Tomcat 的 connectionTimeout)
— 建议 Nginx 的 keepalive_timeout 比后端小 5–10 秒,避免主动复用已失效连接










