Nginx平滑重载不丢连接的关键是upstream变更不破坏长连接复用:仅增删server、调weight等不影响活跃连接;需启用keepalive并合理配置数值;location中设proxy_http_version 1.1和Connection'';后端须支持并延长keepalive超时。

Nginx 平滑重载本身不会丢弃已有连接,关键在于 upstream 配置变更是否影响连接复用逻辑,以及 Nginx 与后端之间长连接是否真正被复用。只要 upstream 块中只是增删 server、调整 weight 或 max_fails 等参数(不涉及协议或连接池机制变化),配合正确的 keepalive 设置,reload 就不会导致已有请求中断或连接被强制关闭。
以下几点是确保 upstream 变更时“不丢连接”的实操重点:
upstream 配置本身无需特殊写法
-
nginx -s reload(或发送 HUP 信号)只重新加载配置文件并启动新 worker 进程,旧 worker 继续处理已建立的客户端连接和正在使用的后端连接; - upstream 中的 server 列表变动(如新增一台、下线一台、改权重)不影响当前活跃连接,Nginx 不会主动中断已有代理连接;
- 但注意:若修改了
keepalive值(如从keepalive 32改为keepalive 16),新 worker 会按新值建池,旧 worker 仍维持原有连接池,两者并存,不冲突。
必须启用并合理配置 upstream keepalive
这是防止后端连接频繁重建、避免 TIME_WAIT 泛滥、保障连接复用稳定的前提:
- 在 upstream 块中显式添加
keepalive N(如keepalive 32),N 表示每个 worker 进程最多缓存的空闲长连接数; - N 建议设为 16–64,略高于单个 worker 的平均并发请求数;过大易占满后端连接上限,过小则复用率低;
- 后端地址必须用 HTTP(如
server 10.0.0.20:8080),避免直连 HTTPS,否则绕过 keepalive 池。
location 中必须匹配协议与头控制
即使 upstream 启用了 keepalive,若代理层协议不匹配,Nginx 仍会拒绝复用:
- 设置
proxy_http_version 1.1,HTTP/1.0 不支持 Keep-Alive; - 设置
proxy_set_header Connection '',清空该 header,防止后端返回Connection: close导致连接被提前关闭; - 不要手动加
proxy_set_header Connection "keep-alive",Nginx 会自动处理,冗余设置反而可能干扰。
后端服务需配合连接生命周期
Nginx 的 keepalive 复用效果,最终取决于后端是否真正维持长连接:
- Spring Boot 默认开启 Keep-Alive,一般无需额外配置;
- Tomcat 需确认
maxKeepAliveRequests(建议设为-1表示不限制)和connectionTimeout(建议 > Nginx 的proxy_read_timeout); - 后端
keepAliveTimeout应大于 Nginx 的proxy_read_timeout,否则后端先断,Nginx 被动重建连接。
不复杂但容易忽略











