错误页面(502/503/504等)必须缓存5–30秒,推荐10秒,并需配置proxy_cache_valid、proxy_cache、proxy_ignore_headers及proxy_cache_use_stale才能生效。

错误页面(如 502、504)必须缓存,但只能缓存极短时间——这是防雪崩的关键动作。不缓存,用户重试就直击后端;缓存太久,用户会长时间看到错误页,体验崩坏。核心是让 Nginx 把“故障信号”变成“可控兜底”,而不是放任重试洪峰。
明确缓存 5xx 错误响应本身
默认情况下,Nginx 完全不缓存 502/503/504 这类响应。必须显式启用:
- 在启用了
proxy_cache的 location 中,加上:proxy_cache_valid 502 503 504 10s; - 推荐时长:5–30 秒。10 秒是通用平衡点——够缓解瞬时压测或重启抖动,又不至于让用户卡在错误页太久
- 如果还希望覆盖 500,一并写上:
proxy_cache_valid 500 502 503 504 10s;
确保缓存能真正落盘并被复用
光写 proxy_cache_valid 不够,三个前提缺一不可:
- 全局定义缓存区:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:64m max_size=2g inactive=1d; - 当前 location 启用它:
proxy_cache my_cache; - 允许缓存带错误状态的响应(默认会被跳过):
proxy_ignore_headers Cache-Control Set-Cookie;
——因为后端出错时可能仍返回Cache-Control: no-cache或带Set-Cookie,不忽略就会绕过缓存
配合 stale 策略,让过期错误页也能“续命”
当缓存已过期,但后端依然不可用,Nginx 可选择返回这个“过期但可用”的错误页,而不是再次发起请求加重压力:
- 启用 stale 响应:
proxy_cache_use_stale error http_502 http_503 http_504;
其中error覆盖连接拒绝、超时重置等底层失败,http_502等精确匹配状态码 - 注意:stale 生效的前提是该错误页曾成功进过缓存——所以
proxy_cache_valid这一步绝不能省 - 如需后台悄悄刷新,可加
updating,但必须同步开启:proxy_cache_background_update on;
避免常见失效陷阱
这些配置看似简单,但几处细节常导致缓存“形同虚设”:
- 不要在没启用 proxy_cache 的 location 里写 proxy_cache_valid——规则直接被忽略
- 别加 timeout 到 proxy_cache_use_stale——单次超时可能是网络抖动,不是雪崩,加了反而扩大影响面
- 别依赖 expires 或 Cache-Control 响应头控制错误页缓存——后端出错时这些头往往不可信或缺失,必须由 Nginx 主动定义
- 若使用自定义错误页(如
error_page 502 /err502.html),它和 proxy_cache 是两套机制:前者只替换展示内容,后者才真正实现降级容错











