Nginx平滑重载时长连接不中断需满足:客户端和服务端均启用keepalive、禁用干扰模块、压测小静态文件;通过tcpdump抓包验证无RST/FIN突增,结合stub_status、ss和lsof确认连接连续性及worker优雅退出。

测试 Nginx 平滑重载过程中线上长连接是否中断,核心是验证 keepalive 连接在 nginx -s reload 瞬间是否被强制关闭(如发 RST/FIN)、数据收发是否连续、客户端无感知。不能只看命令是否成功,而要从连接生命周期本身抓证据。
确认长连接环境已就绪
测试前必须确保压测流量真实复用 TCP 连接:
- 客户端启用 keep-alive:wrk 默认带
-k参数;curl 需显式加-H "Connection: keep-alive" - Nginx 配置中明确设置
keepalive_timeout 60s;和keepalive_requests 1000;,避免 reload 触发连接提前回收 - 禁用可能干扰的模块:关闭 access_log、gzip、sendfile(或统一开启),排除缓存与压缩逻辑干扰
- 压测目标为小静态文件(如 1KB HTML),绕过后端代理和动态逻辑,聚焦 Nginx 自身连接管理行为
用 tcpdump 抓包验证连接状态
这是判断是否中断最直接、不可替代的手段:
- 在客户端或 Nginx 服务器侧执行:
tcpdump -i any -w reload.pcap port 80 and host [nginx_ip] - 在 wrk 压测运行中执行
nginx -s reload,立即停止抓包(几秒内即可) - 用 Wireshark 或 tshark 分析 pcap 文件,重点检查 reload 时间点前后:
- 是否存在大量 RST 包(说明连接被粗暴终止)
- 是否有 FIN 包突增(旧连接非自然关闭)
- 是否存在 SYN 重传或 TCP 重传激增(连接断开后重连)
结合 stub_status 与 ss 实时观察连接变化
抓包之外,需同步监控活跃连接的连续性:
- 持续轮询
/nginx_status(需已启用 stub_status),关注Active connections是否出现“断崖式下跌→缓慢回升”——这表示连接被批量关闭 - 执行
ss -s查看 socket 统计,reload 后若orphan数量陡增、tw(TIME_WAIT)异常堆积,提示连接未优雅释放 - 对比 reload 前后
Reading / Writing / Waiting三态分布:Waiting 长时间高位滞留,说明新 worker 未及时接管请求
检查 worker 进程与 socket 持有状态
连接中断常源于旧 worker 无法及时退出:
- reload 前后执行
ps aux | grep nginx | grep worker,确认新 worker PID 已启动、旧 worker 是否在worker_shutdown_timeout(建议设为 5–10s)内逐步退出 - 若旧 worker 长时间存活(>30 秒),用
lsof -p [old_pid] | grep sock查其是否仍持有大量 socket,定位卡点(如 upstream 未响应、proxy_read_timeout 过长) - 查看 error.log 中是否有
gracefully shutting down和start worker processes日志,确认 reload 流程完整走完


















