一台反代后面挂了 a 和 b 两个站,缓存 key 只用了 $scheme$request_uri。两个站有相同的 /about 路径,访问 b 站时经常看到 a 站页面。
这类报错背后常见的原因有几处,逐个排除就行。缓存 key 没带 $host,同路径的响应被认为是同一个对象;两个站共用同一个 proxy_cache_path,目录也相同;回源时的 Host 头按默认 server 取,取错了源站;缓存没有按站点分区,清缓存只能整份清。
先查看当前缓存 key 配置与命中情况
grep -n 'proxy_cache_key' /etc/nginx/conf.d/*.conf
然后把 host 加进 key
proxy_cache_key "$host$request_uri";
两个站分开用不同的缓存目录
proxy_cache_path /var/cache/a levels=1:2 keys_zone=a:100m;
剩下的就是清缓存后按站核对返回内容
curl -s -H 'Host: b.example.com' https://127.0.0.1/about | grep -o '<title>[^<]*'
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
恢复的判定其实很直接。两个站各自返回自己的页面,缓存命中率没有明显下降,串页问题彻底消失。
容易忽略的是,多站点共用反代时,缓存 key 里必须带上 host,否则路径相同就是同一个对象,这类问题只在特定路径上出现。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
