不能同时用 proxy_cache 和 fastcgi_cache 加速同一个 PHP 请求路径,因为二者工作层级和协议不同:proxy_cache 用于 HTTP 反向代理,fastcgi_cache 专用于 Nginx 与 PHP-FPM 的 FastCGI 通信,指令互斥且无法叠加。

不能同时用 proxy_cache 和 fastcgi_cache 加速同一个 PHP 请求路径。
为什么 proxy_cache 和 fastcgi_cache 不能混用
两者工作层级和协议完全不同,强行共存会导致配置冲突或缓存失效:
-
proxy_cache用于反向代理场景,比如 Nginx 转发请求到后端的另一个 HTTP 服务(如 Apache、Node.js 或另一台 PHP 应用服务器),它缓存的是完整的 HTTP 响应(含状态码、Header、Body); -
fastcgi_cache专用于 Nginx 与 PHP-FPM 的 FastCGI 协议通信,缓存的是 PHP-FPM 执行后返回的 FastCGI 响应包,本质是 Nginx 对 FastCGI 接口的本地缓存; - Nginx 的
location ~ \.php$块中必须使用fastcgi_pass指令,此时走的是 FastCGI 流程,proxy_pass完全不生效——反之亦然。二者指令域互斥,无法嵌套或叠加。
PHP 应用该用 fastcgi_cache,不是 proxy_cache
PHP-FPM 是本地 FastCGI 进程,不是独立 HTTP 服务。Nginx 与它之间不走 HTTP 协议,所以 proxy_cache 对 PHP 动态内容完全无效。正确且唯一的选择是 fastcgi_cache:
- 在
http块定义缓存区:fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=phpcache:100m inactive=30m max_size=2g use_temp_path=off; - 设置缓存键(避免参数干扰):
fastcgi_cache_key "$scheme$request_method$host$request_uri"; - 在
location ~ \.php$中启用:fastcgi_cache phpcache;<br>fastcgi_cache_valid 200 301 302 10m;<br>fastcgi_cache_valid 404 1m;
- 跳过登录用户等敏感请求:
fastcgi_cache_bypass $cookie_PHPSESSID;<br>fastcgi_no_cache $cookie_PHPSESSID;
如果真需要 proxy_cache,说明架构已改变
只有当你的 PHP 应用被部署为独立 HTTP 服务(例如:用 Swoole 启动 HTTP Server、或用 PHP 内置服务器 + 反向代理),Nginx 才会以 HTTP 客户端身份通过 proxy_pass 转发请求——这时才能用 proxy_cache。但这已脱离传统 PHP-FPM 模式,属于特殊架构,需额外考虑 Session 共享、Header 透传、健康检查等问题。
验证缓存是否生效
加一行响应头便于调试:add_header X-FastCGI-Cache $upstream_cache_status;
访问页面时查看响应头:
→ 返回 HIT 表示命中缓存;
→ MISSED 表示未命中但已写入;
→ BYPASS 表示被 fastcgi_cache_bypass 规则跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











