nginx 与后端间长连接需在 upstream 中配置 keepalive n、location 中设 proxy_http_version 1.1 并清除 connection 头,依赖 keepalive_timeout、keepalive_requests 和后端支持共同实现连接复用。

Nginx 中处理后端连接的保持存活,核心是通过 upstream 模块的 keepalive 指令配合代理层协议控制来实现,不是简单开启某个开关,而是需要客户端、Nginx、后端服务三方协同配合。
关键在于区分两个层面的长连接:
- 客户端到 Nginx 的连接(由
keepalive_timeout控制) - Nginx 到后端服务器的连接(由
upstream keepalive控制)
本文聚焦后者——即 Nginx 与后端之间的连接复用。
启用后端长连接需满足三个基本条件:
- 在
upstream块中显式配置keepalive N(如keepalive 32),表示每个 worker 进程最多缓存 N 个空闲连接到该后端 - 在
location中设置proxy_http_version 1.1,因为 HTTP/1.0 不支持 Keep-Alive - 清除或重置 Connection 头:
proxy_set_header Connection "",避免 Nginx 自动添加Connection: close
连接池行为受以下参数影响:
-
keepalive_timeout(单位秒):空闲连接在连接池中保留的最大时长,超时后自动关闭。建议略小于后端服务的连接超时值(例如 Tomcat 的connectionTimeout) -
keepalive_requests(默认 100):单个长连接最多承载的请求数,达到后主动断开,防止连接老化或状态累积 -
max_conns:限制发往单台后端的最大并发连接数(含活跃+空闲),配合keepalive防止连接数失控
实际效果取决于后端是否真正支持并维持长连接:
- Spring Boot 默认启用 Keep-Alive;Tomcat 需确认
connectionTimeout和maxKeepAliveRequests设置合理(如设为-1表示不限制请求数) - 若后端返回
Connection: close或提前关闭连接,Nginx 会将其从连接池移除,并重新建连 - 可通过
nginx -t+ 日志中的upstream keepalive相关字段验证连接复用是否生效
不推荐依赖 ip_hash 或 least_conn 等算法来“保证”长连接稳定——它们只影响请求分发逻辑,不决定连接是否复用。真正起作用的是 keepalive 池和后端响应头的配合。











