nginx fastcgi条件缓存核心是分层控制:按url路径(如/api/、/wp-admin/)、用户状态($cookie_user_id)、敏感参数(utm_/ref=)、http状态码(200/404/401等)动态启用或绕过缓存,并配合map预判、fastcgi_cache_lock防穿透及fastcgi_cache_use_stale提升韧性。

配置 Nginx FastCGI 条件缓存,核心不是“统一开开关”,而是根据请求特征、响应语义和业务逻辑做分层控制——同一站点里,首页可缓 1 小时,搜索页只缓 60 秒,登录后跳转页必须不缓存,404 错误页缓 3 分钟但不能盖住新上线页面。
按 URL 特征动态启用或绕过缓存
用 map 指令预判请求意图,生成布尔变量控制缓存行为:
- 匹配 API 接口(如
/api/v1/user)或后台路径(/wp-admin),设$cacheable = 0,再通过fastcgi_no_cache $cacheable显式跳过 - 对静态化栏目页(如
/category/news)设$cacheable = 1,并配合fastcgi_cache_min_uses 1实现首次即缓 - 识别带敏感参数的请求:如
~\?(utm_|ref=|debug),统一设为不缓存,避免埋点污染缓存键
按用户状态隔离缓存范围
未登录用户与已登录用户的内容差异极大,必须区分处理:
- 用
fastcgi_cache_bypass $cookie_user_id和fastcgi_no_cache $cookie_user_id,只要存在用户 Cookie 就不读也不写缓存 - 若需保留部分公共内容(如页脚、公告栏),可在 PHP 层用
X-Accel-Expires: 300单独控制片段缓存时长,同时加fastcgi_hide_header X-Accel-Expires防止被覆盖 - 避免把
$cookie_session或$http_user_agent直接塞进fastcgi_cache_key,否则彻底失去共享性,缓存命中率趋近于 0
按 HTTP 状态码分级设定有效期
不同状态码代表不同业务含义,缓存时间必须语义对齐:
-
fastcgi_cache_valid 200 301 302 1h:常规成功页与重定向,稳定但非永久,1 小时平衡新鲜度与压力 -
fastcgi_cache_valid 404 3m:错误页缓太久会掩盖刚发布的页面,3 分钟足够收敛爬虫试探 -
fastcgi_cache_valid 401 403 10m:PHP 统一鉴权返回的权限拒绝,缓 10 分钟可省去重复校验开销 -
fastcgi_cache_valid any 1m:兜底规则,防止未声明状态码(如 429、502)长期滞留
增强缓存韧性与并发安全
真实生产环境里,缓存过期 ≠ 服务降级,要让 Nginx 主动兜底:
-
fastcgi_cache_use_stale error timeout http_500 http_503 updating:后端挂了、超时、返回 500/503,或正在异步刷新缓存时,都允许返回旧内容 -
fastcgi_cache_lock on:防止多个相同请求同时穿透到 PHP-FPM,只放行第一个回源,其余等待其结果 -
fastcgi_cache_lock_timeout 5s:锁等待超时后仍可回源,避免个别请求无限阻塞











