proxy_cache_use_stale 可在上游返回502/503/504时启用陈旧缓存,实现防雪崩;proxy_cache_valid 对502无效,因其非后端返回的可缓存响应。

proxy_cache_valid 本身不能直接为 502 错误设置缓存,因为 502 是 Nginx 自身生成的错误响应(上游无响应或返回非法响应),它不来自后端服务,也不经过 proxy_cache 缓存流程。
Nginx 的 proxy_cache_valid 只对后端成功返回的响应状态码生效,例如:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 1m;
但 502、503、504 等 5xx 错误由 Nginx 主动构造并返回,默认不进缓存,也无法用 proxy_cache_valid 控制其“缓存时长”。
✅ 正确思路:用 proxy_cache_use_stale 实现“502 防雪崩缓存”
你想达成的实际目标是:
当上游突然大量返回 502(如连接池耗尽、服务雪崩),Nginx 不立即把每个请求都打向已瘫痪的后端,而是临时复用之前缓存的旧响应(哪怕已过期),避免流量全量压垮残余节点 —— 这就是「防雪崩缓存」的核心逻辑。
Nginx 提供了专门机制:proxy_cache_use_stale,它允许在上游出问题时,返回 stale(陈旧)缓存内容,包括在 502、503、504 等错误发生时启用。
✅ 推荐配置(含极短兜底)
# 启用缓存区(必须先定义)
proxy_cache_path /var/cache/nginx/ai_cache levels=1:2 keys_zone=ai_cache:100m max_size=1g inactive=10m use_temp_path=off;
server {
location /v3/api/agent/completions {
proxy_pass http://ai_backend;
proxy_cache ai_cache;
proxy_cache_valid 200 301 302 5s; # 正常响应只缓存 5 秒(短命,保新鲜)
proxy_cache_valid 404 1s; # 404 缓存极短,防探测放大
# ⚠️ 关键:当上游返回 502/503/504 或超时/忙/不可达时,允许返回 stale 缓存
proxy_cache_use_stale error timeout updating http_502 http_503 http_504;
# 可选:即使缓存过期,也允许在后台异步更新时继续提供(提升可用性)
proxy_cache_background_update on;
# 可选:给 stale 响应加 Header,便于前端识别(调试用)
add_header X-Cache-Status $upstream_cache_status;
}
}? 效果说明:
- 正常请求(200)缓存 5 秒 → 保证响应新鲜,不积压旧结果;
- 若后端开始批量 502,Nginx 不再每次转发请求,而是:
- 若有未过期的缓存 → 直接返回(
HIT); - 若缓存已过期但满足
proxy_cache_use_stale条件(比如刚收到一个 502)→ 返回STALE缓存,并在后台悄悄尝试刷新(因启用了proxy_cache_background_update);
- 若有未过期的缓存 → 直接返回(
- 用户看到的是“略有延迟但能返回”的结果,而非全量 502 → 阻断雪崩放大。
? 注意:该机制依赖你已有可缓存的正常响应。首次部署或缓存为空时,前几秒仍会透传 502。建议配合健康检查 + 限流(如
limit_req)使用。
❌ 常见误区澄清
-
proxy_cache_valid 502 1s→ 无效语法,Nginx 启动失败(502 不是后端返回的可缓存状态); - 试图用
error_page 502 = @fallback+proxy_cache绕过 → 无法真正“缓存 502”,只是重定向到静态页或降级接口,不属于“防雪崩缓存”本意; - 仅调大
proxy_next_upstream_tries或proxy_next_upstream_timeout→ 解决单点故障,但不缓解并发压测下的雪崩。
✅ 补充建议(强化防雪崩)
- 在 upstream 中开启健康检查,快速摘除异常节点:
upstream ai_backend { server 10.0.2.51:8878 max_fails=2 fail_timeout=10s; keepalive 32; } - 对
/completions类高开销接口,叠加limit_req限流:limit_req zone=ai_limit burst=20 nodelay;
这样组合下来,才能在 502 雪崩初期真正“踩住刹车”。


















