fastcgi_cache_background_update 实现动态接口“秒开”,即缓存过期时用户仍毫秒返回旧内容,nginx 后台静默刷新;需配合 fastcgi_cache_use_stale updating、稳定 cache key、后端识别 x-updating 头跳过非核心逻辑。

用 fastcgi_cache_background_update 实现动态接口“秒开”,核心是让 Nginx 在缓存即将过期时,不阻塞用户请求,悄悄后台刷新缓存——用户始终命中旧缓存,毫秒级返回,而新内容已在后台生成并就绪。
它解决什么问题?
默认情况下,当 fastcgi 缓存过期,下一个请求会阻塞等待 PHP 重新生成响应,用户明显感知卡顿(尤其接口依赖数据库或外部 API)。开启 background_update 后:
- 缓存未过期 → 正常返回(快)
- 缓存已过期但未被清理 → 仍立即返回旧内容(不卡)
- 同时 Nginx 后台发起一个非阻塞请求,调用后端更新缓存(用户无感)
关键配置要点
仅开启开关不够,需配合以下设置才能真正生效:
-
必须启用
fastcgi_cache_use_stale updating:告诉 Nginx “当缓存处于updating状态时,允许继续使用旧缓存”——这是秒开的前提 -
缓存 key 要稳定且可复现:比如含必要参数(
$request_uri或$args),避免后台刷新时因 key 不一致写入错误位置 -
后端需支持条件性响应(推荐):PHP 接口可检查
HTTP_X_UPDATING: "1"请求头,对后台刷新请求跳过耗时逻辑(如不发消息、不记日志),只做数据组装 -
注意
fastcgi_cache_lock冲突:若同时开启 cache_lock,可能阻塞 background update;一般建议关闭 lock,靠 background update + stale 机制更优雅
一个典型配置片段
放在 location 块中:
fastcgi_cache my_cache; fastcgi_cache_valid 200 5s; # 缓存仅 5 秒,适合高变动接口 fastcgi_cache_background_update on; # ✅ 开启后台更新 fastcgi_cache_use_stale updating error timeout http_500 http_503; # ✅ 允许在 updating 时用旧缓存 fastcgi_cache_lock off; # ❌ 关闭 cache_lock,避免干扰 add_header X-Cache-Status $upstream_cache_status;
此时,第 6 秒的请求不会等 PHP,而是立刻返回第 0–5 秒缓存的内容,同时后台静默触发一次 PHP 执行,更新下一轮缓存。
需要后端配合的小技巧
PHP 中可这样轻量适配:
- 读取
$_SERVER['HTTP_X_UPDATING'] ?? ''判断是否为后台刷新请求 - 若是,跳过审计日志、消息通知、复杂权限校验等非核心步骤
- 但务必保证数据查询和模板渲染完整执行——否则后台刷出来的仍是空/错内容
- Nginx 默认不传
X-Updating头,需手动加:fastcgi_pass_request_headers on;并在 location 中加fastcgi_param HTTP_X_UPDATING $upstream_cache_status;(值为UPDATING时才传)











