用对象存储托管静态网站:改了页面却还是旧内容的一次缓存与回源排查
上周我们给产品介绍页做了一次小改版:换了一张主图,改了两行文案,价格表里加了一行新套餐。文件上传到对象存储桶之后,我用浏览器打开页面,却还是旧版。刷新两次、换了手机看,仍然是旧内容。第一反应是上传错了桶,或者文件没有覆盖成功。结果查了一圈,问题不在上传,而在缓存:浏览器、内容分发网络和对象存储之间,每一层都可能留着旧版本。
先把链路画清楚
静态网站的访问链路一般是:浏览器先问本地缓存,再问内容分发网络的边缘节点,边缘节点没有命中才会回源到对象存储桶。如果只看最终页面,根本分不清是哪一层在返回旧内容。所以排查的第一步不是反复上传,而是分层验证。
第一步:确认源站到底是不是新版
我在对象存储控制台里核对了 index.html 的最后修改时间和大小,又直接用桶的静态网站托管地址打开同一页面,结果是新版。这说明上传没有问题,旧内容来自更靠前的缓存层。
第二步:区分浏览器缓存和边缘缓存
接着用无痕窗口打开页面,仍然是旧版,基本可以排除本地浏览器缓存。随后用命令行查看响应头,重点看 Cache-Control、Age 和表示缓存命中的响应头:如果 Age 很大,说明边缘节点直接返回了缓存,没有回源;如果每次请求都回源但还是旧版,就要回头检查源站文件和缓存配置是否一致。
第三步:刷新边缘缓存,并给它一点时间
确认是边缘缓存后,我在内容分发网络控制台里对首页做了刷新。刷新不是立刻全球生效的,需要等节点逐个失效,期间不同地区、不同运营商看到的新旧版本可能不一样。这次等了几分钟再验证,页面终于变成了新版。急着反复刷新浏览器、反复重新上传,反而会把问题越搅越乱。
根本原因:缓存策略没有分层
事后复盘,真正的问题是缓存策略一刀切。首页这种经常改动的页面,当初和图片、样式文件一起设置了较长的缓存时间。图片改动频率低,长缓存没有问题;首页一改就必须立刻生效,却被同一条规则拖住了。正确的做法是分层:首页和入口文件用较短的缓存或每次校验,带内容哈希文件名的静态资源可以用长缓存,因为文件名一变就等于新资源,不怕旧缓存。
给小团队的部署清单
第一,上传后先验证源站,再验证边缘节点,最后验证浏览器,不要只看最终页面下结论。第二,发布前记录本次改动的文件清单,出了问题先按清单逐项核对。第三,首页发布后主动刷新一次,并留出几分钟的等待时间再通知他人验证。第四,保留上一版文件或开启对象版本控制,万一新版有问题,可以快速回退而不是重新拼凑旧文件。
这次排查没有用到什么高深工具,关键是按链路分层验证:先确认源站,再区分浏览器与边缘缓存,最后才动缓存策略。静态网站越简单,越容易让人忽略它背后的缓存链路,而大多数“改了没生效”,其实都是某一层缓存还没有过期。
- 点赞
- 收藏
- 关注作者
评论(0)