Nginx的fastcgi_cache缓存PHP返回的原始未压缩响应体,Gzip压缩在输出时动态执行;需协同配置fastcgi_cache_path、fastcgi_cache_valid、gzip on及gzip_vary on,并严格跳过含Cookie/Set-Cookie等个性化响应。

Nginx 的 fastcgi_cache 本身不直接缓存 Gzip 压缩后的内容到磁盘,它缓存的是 FastCGI 后端(如 PHP-FPM)返回的原始响应体——也就是未压缩的 HTML/JSON 等。Gzip 压缩发生在 Nginx 将缓存内容发给客户端之前,属于“运行时动态压缩”,而非“缓存预压缩”。
所以,不存在“在磁盘上直接存储压缩后的静态高粘度页面”这种 fastcgi_cache 行为。但你可以通过合理组合配置,实现等效效果:
✅ 缓存 PHP 动态生成的页面(如商品页、文章页)
✅ 对缓存命中响应自动启用 Gzip(节省带宽、提升传输速度)
✅ 避免重复压缩、避免缓存污染(如含 Cookie 或 Set-Cookie 的响应)
以下是关键配置逻辑和实操要点:
✅ 正确理解缓存与压缩的执行顺序
Nginx 处理一个 PHP 请求并启用缓存+Gzip 的典型流程是:
- 请求到达 → 匹配
location ~ \.php$ - 检查
fastcgi_cache是否命中(读磁盘缓存) - 若命中:读取未压缩的原始响应体 → 再执行 gzip 压缩 → 发送给客户端
- 若未命中:转发给 PHP-FPM → 收到响应 → 按规则决定是否写入
fastcgi_cache(仍存未压缩内容)→ 再压缩发送
⚠️ 注意:
gzip on是对 所有符合条件的响应 生效,包括从 fastcgi_cache 读出的内容。它不区分来源,只看Content-Type和响应大小。
✅ 核心配置项(需同时启用并协同)
1. 定义 fastcgi_cache 存储区(磁盘级)
fastcgi_cache_path /www/server/nginx/fastcgi_cache
levels=1:2
keys_zone=phpcache:100m
inactive=30m
max_size=2g
use_temp_path=off;-
use_temp_path=off:避免临时文件拷贝,提升 IO 效率 -
max_size=2g:防止缓存占满磁盘(建议根据页面体积 × 日均访问量估算)
2. 在 server 或 location 中启用缓存 + Gzip
location ~ \.php$ {
# 启用 fastcgi_cache
fastcgi_cache phpcache;
fastcgi_cache_valid 200 301 302 10m; # 成功响应缓存 10 分钟
fastcgi_cache_valid 404 1m; # 404 缓存 1 分钟(防爬虫刷)
fastcgi_cache_bypass $skip_cache; # 可选:跳过缓存的变量控制
fastcgi_no_cache $skip_cache;
# 关键:禁止缓存含 Set-Cookie 或 Cookie 的响应(除非你明确需要登录态缓存)
fastcgi_cache_skip_cache_if ($cookie_nocache || $arg_nocache || $http_pragma = 'no-cache');
# 启用 Gzip(全局 http 块已开启即可,此处仅强调生效范围)
gzip on;
gzip_min_length 1k;
gzip_types text/html text/css application/javascript application/json;
# 其他必要 fastcgi 参数(略,保持标准)
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}3. 全局 Gzip 配置(推荐放在 http 块)
gzip on; gzip_min_length 1k; gzip_buffers 16 8k; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; gzip_disable "MSIE [1-6]\.";
-
gzip_vary on:让 Nginx 自动加Vary: Accept-Encoding响应头,确保 CDN 或代理能区分 gzip/non-gzip 缓存版本 -
gzip_comp_level 6:平衡 CPU 与压缩率,过高(如9)会显著拖慢高并发场景
✅ 高粘度页面(如商品页)的缓存增强技巧
所谓“高粘度”,指访问集中、内容稳定、更新频率低。适合强缓存策略:
-
按 URL 参数精细化缓存
# 忽略 utm_* 等追踪参数,避免相同页面被当成多个 key fastcgi_cache_key "$scheme$request_method$host$request_uri";
-
对特定路径延长缓存时间
location ~ ^/product/ { fastcgi_cache_valid 200 301 302 30m; # 商品页缓存 30 分钟 add_header X-Cache-Status $upstream_cache_status; } -
禁止缓存个性化内容(关键!)
# 如果页面含用户昵称、购物车数等,务必跳过缓存 map $http_cookie $skip_cache { default 0; "~*wordpress_logged_in" 1; # WordPress 登录态 "~*PHPSESSID" 1; # PHP 会话 ID "~*nocache" 1; }
❌ 常见误区提醒
-
fastcgi_cache不支持“缓存 gzip 后的二进制文件” —— 它缓存的是原始响应流,压缩永远发生在输出阶段 - 不要给
Set-Cookie响应开启缓存(除非你做的是无状态静态化,且明确清除了所有 Cookie 相关逻辑) -
gzip_vary on必须开启,否则多端用户(手机/PC)可能拿到错乱的压缩/非压缩混用缓存 - 缓存路径权限必须为
nginx用户可读写(如chown -R www:www /www/server/nginx/fastcgi_cache)
不复杂但容易忽略


















