Nginx 不支持 fastcgi_cache_revalidate 指令,需通过 ETag/Last-Modified 响应头、稳定 cache_key、fastcgi_cache_use_stale updating 等协同配置实现缓存新鲜度校验。

nginx 中没有 fastcgi_cache_revalidate 这个官方指令——它属于常见误解。真正起作用的是通过合理组合缓存策略与响应头控制,让 Nginx 在缓存过期前后自主完成内容新鲜度校验,从而减少 PHP-FPM 的重复执行。
确认 PHP 正确输出 ETag 或 Last-Modified
这是整个机制的前提。Nginx 只有拿到可比对的标识,才能在后续请求中做条件判断。
- ETag 应基于内容生成,例如:
header('ETag: "post-' . md5($content) . '"');或header('ETag: "user-' . $uid . '-' . $updated_at . '"'); - Last-Modified 推荐用文件修改时间:
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($file)) . ' GMT'); - 避免固定值或随机字符串,否则无法触发 304
- 确保相同内容始终返回相同标识,不同内容返回不同标识
配置 Nginx 缓存并保留关键响应头
默认 fastcgi_cache 会缓存所有响应头,但若误配了 fastcgi_ignore_headers,就会丢掉 ETag/Last-Modified,导致校验失效。
- 检查配置中是否含
fastcgi_ignore_headers Last-Modified ETag;—— 如果有,必须删除 - 确保
fastcgi_cache_key稳定,推荐使用:fastcgi_cache_key "$scheme$request_method$host$request_uri"; - 禁用动态变量(如
$args、$time_iso8601),否则同一 URL 会生成多个 cache key
启用 stale 状态支持后台刷新与容错
当缓存即将过期或后端暂时不可用时,fastcgi_cache_use_stale 能让 Nginx 继续返回旧内容,并异步校验更新,避免用户等待或看到错误页。
- 关键配置项:
fastcgi_cache_use_stale updating error timeout http_500 http_502 http_503 http_504; -
updating最重要:Nginx 在后台发起条件请求时,仍可用旧缓存响应新请求 - 配合
fastcgi_cache_valid 200 10m;设置基础有效期,再由 revalidate 逻辑延长
实际生效需依赖完整协同配置
单独开启某个参数无法达成目标。以下几项必须同时存在且语义匹配:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:100m inactive=60m;fastcgi_cache phpcache;fastcgi_cache_valid 200 301 302 10m;fastcgi_cache_use_stale updating error timeout http_500;-
fastcgi_cache_bypass $http_cache_control;(可选,用于支持客户端主动跳过缓存)
注意:PHP 输出的 Cache-Control: no-cache 或 Pragma: no-cache 会直接禁用 Nginx 缓存,务必清理这类干扰头。


















