事情本身不复杂,线索都在日志里。源站输出 Cache-Control: public, s-maxage=600, max-age=60,本意是边缘缓存十分钟浏览器一分钟,实际测下来边缘一分钟就回源,改版高峰期源站被打满。

真正麻烦的地方在于,几个原因的现象几乎一样。部分 CDN 默认按 max-age 处理,s-maxage 需要控制台单独开启。另一种情况是缓存键里带着 Accept-Encoding 变体,边缘各存一份互相不命中。

少数情况下是回源请求带 If-None-Match,源站每次返回 304 让边缘误判为未变。

第一件事是对比源站与边缘的响应头

curl -sI https://www.example.com/ | grep -iE "cache-control|age|x-cache"

随后把 s-maxage 提到 max-age 之前并确认边缘识别

add_header Cache-Control "public, s-maxage=600, max-age=60" always;

直接对边缘发一次回源验证

curl -sI -H "Cache-Control: no-cache" https://www.example.com/ | grep -i age

同一份数据我导出了两份,一份留底,一份拿来试。

怎么算真的好了,看的是同一批现象。边缘响应里 Age 能涨到 500 以上才回源,源站 QPS 在高峰期下降一个量级,页面内容仍在十分钟内更新。

补一句。各家 CDN 对 s-maxage 的支持不一致,上线前用 Age 头实测一次比看文档可靠。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189