fastcgi_cache_use_stale 是一种降级策略,非错误纠正,用于后端异常时返回过期缓存以维持服务可用性;需配合 cache_path、cache、cache_key、cache_valid 等指令生效。

fastcgi_cache_use_stale 并不实现“自动错误纠正”,它只是在后端(如 PHP-FPM)出现异常时,允许 Nginx 临时返回缓存中的旧内容,从而避免用户看到 500、502 等错误页面。这是一种降级策略,不是修复故障,而是提升可用性。
它解决什么问题
当 FastCGI 后端(比如 PHP 应用)短暂不可用、超时或返回错误响应时,Nginx 默认会直接把错误透传给客户端。启用 fastcgi_cache_use_stale 后,只要对应请求曾被成功缓存过,Nginx 就可选择性地返回“过期但尚可接受”的缓存副本,维持服务连续性。
常用参数组合及含义
该指令接受多个条件标识符,满足任一即可启用 stale 响应:
- error:后端连接失败、发送/接收超时、主动拒绝连接时
- timeout:fastcgi_pass 请求超时(由 fastcgi_read_timeout 控制)
- invalid_header:后端返回空响应或非法 HTTP 头(如缺失 Status 行)
- updating:缓存正被后台更新(配合 fastcgi_cache_background_update),此时仍可返回旧缓存
- http_500 | http_502 | http_503 | http_504:后端明确返回这些状态码时
- off:显式关闭所有 stale 行为(慎用)
必须配合的缓存配置
单独设置 use_stale 不起作用,需确保以下基础缓存机制已启用:
- 定义缓存区域:fastcgi_cache_path 指令指定磁盘路径与内存元数据区
- 启用缓存:fastcgi_cache 绑定到具体 cache zone
- 设置缓存键:fastcgi_cache_key 需包含足够区分度(如 $scheme$request_method$host$request_uri)
- 控制缓存有效期:fastcgi_cache_valid 明确指定各状态码的缓存时间(如 200 301 10m;500 1m)
实际配置示例
以下是一个典型安全组合:
fastcgi_cache my_cache; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 500 502 503 504 1m; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
注意:5xx 状态的缓存时间建议设短(如 1 分钟),避免长时间返回错误页;同时搭配 fastcgi_cache_lock 可防止缓存失效时大量并发回源压垮后端。











