能,Nginx可在后端完全瘫痪时返回过期静态页面,前提是提前配置proxy_cache_use_stale error http_502 http_503 http_504,并确保缓存已存在、key稳定、5xx响应被缓存且路径有效。

在后端完全瘫痪时,Nginx 能否返回过期的静态页面,取决于 proxy_cache_use_stale 是否与缓存基础、错误捕获、键稳定性三者协同生效。它不是故障发生后才起作用的“兜底开关”,而是必须在服务正常期就部署好的降级能力。
只对瘫痪场景真正有效的 stale 触发条件
后端彻底不可达时,典型表现为连接失败或返回明确 5xx。应精准启用对应参数,避免扩大误触发范围:
- 写入 proxy_cache_use_stale error http_502 http_503 http_504; —— “error”覆盖连接拒绝、上游重置等底层中断;502/503/504 匹配网关、服务不可用、超时网关等标准崩溃信号
- 不加 timeout:单次读超时可能是瞬时抖动,非瘫痪特征,加入后易导致本可成功的请求也走 stale
- 不加 invalid_header:响应头异常多由中间设备引起,与后端瘫痪无关,易被误判
- 如需后台静默刷新,可追加 updating,但必须同步开启 proxy_cache_background_update on;
确保过期页面“存得住、找得准、用得上”
stale 生效的前提是:该 HTML 页面曾成功缓存过,当前仍存在于磁盘,且键未漂移、过期时间可识别。
- 定义可靠缓存区:proxy_cache_path /var/cache/nginx/pages levels=1:2 keys_zone=pages_cache:128m inactive=7d use_temp_path=off;
- 在 location 中启用:proxy_cache pages_cache;
- 稳定 cache_key:proxy_cache_key "$scheme$host$uri"; —— 剔除 ?t=、?v=、utm_ 等动态参数,防止同一页面生成多个 key
- 必须缓存 5xx 响应:proxy_cache_valid 502 503 504 1m; —— 否则后端返回 503 时根本不会进缓存,后续 stale 就无数据可返
- 主响应也要设合理有效期:proxy_cache_valid 200 301 302 1h; —— 确保页面有足够时间进入“已过期但可用”状态
验证是否真返回了原样旧页面,而非报错或空页
停掉所有 upstream(如 systemctl stop nginx-backend)后,从用户视角确认三件事:
- 响应头中出现 X-Cache: STALE(需提前配置 add_header X-Cache $upstream_cache_status;)
- 响应体(HTML 源码)与瘫痪前完全一致,不是 Nginx 默认 502 页面、不是空响应、也不是 JSON 错误体
- 响应耗时在 20–100ms 级别(远低于 proxy_read_timeout,比如设为 3s),说明确实绕过了回源
让降级更平滑:返回旧页面的同时悄悄拉新
单纯返回陈旧页面只是起点。进一步提升体验,可做到用户无感过渡:
- 开启 proxy_cache_background_update on;:返回 STALE 的同时,Nginx 自动发起后台请求尝试获取新页面并更新缓存
- 启用 proxy_cache_lock on; 和 proxy_cache_lock_timeout 3s;:防止大量并发请求在同一时刻发现缓存过期,集体击穿后端
- 对关键静态页(如 /index.html、/maintenance.html),可配合预热脚本定期访问,确保缓存始终存在


















