CDN 上线后缓存命中率只有 12%,日志里同一个页面出现几十种语言头组合,每种都当成独立对象回源,蜘蛛一天抓两万次却几乎全是 MISS。
一开始怀疑是「语言切换靠这个头做 302,没有落地到独立 URL」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。缓存键把整个语言头拼了进去,带 q 值和纯 zh-CN 被当成两个版本。也可能是Vary 头写了 Accept-Language,边缘按全值分桶。
少数情况下是回源请求没做归一化,源站每次返回的 Vary 还不一样。
先按缓存状态统计命中和回源
awk '{print $9}' cdn.log | sort | uniq -c | sort -rn | head
数一下同一个 URL 有多少种语言头
awk '{print $7, $NF}' cdn.log | sort -u | wc -l
带不同语言头看返回的 Vary
curl -sI -H 'Accept-Language: zh-CN,zh;q=0.9' https://www.example.com/ | grep -i vary
语
言
别只看报错消失,验证要多做一步。缓存键收敛后命中率从 12% 涨到 78%,蜘蛛的回源请求少了七成,抓取量没降但源站压力明显下来。
这里还有个坑。凡是把请求头整段拼进缓存键的配置,最后都会变成缓存碎片,先看键里到底放了什么。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
