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,不然一次抖动会放大成十分钟故障。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189