nginx后端宕机时返回旧缓存,需配置proxy_cache_use_stale http_500-504、proxy_cache_valid含5xx状态码、proxy_cache_background_update on与proxy_cache_lock on协同,并验证x-cache: stale响应头及毫秒级低延迟。

Nginx 要在后端宕机时返回旧缓存,核心不是单独加 proxy_cache_use_stale,而是让这条指令能在“有缓存、能识别、可复用”的前提下被正确触发。它不创造数据,只授权使用已存在但过期的内容。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
只对真正可信的宕机信号启用 stale
后端进程崩溃、服务退出或网关拦截时,最稳定的表现是返回 500/502/503/504。这些由应用层主动发出,语义明确:
- 写
proxy_cache_use_stale http_500 http_502 http_503 http_504; - 不要加
error或timeout:连接失败、DNS 波动、单次读超时属于网络抖动,盲目启用会掩盖真实问题 - 如需后台刷新,可加
updating,但必须同步开启proxy_cache_background_update on;
确保旧缓存“存得住、找得着、过得了期”
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、$time_iso8601、$cookie_等动态字段 - 让错误响应也进缓存:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 500 502 503 504 1m; - 缓存有效期不宜过短(如关键接口设为 10s),否则故障前缓存已被清理,stale 就无内容可返
让托底更可靠:边返回旧内容,边静默更新
单纯返回陈旧响应只是起点,平滑过渡需要自愈能力:
- 开启异步刷新:
proxy_cache_background_update on;—— 返回 stale 的同时,Nginx 自动发起子请求拉新内容写入缓存 - 防止并发击穿:
proxy_cache_lock on; proxy_cache_lock_timeout 3s;—— 同一 key 下,首个请求负责回源或触发后台更新,其余等待后直接读新缓存或继续走 stale - 二者必须配合:没有
background_update,updating条件永不满足;没有cache_lock,多个并发可能同时刷爆上游
验证是否真在优雅托底
停掉所有 upstream 后,从客户端视角确认三件事:
- 响应头含
X-Cache: STALE(需提前配置add_header X-Cache $upstream_cache_status;) - 响应体与故障前完全一致,不是空页、不是 Nginx 默认 502 页面、也不是结构错乱的 JSON
- 响应耗时在几十毫秒内(比如
proxy_read_timeout 3s,实测返回 40–80ms),说明确实绕过了回源
不复杂但容易忽略










