nginx 通过 proxy_cache_use_stale 指令在后端异常(如 error、timeout、5xx 状态码等)时返回过期但可用的缓存内容,保障服务连续性,需配合 proxy_cache_path、proxy_cache 等基础缓存配置生效。

当后端服务暂时不可用或响应缓慢时,Nginx 可以通过 proxy_cache_use_stale 指令返回缓存中“过期但可用”的响应,保障服务连续性。它不是让缓存永久失效,而是在特定异常条件下主动启用陈旧(stale)缓存内容。
哪些情况会触发使用过期缓存
该指令接受多个参数,指定在何种上游异常时允许返回 stale 缓存:
- error:与后端建立连接失败、发送请求失败或接收响应头超时
- timeout:代理请求过程中发生读取/写入超时(包括 proxy_read_timeout 等)
- invalid_header:后端返回了无法解析的响应头(如 malformed Set-Cookie)
- updating:当前有其他请求正在更新该缓存项(配合 proxy_cache_lock 使用)
- http_500 / http_502 / http_503 / http_504:后端返回对应 5xx 状态码
- off:显式关闭所有 stale 行为(慎用)
必须配合 cache 的基础配置才生效
该指令本身不产生缓存,仅控制“能否用 stale”。需确保已启用缓存机制:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 定义
proxy_cache_path并指定缓存区名称(如my_cache) - 在 location 中启用缓存:
proxy_cache my_cache - 设置缓存有效期:
proxy_cache_valid 200 302 10m - 建议开启
proxy_cache_lock避免缓存穿透和重复回源
stale 响应的生命周期由 proxy_cache_valid 控制
Nginx 不会无限期保留 stale 内容。它仍受原始缓存有效期约束,但允许在过期后继续 serve,直到新响应就绪或被强制淘汰:
- 若缓存项未过期,正常返回;若已过期但满足
proxy_cache_use_stale条件,则返回 stale 版本 - stale 状态下,Nginx 会在后台异步尝试回源刷新(前提是配置了
proxy_cache_background_update) - 若后台刷新成功,后续请求立即获得新版本;若失败,stale 可能持续到缓存被清理或手动 purge
实际配置示例
以下是一个典型场景配置片段:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location /api/ {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 5m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;
proxy_cache_lock on;
proxy_cache_background_update on;
}
}
该配置表示:API 接口缓存 5 分钟;即使后端返回 502 或超时,也返回最多过期 60 分钟内的缓存内容(由 inactive 控制),同时后台悄悄尝试更新。










