nginx重载时旧连接由原worker处理完毕,需配置worker_shutdown_timeout并协同proxy/client超时参数;keepalive_timeout等确保客户端长连接复用;upstream keepalive保障后端连接不中断。

Nginx 重载(nginx -s reload)时保持现有长连接不中断,本质不是“保持连接”,而是让旧连接继续由旧 worker 进程处理完——这是 Nginx 优雅重启机制的默认行为。关键在于不干扰已建立连接的生命周期,同时确保新配置对新连接立即生效。
保证旧连接自然走完,不被强制中断
旧 worker 进程在收到 QUIT 信号后,会停止接受新连接,但继续服务所有已建立的 TCP 连接(包括 HTTP/1.1 Keep-Alive 空闲连接、WebSocket、SSE、大文件上传中段等)。要让它真正“不受影响”,需满足:
-
配置
worker_shutdown_timeout(必须放在events块中),例如:events { worker_shutdown_timeout 45s; }这个值应略大于你业务中最长的单次请求耗时(含网络抖动余量)。设太短会导致活跃连接被杀;设太长会让旧逻辑滞留太久。
-
确保其他超时参数与之协同:
-
proxy_read_timeout和proxy_send_timeout≥worker_shutdown_timeout -
client_header_timeout和client_body_timeout≤worker_shutdown_timeout -
keepalive_timeout可保持默认(如 60s),它只管空闲连接释放,不影响活跃连接善终
-
客户端到 Nginx 的长连接持续可用
只要客户端支持 HTTP/1.1 或更高版本(现代浏览器、curl、移动端 SDK 均默认支持),且 Nginx 配置合理,空闲连接就能复用:
- 在
http块中启用并调优:keepalive_timeout 75s; # 建议 60–120 秒 keepalive_requests 1000; # 防止高频建连,减少 TIME_WAIT
- 避免在
location中误写proxy_set_header Connection close;,应使用:proxy_set_header Connection "";
Nginx 到后端的连接不受 reload 影响
reload 不会清空 upstream 连接池。只要你在 upstream 中配置了 keepalive,且配合 proxy_http_version 1.1 和 proxy_set_header Connection "",后端长连接就会持续复用:
upstream backend {
server 10.0.1.10:8080;
server 10.0.1.11:8080;
keepalive 32;
}
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
这类连接本身由 Nginx worker 自主管理,reload 后新旧 worker 可共享连接池(取决于是否启用 SO_REUSEPORT 或进程间 socket 共享),老连接不会因 reload 而断开。
敏感变更时主动控制影响面
对涉及鉴权、上游地址、TLS 版本等高风险配置更新,建议分步操作:
- 先在小流量节点执行 reload,观察日志中
X-Worker-Pid或自定义 header,确认旧连接是否按预期退出 - reload 前临时将该节点从负载均衡摘除(如返回 503),等待旧连接自然清空后再恢复流量
- 配合健康检查(如
/health接口返回 503 表示正在下线),避免请求打到尚未准备好的实例
不复杂但容易忽略











