源站 PHP 已经挂了,首页照样能打开,监控一路绿灯,直到有用户登录才发现所有动态请求都在报 502,前后差了半个小时。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

U=https://www.example.com
curl -sI $U'/?t='$(date +%s) | grep -iE 'x-cache|age'
curl -sI --resolve www.example.com:443:203.0.113.10 \
  $U | head -3

探针只探首页,首页又被 CDN 缓存了几个小时,命中缓存直接返回,源站那一段根本没被打到,故障就这样被缓存挡在了外面,一直没人发现。这一点先确认清楚,后面就不用反复试。

「缓存掩盖源站故障」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,探针分成首页和动态接口两条,接口走不缓存路径;巡检时带上随机参数,绕开缓存去真实打一次源站;核心链路再加一条直连源站的探测,不要所有请求都经过 CDN。

改完照着核一遍,停掉源站后一分钟内告警触发,首页缓存命中不再影响判断结果。

作者 9823189