提高动态内容缓存率的关键在于让缓存“更准、更稳、更可控”:按状态码分层设置有效期,精准排除不缓存场景,确保缓存键稳定,利用stale机制提升有效命中率。

提高动态内容缓存率,关键不是延长 fastcgi_cache_valid 时间,而是让缓存“更准、更稳、更可控”——即命中更多该缓的请求,跳过不该缓的请求,并在失效时仍能服务。
按状态码分层设置有效期
同一 URL 返回不同状态码,语义和更新频率完全不同,统一设 1h 反而降低整体缓存率:
-
200 OK:主内容页(如文章、商品详情)可设
fastcgi_cache_valid 200 1h;但搜索页(?s=xxx)应单独控制,建议 10–15 分钟 -
301/302:重定向逻辑稳定,设
fastcgi_cache_valid 301 302 24h,避免反复查路由表 -
404:错误页缓太久会掩盖新上线页面,设
fastcgi_cache_valid 404 3m,兼顾防探测与及时刷新 - 401/403:若由 PHP 统一鉴权生成,可缓 5–10 分钟,减少重复校验
精准排除不缓存场景
缓存率低,常因大量请求被隐式跳过——不是没缓,而是根本没进缓存流程:
- 用
fastcgi_no_cache显式拦截登录态:fastcgi_no_cache $cookie_logged_in $cookie_wp_session; - 跳过带敏感参数的 URL:
if ($args ~* "(login|admin|preview|_wpnonce)") { set $skip_cache 1; },再配合fastcgi_no_cache $skip_cache; - POST 请求默认不缓存,但需确认 AJAX 提交后跳转的 GET 页面(如
/wp-comments-post.php?...&redirect_to=...)未被误缓
确保缓存键稳定且覆盖业务变量
缓存键(fastcgi_cache_key)不稳定,会导致同一页面被存成多份,命中率骤降:
- WordPress 类站点必须含
$args:fastcgi_cache_key "$scheme$request_method$host$request_uri$args";,否则?s=关键词全部命中同一缓存 - 若需过滤 utm_* 等跟踪参数,用
map预处理$args,而非依赖后端清理 - 绝对避免在 key 中加入
$cookie_*或$http_user_agent,除非你明确要做设备/用户级差异化缓存
用 stale 机制把“过期”变“可用”
缓存过期瞬间大量回源会拉低命中率,fastcgi_cache_use_stale 让旧缓存继续响应,实际提升有效缓存率:
-
fastcgi_cache_use_stale error timeout http_500 http_503 updating;:后端出错或正在更新时,仍发旧缓存 - 搭配
fastcgi_cache_lock on;,防止缓存失效时多个请求同时穿透到 PHP-FPM - 加
add_header X-FastCGI-Cache $upstream_cache_status;,方便用 curl 快速验证 HIT/MISS/STALE 状态


















