先看现象。筛选页地址是 /list?color=red&size=m,CDN 默认缓存键只取路径,不带参数。上线第二天有用户反馈点红色筛选却看到蓝色商品,日志里同一路径的响应在不同时间内容不同。关掉缓存后正常,重新打开又复现。

原因不止一个,得分开看。缓存键没有把 query string 纳入,所有筛选组合共用一份缓存。少数情况下是回源响应里没有 Vary 头,边缘无法判断该按哪一维区分。

另外,源站把筛选结果写进了同一个 PHP session,回源本身就取到了别人的结果。

少数情况下是缓存 TTL 设成一天,改版后旧筛选页一直保留。

动手时先在边缘看同一路径带不同参数的响应是否一致

curl -sI 'https://www.example.com/list?color=red' | grep -i -E 'x-cache|age'

然后确认缓存键配置里有没有包含参数

curl -s https://cdn.example.com/api/config | head -40

随后按参数白名单重建缓存键,只放行已知的几个筛选项

proxy_cache_key "$host$uri?color=$arg_color&size=$arg_size";

等前面都确认过,再清掉既有缓存并观察回源比例

curl -X PURGE 'https://www.example.com/list?color=red'

怎么算真的好了,看的是同一批现象。带不同参数的地址命中不同缓存条目,边缘响应里的缓存键能看到颜色和尺码,串内容的现象消失。

容易忽略的是,把所有参数都塞进缓存键会把命中率打到很低,用白名单只保留真正影响内容的几个参数。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189