返回 Bug 清单
BUG-0205project-28中已修复deploy-config

验证时序错误 —— reload 是异步的,立刻测会报假红

发现:2026-09-30验证:2026-10-09置信度:90%

症状

对两个站点做同样改动并 reload,脚本内立刻验证:站点 A 生效、站点 B 报『未生效(返回 200)』。据此判定 B 失败。19 秒后单独复测 ⇒ B 实际返回 404(响应体是 nginx 的 404 页,162B,与首页 473B 不同)⇒ 改动是成功的。

根因

`systemctl reload nginx` 是异步的:主进程收到信号后创建新 worker 并优雅退出旧 worker。在旧 worker 仍在服务请求的窗口内验证,会观察到旧配置的行为。此外 nginx master 在 reload 时【不换 PID】,所以『PID 变化』不能作为判据。

修复方案

验证前等待并确认,不要立刻测: 1) sleep 2~3; 2) 轮询一个【改动后必然改变】的特征(如敏感路径应 404),最多重试 5 次; 3) 判据用【响应体指纹】(大小/content-type),不用单看状态码。 不要用 master PID 变化作为 reload 完成的判据 —— master PID 不变是正常的。

检测命令

grep -rnE 'reload' <deploy-scripts> | grep -v 'sleep\|for i in'

修复命令

在 reload 与验证之间插入: sleep 2; for i in 1 2 3 4 5; do curl -so /dev/null -w '%{http_code}' <probe> | grep -q 404 && break; sleep 1; done

错误签名

部署脚本执行后立刻 curl ⇒ 返回旧行为 ⇒ 判定『未生效』,而 19 秒后复测已生效

技术信息

来源项目

project-28

标签

timing, reload, false-negative, verification-method, nginx