nginx在php-fpm崩溃时返回陈旧缓存需精准配置fastcgi_cache_use_stale http_500-504及timeout,配合fastcgi_cache_path、稳定cache_key、cache_valid覆盖5xx、fastcgi_cache_bypass过滤敏感请求,并通过x-cache: stale、响应体一致性验证生效。

要让 Nginx 在 PHP-FPM 崩溃时自动返回陈旧缓存页面,关键不是“PHP 崩溃”本身被检测,而是它导致的明确信号——比如返回 500、502、503、504 状态码,或连接/读取超时。Nginx 不会感知进程是否“崩溃”,只响应它收到的协议结果或通信异常。
只启用真正可信的触发条件
PHP-FPM 崩溃最常表现为上游返回 5xx 错误或完全无响应。应精准匹配这些场景,避免泛用:
- 必配:`fastcgi_cache_use_stale http_500 http_502 http_503 http_504;` —— 这些是 PHP-FPM 明确出错的 HTTP 证据
- 推荐加:`timeout;` —— 对应 `fastcgi_read_timeout` 超时,防 PHP 卡死不返回
- 慎用:`error;` 仅适用于连接被拒、地址解析失败等底层故障;高并发下易误判,不建议单独使用
- 禁用:`invalid_header` —— 它发生在响应头解析阶段,Nginx 直接终止流程,根本不会走到缓存逻辑
确保 stale 有内容可返
stale 不生成缓存,只复用已存在的过期内容。若缓存压根没存进去,降级就失效:
- 在
http{}块定义缓存区:fastcgi_cache_path /www/server/nginx/fastcgi_cache levels=1:2 keys_zone=phpcache:100m inactive=30m use_temp_path=off; - 缓存 key 必须稳定:
fastcgi_cache_key "$scheme$request_method$host$request_uri";—— 删掉时间戳、用户 ID、随机参数 -
fastcgi_cache_valid必须覆盖错误响应:fastcgi_cache_valid 500 502 503 504 1m;—— 让 5xx 也能进缓存,stale 才有数据源
跳过不该缓存的请求,防止 stale 返回错页
登录态、搜索页、后台路径等若被缓存,stale 会把他人页面或空响应推给用户:
- 用变量标记跳过:
set $skip_cache 0; - 拦截敏感路径:
if ($request_uri ~* "/wp-admin/|/wp-login.php|/user/") { set $skip_cache 1; } - 过滤带参数的 URL:
if ($query_string != "") { set $skip_cache 1; } - 识别登录 Cookie:
if ($http_cookie ~* "wordpress_logged_in|PHPSESSID|auth_token") { set $skip_cache 1; } - 绑定到 location:
fastcgi_cache_bypass $skip_cache;和fastcgi_no_cache $skip_cache;
配合超时参数控制“等待死区”长度
用户卡顿多久才触发 stale,由 fastcgi 超时参数决定:
-
fastcgi_connect_timeout 3s;—— 连不上 PHP-FPM 就快速放弃 -
fastcgi_send_timeout 5s;—— 防请求体发送阻塞 -
fastcgi_read_timeout 8s;—— 最关键:读响应超时即触发stale timeout
只要这个读超时发生,且你启用了 timeout 条件,Nginx 就会立即返回已过期但尚存的缓存,而非让用户干等或看到 504。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











