nginx在后端宕机时返回过期缓存需构建“有缓存、能识别、可复用、可验证”完整链路:精准配置proxy_cache_use_stale http_500-504,配合proxy_cache_path、稳定proxy_cache_key、proxy_cache_valid覆盖5xx,启用background_update与cache_lock,并通过x-cache: stale、响应体一致性及毫秒级耗时验证生效。

Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
Nginx 在后端宕机时返回过期缓存,核心不是单独加 `
proxy_cache_use_stale`,而是构建一条“有缓存、能识别、可复用、可验证”的完整链路。它不保证数据最新,但能守住服务可用底线。
只启用真正反映宕机的触发条件
后端彻底不可用时,最可靠信号是连接中断或明确返回 5xx 错误,而非网络抖动。推荐配置:
-
精准启用:`proxy_cache_use_stale http_500 http_502 http_503 http_504;`
这四类由后端主动返回,语义清晰、误判率低
-
避免添加 `error` 和 `timeout`:它们多对应瞬时故障(如 DNS 解析慢、TCP 重传),盲目启用会导致本可成功的请求也被降级
-
如需后台刷新,可追加 `updating`,但必须同步开启 `proxy_cache_background_update on;`,否则该参数无效
确保缓存“存得住、找得准、过得了期”
`proxy_cache_use_stale` 不生成缓存,只复用已存在但过期的内容。以下三项缺一不可:
- 在 `http` 块中正确定义缓存区:
`proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:512m inactive=3d use_temp_path=off;`
- 在 `location` 中显式启用并引用:
`proxy_cache my_cache;`
- 使用稳定缓存键,剔除干扰字段:
`proxy_cache_key "$scheme$host$request_uri";`
禁用 `$args`、`$cookie_`、时间戳、随机 ID 等动态参数
- 关键一步:让错误响应也能进缓存——必须配置:
`proxy_cache_valid 200 301 302 10m;`
`proxy_cache_valid 500 502 503 504 1m;`
没有这一条,5xx 根本不会落盘,stale 就无内容可返
提升容灾体验:边返回旧内容,边静默更新
单纯返回陈旧数据只是起点,更优做法是让用户无感过渡到新内容:
- 开启异步刷新:`proxy_cache_background_update on;`
Nginx 在返回 stale 的同时,自动发起低优先级子请求拉取新响应并写入缓存
- 防止并发击穿:`proxy_cache_lock on; proxy_cache_lock_timeout 3s;`
同一缓存键下,首个请求负责回源或触发后台更新,其余请求最多等待 3 秒后直接读新缓存(或继续走 stale)
- 二者必须配合:没有 `background_update`,`updating` 条件永不满足;没有 `cache_lock`,多个并发可能同时刷爆上游
从客户端视角验证是否真生效
停掉所有 upstream 后,别只看状态码是不是 200,重点确认三件事:
- 响应头中出现 `X-Cache: STALE`(需提前配置 `add_header X-Cache $upstream_cache_status;`)
- 响应体(HTML 或 JSON)与故障前完全一致,不是空页、不是 Nginx 默认 502 页面、也不是错误提示结构
- 响应耗时在 20–100ms 级别(远低于 `proxy_read_timeout`,比如设为 3s),说明确实绕过了回源