记录一下那天晚上的排查过程。死链巡检每天报出两百多条 404,抽了几条在浏览器里打开都正常。日志里看这些地址的请求确实返回 404,但源站目录下文件存在,手动访问源站 IP 也是 200,问题出在 CDN 回源这一层。
刚开始盯着「CDN 缓存了早期的 404 响应 后续请求直接命中缓存」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。回源路径多拼了一段目录 源站按错误路径返回 404。少数情况下是回源 Host 头写成了 IP 源站按默认站点匹配不到文件。
少数情况下是源站对 CDN 回源段 IP 做了限制 未命中白名单返回 404。
第一件事是分别请求 CDN 与源站对比状态
curl -s -o /dev/null -w 'cdn %{http_code}\n' https://www.example.com/static/a.js && curl -s -o /dev/null -w 'origin %{http_code}\n' -H 'Host: www.example.com' http://10.0.0.12/static/a.js
然后核对回源路径与 Host 配置
grep -nE 'proxy_pass|proxy_set_header Host' /etc/nginx/conf.d/*.conf
接着清掉节点上缓存的 404
curl -X PURGE https://www.example.com/static/a.js
剩下的就是确认回源段 IP 已放行
iptables -L -n | grep 10.0.0
改完先别撤,确认这几项。修正回源路径与 Host 后,巡检报告里的 404 从每天两百多条降到个位数,静态资源加载失败告警也同步消失。
补一句。看到 404 先分清是边缘返回的还是源站返回的,两边的路径和 Host 只要有一处不一致,就会凭空多出一批假死链。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
