如何避免 Nginx 平滑重载引发的后端流量暴冲
通过配置 worker_shutdown_timeout 参数,可以强制 nginx 在收到信号后等待现有连接处理完毕再退出,从而避免新进程启动时瞬间承接所有积压请求导致的后端压力激增。

为什么默认行为会导致流量集中
Nginx 的平滑重载(Reload)机制中,旧版 Worker 进程在收到 HUP 信号后会立即关闭监听端口并停止接受新的 TCP 连接。如果此时没有设置优雅退出的超时时间,旧进程会尝试立即终止正在处理的长连接或快速切断短连接,导致大量请求被拒绝或重连到尚未完全准备好的新 Worker 进程上,造成后端 Upstream 在短时间内接收到远超正常水平的并发请求。

events {
worker_connections 1024;
}
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
上述配置是标准的 Nginx 结构。当执行 nginx -s reload 时,主进程生成新的配置文件并启动新的 Worker 进程。旧的 Worker 进程由于未配置 worker_shutdown_timeout,会在关闭监听后立即进入快速退出流程。对于正在进行的 HTTP 请求,Nginx 可能会直接发送 RST 包或者丢弃数据包,客户端浏览器或负载均衡器检测到连接中断后会立即重试,这些重试流量全部涌向刚刚启动、连接池尚未建立的新 Worker,进而转发给后端服务器,形成流量尖峰。
基于 worker_shutdown_timeout 的具体影响
设置 worker_shutdown_timeout 后,旧 Worker 进程在关闭监听端口后,不会立即退出,而是继续处理已有的连接,直到达到设定的超时时间或所有连接关闭。这为新旧进程的过渡提供了缓冲期,确保流量是逐步迁移而非瞬间切换。

events {
worker_connections 1024;
worker_shutdown_timeout 30s;
}
在 events 块中添加 worker_shutdown_timeout 30s; 配置。这意味着当 Nginx 执行重载时,旧的 Worker 进程在停止接受新连接后,最多保留 30 秒的时间来处理已建立的连接。在这 30 秒内,旧进程依然活跃,能够消化掉部分存量请求。新进程启动后,随着旧进程的逐渐退出,流量平稳地转移到新进程上。这种机制有效避免了后端 Upstream 因瞬时高并发而崩溃的风险,确保了服务的高可用性。











