Nginx后端崩溃时返回陈旧缓存需构建“有缓存、能识别、可复用、可验证”完整链路:精准配置proxy_cache_use_stale http_500-504,配合proxy_cache_path、稳定proxy_cache_key、proxy_cache_valid覆盖5xx,启用proxy_cache_background_update与proxy_cache_lock,并通过X-Cache: STALE、响应体一致性及毫秒级耗时验证生效。

要让 Nginx 在后端崩溃时返回陈旧缓存,核心不是单独打开 proxy_cache_use_stale,而是构建一条“有缓存、能识别、可复用、可验证”的完整链路。它不保证数据最新,但能守住服务可用底线。
只启用高可信度的触发条件
后端真正崩溃时,最可靠的表现是稳定返回 5xx 状态码(如进程退出、网关拦截),而不是网络抖动或超时。应精准配置:
-
推荐写法:
proxy_cache_use_stale http_500 http_502 http_503 http_504;——这四类由后端主动发出,语义明确、误判率低 -
避免添加:
error和timeout——连接失败或读取延迟可能是瞬时问题,盲目启用会掩盖真实异常 -
如需后台刷新:可追加
updating,但必须同步开启proxy_cache_background_update on;
确保缓存本身“存得住、找得着、过得了期”
stale 不生成缓存,只复用已存在但过期的内容。以下三点缺一不可:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
- 在
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、时间戳、随机 ID 等动态字段 - 让错误响应也能进缓存:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 500 502 503 504 1m;
搭配后台更新与请求锁实现自愈闭环
返回陈旧内容只是起点,真正提升体验的是让用户无感过渡到新内容:
-
proxy_cache_background_update on;——返回 stale 的同时,Nginx 自动发起异步子请求拉取新响应并写入缓存 -
proxy_cache_lock on;与proxy_cache_lock_timeout 3s;——同一缓存键只允许一个请求回源,其余直接返回 stale 或刚刷新好的新内容 - 二者必须配合:没有 background_update,
updating条件永不满足;没有 cache_lock,多个并发可能同时刷爆上游
从客户端视角验证是否真生效
停掉所有 upstream server 后,别只看状态码,重点确认三件事:
- 响应头中出现 X-Cache: STALE(需提前配置
add_header X-Cache $upstream_cache_status;) - 响应体与故障前完全一致——不是空页、不是 Nginx 默认 502 页面、也不是结构错乱的 JSON
- 响应耗时在几十毫秒内(比如
proxy_read_timeout 3s,实测返回 40–80ms),说明确实绕过了回源










