先把当时的情况摆出来。站点误删了一个栏目,404 页面被 KeyCDN 缓存了 24 小时。栏目恢复后,边缘节点一直返回 404,回源看源站其实是 200。
排查方向其实有限,先把可能性排一排。边缘规则没有区分状态码,404 与 200 同样缓存。另一种情况是缓存 TTL 与 stale 时间叠加,实际保留了 26 小时。
还有一种情况,只清了首页没有按 URL 精确 purge。另外,多个节点各自有缓存,逐个清漏掉了两个 POP。
上来先确认边缘返回的状态码与缓存标记
curl -sI https://www.example.com/column/seo | egrep -i 'HTTP/|cache'
然后改成只缓存 200 与 301
curl -X PUT https://api.keycdn.com/zones/123/cacherules -d '{"cache_status":[200,301]}'
随后按 URL 精确清掉这个路径
curl -X DELETE https://api.keycdn.com/zones/123/purge?url=https://www.example.com/column/seo
剩下的就是逐节点验证是否回到 200
for p in hkg fra sjc; do curl -sI --resolve www.example.com:443:$p https://www.example.com/column/seo | head -1; done
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
怎么算真的好了,看的是同一批现象。三个 POP 都返回 200,缓存规则生效后错误页不再被长期留存,栏目页流量在当天恢复。
错误状态码不要进边缘缓存,真需要缓存也要把 TTL 压到一分钟以内,否则恢复后还得等一轮过期。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
