上了整页缓存后命中率只有三成,日志里同一个页面出现几十种地址,区别只是 utm_source 和 utm_medium 不同,源站压力没降下来。日志里能对上时间点,这种反而好排。
缓存键默认用完整 URL,查询串里带了渠道参数,每个渠道各算一份缓存。内容其实完全一样,只是缓存被拆成了几十份。这一点先确认清楚,后面就不用反复试。
if ($arg_utm_source) { add_header Set-Cookie 'src=$arg_utm_source; Path=/'; return 302 $uri; }
proxy_cache_key "$scheme$host$uri$is_args$args";
「utm 缓存命中」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。
处理上按这个顺序:带 utm 的请求先 302 到不含参数的地址,把渠道写进 Cookie 再放行;缓存键里去掉 utm 开头的参数,只保留分页和搜索这类影响内容的参数;统计脚本从 Cookie 读渠道,别依赖地址栏;观察一周命中率,确认源站请求量跟着下降。
结果对不对很好判断,同一页面不同 utm 只占一份缓存,命中率回到八成以上,源站 QPS 降一半。
