Nginx 中不存在 fastcgi_cache_revalidate 指令,属常见误解;真正减少 PHP-FPM 处理的关键是配合 Last-Modified/ETag 响应头、fastcgi_cache_use_stale 及规范 cache_key,使 Nginx 自主返回 304 并绕过 PHP。

nginx 中并不存在 fastcgi_cache_revalidate 这个官方指令——它属于常见误解,不是 Nginx 核心模块或主流发行版(如主线版、OpenResty)所支持的配置项。所谓“用它降低冗余流量”,本质是混淆了缓存验证逻辑与实际生效机制。真正能减少 PHP-FPM 重复处理、降低后端交互流量的,是一套协同工作的标准配置组合,核心在于让 Nginx 在缓存过期前后自主完成内容新鲜度判断,而非依赖虚构的 revalidate 指令。
让 Nginx 自己响应 304,彻底跳过 PHP
这是降低冗余流量最直接有效的方式:客户端带 If-Modified-Since 或 If-None-Match 请求时,Nginx 不转发给 PHP,而是自行比对缓存中保存的 Last-Modified 或 ETag,匹配即返回 304。
- PHP 脚本必须输出规范的缓存标识头,例如:
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT');或header('ETag: "v1-' . md5($content) . '"'); - Nginx 配置中不能屏蔽这些头,确认没有
fastcgi_ignore_headers Last-Modified ETag;这类行 - 缓存需保留响应头,默认行为已满足,无需额外设置
启用 stale 状态应对后端波动
当 PHP-FPM 偶发超时、502 或正在后台更新缓存时,启用 stale 可避免用户等待或触发新请求压垮后端。
- 关键配置:
fastcgi_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating; - 其中
updating尤其重要:Nginx 在缓存即将过期时会异步刷新,期间继续用旧缓存响应,不中断服务也不重复调用 PHP - 搭配
fastcgi_cache_valid 200 301 302 10m;设置基础有效期,为 stale 提供判断依据
确保缓存 key 稳定且可复用
如果每次请求生成不同 key,缓存命中率归零,所有优化都失效。
- 推荐 key 模板:
fastcgi_cache_key "$scheme$request_method$host$request_uri"; - 避免包含动态变量如
$time_local、$request_time或未清理的查询参数(如跟踪用的?utm_source=xxx) - 如需忽略某些参数,可用
map预处理$args,或在 location 中用if重写 URI
补充调试与验证手段
光配对不等于生效,需通过响应头确认行为是否符合预期。
- 添加调试头:
add_header X-Cache "$upstream_cache_status From $host";,观察返回值是HIT、MISS还是STALE - 用
curl -I -H "If-None-Match: \"abc123\"" https://yoursite.com/page手动测试 304 是否由 Nginx 直接返回 - 检查 PHP 是否输出了冲突头,如
Cache-Control: no-cache或Pragma: no-cache,这类响应默认不被缓存


















