事情本身不复杂,线索都在日志里。源站输出 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 头实测一次比看文档可靠。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
