fastcgi缓存生效需满足三个前提:nginx≥1.11.6、fastcgi_cache_path在http块定义、缓存目录由www用户可写;否则x-cache始终为bypass或空。

FastCGI缓存不是“一开就灵”的开关,它必须满足三个硬性前提:Nginx版本 ≥ 1.11.6、fastcgi_cache_path在http块中明确定义、缓存目录由www用户可写;缺一不可,否则X-Cache响应头永远是BYPASS或空。
确认Nginx是否真正支持fastcgi_cache指令
宝塔默认安装的Nginx大多带--with-http_fastcgi_module,但低版本(如1.10.x)或手动编译缺失模块时会报unknown directive "fastcgi_cache_path"。别信面板显示的“已安装”,要实测:
- 进「软件商店」→ 找到 Nginx → 「设置」→ 「配置修改」
- 在
http {后第一行插入一行测试配置:fastcgi_cache_path /tmp/test_cache levels=1:2 keys_zone=test:1m inactive=1m; - 点「保存」——若弹出错误提示,说明模块未启用,需升级Nginx至1.22+或重装支持版本
- 若保存成功,再执行
nginx -t验证语法,通过后删掉这行测试配置
在Nginx主配置中声明cache_path并设对权限
fastcgi_cache_path必须出现在http上下文,且路径目录得让Nginx工作进程能写入,否则缓存文件根本生成不了。宝塔不提供图形化入口,必须手动操作:
- 编辑
/www/server/nginx/conf/nginx.conf,在http {后、首个include前插入:fastcgi_cache_path /www/server/nginx/cache/fastcgi levels=1:2 keys_zone=fcgi:256m inactive=1d max_size=1g; - 创建目录并赋权:
mkdir -p /www/server/nginx/cache/fastcgi,然后chown -R www:www /www/server/nginx/cache/fastcgi - 注意
max_size=1g不是建议值,而是硬限制;如果站点日均PHP请求超10万,256m内存区可能频繁驱逐,建议调到512m - 改完必须点「重载配置」(非重启),否则
keys_zone不会加载进内存
在网站配置中启用缓存并排除敏感路径
WordPress这类动态站不能无差别缓存,否则登录用户看到别人缓存的首页,或提交评论后页面不刷新。关键不是“开不开”,而是“谁不缓存”:
- 进网站「设置」→ 「配置文件」,在
location ~ \.php$ {块内,紧贴fastcgi_pass之后加入:fastcgi_cache fcgi;(名字必须和keys_zone一致) - 加缓存有效期:
fastcgi_cache_valid 200 301 302 1h;,严禁缓存404或500——它们不该被传播 - 用
map替代if做排除逻辑(if在location里会触发Nginx“if is evil”,直接让缓存失效):
在server块外、http块内加:map $cookie_wp_logged_in_ $skip_cache { default 0; "~.+" 1; } - 在PHP location块内加:
fastcgi_cache_bypass $skip_cache;和fastcgi_no_cache $skip_cache; - 务必加
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;,否则WordPress自己输出的Cache-Control: no-cache会覆盖Nginx缓存策略
验证缓存是否真实生效及常见失效原因
别只看配置有没有报错,要盯X-Cache响应头和实际访问效果。最常踩的坑是“看起来配了,其实没走缓存”:
- 用
curl -I https://yoursite.com/查看响应头,X-Cache: HIT才表示命中,MISS是首次缓存,BYPASS说明被fastcgi_cache_bypass规则跳过 - 如果始终
BYPASS,检查$skip_cache变量是否拼错(比如$cookie_wp_logged_in_少下划线,或WordPress实际cookie名是wordpress_logged_in_...) - 如果
HIT但内容错乱,大概率是漏了fastcgi_hide_header Vary;——PHP返回Vary: Cookie会导致Nginx为每个用户存一份缓存,浪费空间且易冲突 - 宝塔自带的防CC规则有时会在配置里插
if ($cookie_PHPSESSID) { ... },这种if会污染整个location上下文,删掉或改用map重写
缓存键(fastcgi_cache_key)默认不含$arg_*参数,但如果你的URL带?utm_source=xxx之类无意义参数,建议显式定义fastcgi_cache_key $scheme$request_method$host$request_uri;并去掉$args,避免同一页面因不同UTM参数被重复缓存。











