nginx 1.24 给接口加了 proxy_cache,后端发版重启时返回过 502,之后十分钟内所有用户都拿到 502,后端恢复也没用,proxy_cache_valid 里只写了 200 10m 这一条。
一开始怀疑是「缓存 key 里没带 Host,几个站点共用了一份错误响应」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。proxy_cache_valid 对没有列出的状态码走了默认时间,502 也被存了进去。也可能是没配 proxy_cache_lock,缓存过期瞬间多个请求同时回源。
另外,proxy_next_upstream 没包含 http_502,失败请求没换后端就写进缓存。
第一件事是确认 502 是不是从缓存里出来的
curl -sI http://127.0.0.1/api/ping | grep -iE 'x-cache|HTTP/'
然后看清缓存有效期和 key 的配置
nginx -T | grep -n -E 'proxy_cache_valid|proxy_cache_key'
只允许 200 和 301 进缓存
printf '%s
' 'proxy_cache_valid 200 301 10m;' 'proxy_cache_valid 502 0;' 'proxy_cache_lock on;' > /etc/nginx/conf.d/cache.conf
末了清掉已经写坏的缓存再 reload
find /var/cache/nginx -type f -delete && nginx -t && nginx -s reload
恢复的判定其实很直接。连续请求都返回 200,响应头里 X-Cache 先 MISS 后 HIT,后端重启的窗口之外不再出现 502。
这里还有个坑。没写的状态码会走默认策略,502 被缓存十分钟很常见;接口缓存必须配 cache_lock 和 next_upstream,不然一次抖动会放大成十分钟故障。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
