启用 fastcgi_cache_background_update 的核心目标是让用户无感知缓存过期,需同时配置 fastcgi_cache_use_stale updating、稳定 cache_key 和 fastcgi_cache_lock off,并配合后端识别 X-Updating: 1 轻量处理。

启用 fastcgi_cache_background_update 的核心目标,是让用户完全感知不到缓存过期——旧内容毫秒返回,新内容在后台静默生成并写入缓存。它不是单独打开一个开关就能生效的功能,而是一套需要多环节协同的机制。
必须配齐的三项基础配置
只写 fastcgi_cache_background_update on; 是无效的,以下三者必须同时存在:
-
启用 stale 回退策略:添加
fastcgi_cache_use_stale updating;,告诉 Nginx “当缓存正被后台更新时,允许继续用旧缓存响应”,这是用户不卡顿的前提 -
缓存 key 必须稳定可复现:例如使用
fastcgi_cache_key "$scheme$request_method$host$request_uri";,避免包含时间戳、随机参数或用户 Cookie;否则后台刷新请求算出的 key 和前台不一致,新内容就写错位置了 -
关闭 cache lock:设为
fastcgi_cache_lock off;;若开启 lock,后台刷新请求可能被前台请求阻塞,反而失去“后台”意义
后端 PHP 要轻量配合
Nginx 后台刷新时会带上 X-Updating: 1 请求头(PHP 中对应 $_SERVER['HTTP_X_UPDATING']),后端应据此做差异化处理:
- 检查该 header 是否为
"1",若是,则跳过审计日志、消息通知、权限二次校验等非核心耗时逻辑 - 但数据查询、模板渲染、JSON 组装等核心输出逻辑必须完整执行——否则刷出来的仍是空响应或错误内容
- 不建议依赖 session 或用户态数据生成缓存内容,否则易导致缓存污染
缓存生命周期与路径要合理设定
background update 不是万能延寿剂,需匹配业务节奏:
-
fastcgi_cache_valid 200 5s;这类短时效(如 5 秒)适合高变动接口,确保后台刷新频率可控 - 在 http 块中声明
fastcgi_cache_path,并保证磁盘空间和内存 zone(keys_zone)充足 - 避免对带参数、登录态或敏感路径启用缓存,用
fastcgi_cache_bypass和fastcgi_no_cache显式拦截,防止 stale 返回他人数据
验证是否真正生效
加一行响应头便于调试:add_header X-Cache-Status $upstream_cache_status;
- 首次访问 → 返回
HIT(说明缓存已写入) - 等待缓存过期后再次访问 → 仍见
HIT,且响应极快(说明 stale + background update 已接管) - 同时观察后端日志:应能看到一次无感知的后台请求(带
X-Updating: 1)


















