现场是这样的。2026 年 11 月 6 日发了新版头图和价格,发布流水线里带一步「预热首页与栏目页」,脚本读的是本地构建目录里的 index.html,那份是上一轮构建留下的。两小时后抽查五个节点,四个还是旧头图旧价格,源站 curl 拿到的却是新内容。purge 只做过一次,紧接着又被预热写回去。

中间走过弯路,把「只做 purge 没等生效,紧接着的预热把旧内容又写回缓存」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。预热脚本跑在构建产物同步之前,读到的是上一轮的静态文件;预热请求带内部 Header,边缘直接返回 HIT 的旧副本不回落;构建目录和 Nginx 根目录不是同一个,脚本读的那份没人更新。

动手时先对比源站与各节点返回的正文

for h in node1 node2 node3; do curl -s -H "Host: www.example.com" http://$h/ | md5sum; done

purge 后等回源再预热

curl -X PURGE https://www.example.com/ && sleep 5 && curl -sI https://www.example.com/ | grep -i -E 'age|x-cache'

预热地址改成带新版本参数的地址

curl -s 'https://www.example.com/?v=20261106' -H 'Cache-Control: no-cache' > /dev/null

校验节点内容与源站哈希一致

curl -s https://www.example.com/ | md5sum

恢复的判定其实很直接。各节点首页正文哈希与源站一致,响应头的 Age 在预热后从 0 开始增长,五分钟后抽查十个节点全部是新版内容。

预热只会把缓存填满,不判断填进去的是新是旧,顺序必须是先同步文件再 purge 再预热。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189