列表页要 320px 缩略图,详情页要 1280px 大图,两个请求的路径都是 /img/abc.jpg,只差查询参数。上线后详情页偶尔显示模糊缩略图,刷新几次又正常。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
location ~ ^/img/(?<w>\d+)/(?<name>.+)$ {
proxy_cache_key "$scheme$host$w$name";
proxy_cache_valid 200 7d;
proxy_pass http://img_backend/resize?w=$w&name=$name;
}
CDN 的缓存键默认只取路径,忽略 w 和 h 参数,先到的那份被缓存下来给所有请求用。回源时又按参数取了正确尺寸,所以表现成时好时坏。多台边缘节点缓存时间不同,看起来像随机。这一点先确认清楚,后面就不用反复试。
碰到「图片缓存键冲突」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,把尺寸参数纳入缓存键 或者改成路径化 /img/320/abc.jpg;确认源站返回的 Vary 和 Cache-Control 一致;上线后按不同尺寸各请求一次 看命中是否分开;清理旧缓存键 避免残留错图继续命中。
改完照着核一遍,同名的 320 和 1280 两个请求命中不同缓存条目,详情页连续刷新十次都返回大图,响应头 X-Cache 显示 HIT。
