必须同时配置gzip与fastcgi_cache并协同优化:fastcgi_cache_path须在http块全局定义且路径赋权;gzip需按类型启用并排除图片;cache绕过逻辑须用动态Cookie变量名且fastcgi_no_cache不可遗漏;防CC规则会破坏缓存需禁用验证。

宝塔面板网站响应慢,光开 gzip 或只配 fastcgi_cache 单独一项,基本没用——必须两者协同,且缓存定义位置、绕过逻辑、压缩等级都得对,否则不是不生效,就是缓存错乱或压出 502。
fastcgi_cache 必须在 http 块全局定义,不能写在站点配置里
很多人在「网站 → 配置文件」里直接加 fastcgi_cache_path,保存后 reload Nginx 报错 unknown directive "fastcgi_cache"。这是因为 Nginx 要求缓存区必须在 http 上下文初始化,而宝塔的站点配置只作用于 server 块。
- 进「软件商店 → Nginx → 设置 → 配置修改」,找到
http {开头处,在第一行插入:
fastcgi_cache_path /www/server/nginx/cache/fastcgi levels=1:2 keys_zone=WORDPRESS:256m inactive=1d max_size=1g;
-
keys_zone名称(如WORDPRESS)要和站点配置中fastcgi_cache WORDPRESS严格一致 - 路径
/www/server/nginx/cache/fastcgi需手动创建并赋权:mkdir -p /www/server/nginx/cache/fastcgi && chown www:www /www/server/nginx/cache/fastcgi - 别漏掉
inactive=1d,否则过期缓存不会自动清理,磁盘迟早打满
gzip 压缩要分内容类型启用,且避免压缩已压缩资源
宝塔默认只对 text/plain 开 gzip,JS/CSS/JSON 全部裸奔传输;更糟的是,如果开了 gzip on 却没配 gzip_types,Nginx 默认只压 text/html,其余全 bypass。
- 同样在 Nginx「配置修改」的
http块里,确认包含:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json image/svg+xml;
-
image/svg+xml必加,WordPress 图标字体和主题 SVG 常被忽略 -
gzip_comp_level 6是平衡点:5 以下压缩率低,7 以上 CPU 占用陡增,实测对 PHP-FPM 响应延时影响明显 - 绝对不要对
.jpg/.png/.gif启用 gzip——它们本身已是压缩格式,再压反而变大
fastcgi_cache_bypass 和 fastcgi_no_cache 必须成对出现,且变量名要动态拼接
WordPress 登录态、评论、购物车等依赖 Cookie,但很多人只写 fastcgi_cache_bypass $cookie_wp_logged_in_,结果变量永远为空——因为真实 Cookie 名是 wp_logged_in_abcdef123...,后缀随用户 session 动态生成。
- 正确写法(放在站点配置的
location ~ \.php$块内):
fastcgi_cache_bypass $cookie_wp_logged_in_ $cookie_comment_author_ $cookie_woocommerce_; fastcgi_no_cache $cookie_wp_logged_in_ $cookie_comment_author_ $cookie_woocommerce_;
- 注意:多个变量用空格分隔,不是逗号;Nginx 会逐个检查,任一非空即绕过缓存
- 如果用了插件如 WooCommerce 或 bbPress,对应 Cookie 前缀要补全,比如
$cookie_woocommerce_cart_hash - 漏掉
fastcgi_no_cache就等于白配bypass:请求仍会被缓存,只是不读缓存而已
改完必须重载 Nginx,且要验证缓存是否真命中
点「保存」不等于生效,宝塔 UI 的「重载配置」按钮才是关键动作;更隐蔽的问题是:缓存看似开了,但因 if ($cookie_...) 这类判断被防 CC 规则注入,实际所有请求都被跳过。
- 执行
nginx -t && systemctl reload nginx确保语法通过并重载 - 用 curl 测试缓存状态:
curl -I https://yoursite.com/,看响应头是否有X-FastCGI-Cache: HIT或MISS - 检查日志:
tail -f /www/wwwlogs/yoursite.log,观察是否仍有大量200但无缓存头的 PHP 请求 - 若全是
MISS,立刻去「网站 → 设置 → 防CC设置」里关掉「开启防CC攻击」,或删掉配置里所有if ($cookie_...)块——Nginx 官方明确警告if在location内不可靠
真正卡点不在参数多难调,而在三处容易被忽略:缓存区定义位置错、Cookie 变量名写死、防 CC 规则暗中破坏缓存逻辑。这三处任何一个出问题,整个 FastCGI 缓存就形同虚设。











