nginx平滑重载必须验证真实流量下无请求丢失、连接中断或后端重试:执行time nginx -s reload确认毫秒级耗时,用ss -s和stub_status观察active connections是否平稳,抓包验证keepalive连接不发rst/fin,检查新旧worker pid切换及lsof确认旧进程socket释放。

平滑重载(nginx -s reload)在高并发业务下必须验证是否真正“无感”——即不丢请求、不中断连接、不触发后端重试。它不是配完就完的事,而是要结合真实流量压力来测。
确认 reload 本身是否瞬时完成
先排除基础执行延迟问题:
- 执行
time nginx -s reload,观察耗时是否稳定在毫秒级(通常 - 用
strace -p $(pgrep nginx | head -1) -e trace=epoll_wait,accept4监控主进程,reload 期间不应出现长时间阻塞或大量 accept 失败
在压测中注入 reload 操作
不能只 reload 后看日志,要让 reload 发生在流量洪峰中:
- 用
wrk或locust持续发起 2–5 万并发请求(接近你线上峰值的 70%),持续运行 2 分钟以上 - 在压测进行到第 90 秒时,执行
nginx -s reload - 重点观察三类指标:
- 错误率突增:HTTP 502/504/连接拒绝(Connection refused)是否在 reload 后 1–3 秒内出现尖峰
- 响应延迟跳变:P95/P99 延迟是否瞬间拉高(> 500ms),说明部分请求被新旧 worker 切换影响
-
活跃连接断崖:通过
ss -s或 Nginx stub_status 的Active connections是否骤降再回升(表明连接被意外关闭)
验证连接复用与长连接行为
高并发场景大量使用 keepalive,reload 必须兼容:
- 客户端开启
Connection: keep-alive并复用 TCP 连接(如 wrk 默认启用-k) - 检查 reload 后,已建立的 keepalive 连接是否继续收发数据(可抓包看是否有 RST 或 FIN 突然出现)
- Nginx 配置中确保
keepalive_timeout和keepalive_requests设置合理(例如keepalive_timeout 60s;),避免 reload 触发连接过早回收
检查 worker 进程切换是否干净
reload 的本质是启动新 worker、优雅关闭旧 worker,这个过程必须可控:
- 执行 reload 前后,用
ps aux | grep nginx | grep -v grep查看 worker 进程 PID 变化;新 worker 应立刻 up,旧 worker 应在worker_shutdown_timeout(默认未设,靠worker_connections耗尽自然退出)内逐步退出 - 若旧 worker 长时间不退出(> 30 秒),说明有长连接未释放或后端 upstream 未响应,需检查
proxy_ignore_client_abort off和超时设置(proxy_read_timeout等) - 配合
lsof -p [old_worker_pid]查看旧进程是否还持有大量 socket,定位卡点











