核对 Bunny CDN 的缓存命中率只有 40%,用工具看边缘节点,同一个 HTML 页面按 br、gzip、identity 三种编码各存了一份,回源次数翻了三倍。

一开始怀疑是「部分节点不支持 brotli,回落后又生成一份新对象」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。cache key 默认包含 Accept-Encoding,编码不同就是不同对象。另一种情况是Vary 头里同时有 Accept-Encoding 与 User-Agent,维度爆炸。

还有一种情况,边缘规则没开 normalization,参数顺序不同也各存一份。

先查看边缘缓存的 key 组成

curl -sI https://www.example.com/ -H 'Accept-Encoding: br' | egrep -i 'x-cache|vary'

接着把 Accept-Encoding 从 key 里去掉,改由节点压缩

curl -X POST https://api.bunny.net/pullzone/123/cacheKey -d '{"ignoreEncoding":true}'

只保留必要的 Vary 维度

curl -sI https://www.example.com/ | grep -i '^vary'

等前面都确认过,再清缓存后观察回源率

curl -X POST https://api.bunny.net/pullzone/123/purgeCache

改完先别撤,确认这几项。缓存对象数量下降一半,命中率升到 82%,回源请求与带宽费用同步下降,页面响应时间也稳定了。

提醒一点。缓存 key 的维度决定命中率,压缩、UA、参数顺序都会被算进去,做完压缩优化前先看 key 是怎么拼的。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189