要实现FastCGI缓存差异化时长,需按状态码、路径、参数或后端头分层配置:在location块内设fastcgi_cache_valid,配合fastcgi_cache_key和fastcgi_ignore_headers;如200/301/302缓存10m,404缓存1m,5xx禁用,any兜底30s;API接口可设60s,分类页设30m;通过map提取参数或利用X-Accel-Expires动态控制;须避免权限不足、Cache-Control干扰、key不稳定及配置位置错误等失效陷阱。

要让 fastcgi_cache_valid 对不同动态接口实现差异化缓存时长,核心不是“统一设一个值”,而是按响应状态码、URL路径、参数特征甚至后端返回头做分层控制。关键在于:它必须出现在 location 块内,且需配合 fastcgi_cache_key 和 fastcgi_ignore_headers 才能真正生效。
按 HTTP 状态码区分缓存时间
这是最常用也最稳妥的方式。Nginx 会根据后端返回的实际状态码匹配对应规则:
-
fastcgi_cache_valid 200 301 302 10m;—— 成功响应缓存 10 分钟,适合首页、文章页等稳定内容 -
fastcgi_cache_valid 404 1m;—— 404 页面只缓存 1 分钟,避免误缓存临时不存在的链接 -
fastcgi_cache_valid 500 502 503 504 0;—— 错误页不缓存(设为 0 表示禁用),防止把故障状态固化 -
fastcgi_cache_valid any 30s;—— 兜底规则,未被上面覆盖的状态码统一缓存 30 秒
按 URL 路径或接口类型精细控制
在不同 location 块中单独配置,实现“同域名下不同接口不同策略”:
- 对 API 接口(如
/api/v1/posts)可设较短时间:
location /api/ {<br> fastcgi_cache my_cache;<br> fastcgi_cache_valid 200 302 60s;<br> fastcgi_cache_valid 404 10s;<br>} - 对静态化程度高的页面(如
/category/或/tag/)可延长:
location ~ ^/(category|tag)/ {<br> fastcgi_cache my_cache;<br> fastcgi_cache_valid 200 302 30m;<br>}
按请求参数或后端头动态调整
仅靠 fastcgi_cache_valid 无法直接读取参数值,但可通过组合手段间接实现:
- 用
map提前提取关键参数(如type=public或format=json),生成变量$cache_ttl,再用fastcgi_cache_valid引用(需 Nginx ≥1.11.8):
map $arg_format $cache_ttl {<br> json 60s;<br> html 10m;<br> default 5m;<br>}<br>...<br>fastcgi_cache_valid 200 302 $cache_ttl; - 若后端 PHP 主动返回
X-Accel-Expires: 300,Nginx 会优先采用该值(覆盖fastcgi_cache_valid),此时需加fastcgi_hide_header X-Accel-Expires来禁用干扰
避开常见失效陷阱
即使写了多条 fastcgi_cache_valid,以下情况仍会导致“看似配置了,实则不生效”:
- 缓存路径目录不存在,或 Nginx worker 用户(如
www-data)无写权限 —— 缓存静默失败,error.log 只报模糊的Permission denied - 后端返回了
Cache-Control: no-cache或Set-Cookie头 —— 必须显式配置fastcgi_ignore_headers Cache-Control Set-Cookie -
fastcgi_cache_key包含了不稳定变量(如$cookie_session或$http_user_agent)—— 导致每个用户都生成独立缓存,命中率趋近于 0 - 把
fastcgi_cache_valid写在http或server块顶层,而没放在具体location ~ \.php$或location /api/块里 —— 它不会继承生效

















