Nginx中仅在http块配置fastcgi_cache不能全局开启PHP缓存,必须在location ~ .php$块中显式启用fastcgi_cache指令,且需满足响应头允许缓存、仅GET/HEAD请求、无Set-Cookie等前提条件。

在 Nginx 的 http 块中配置 fastcgi_cache,**并不能真正“全局开启”PHP 脚本缓存**,因为 FastCGI 缓存是否生效,完全取决于每个 location(或 server)块中是否显式启用了缓存指令。仅在 http 块中定义缓存区、密钥格式等,只是做“准备”,不触发实际缓存行为。
1. 必须在 http 块中完成的基础配置
这是缓存功能的前提,但本身不启用缓存:
-
定义缓存区:用
fastcgi_cache_path指定缓存路径、大小、层级和 inactive 时间 -
设置缓存密钥模板:用
fastcgi_cache_key定义如何生成缓存键(通常含请求方法、主机、URI、参数等) -
配置缓存默认行为:如
fastcgi_cache_valid设置不同状态码的缓存时长 -
可选:共享内存区名称:通过
fastcgi_cache指令绑定一个缓存区名(如phpcache),供后续 location 引用
2. 真正启用缓存必须在 location 块中
只有在处理 PHP 的 location ~ \.php$(或类似)块中添加以下指令,缓存才会生效:
-
fastcgi_cache phpcache;—— 启用指定名称的缓存区 -
fastcgi_cache_bypass $skip_cache;—— 可选,跳过缓存的条件变量(如登录用户、POST 请求) -
fastcgi_no_cache $skip_cache;—— 配合 bypass,避免写入缓存 -
fastcgi_cache_valid 200 302 10m;—— 覆盖 http 块中的默认值(可选) -
fastcgi_cache_use_stale error timeout updating http_500;—— 提升容错性
3. 注意缓存生效的关键前提
FastCGI 缓存对 PHP 页面生效,有严格限制:
立即学习“PHP免费学习笔记(深入)”;
-
响应头必须允许缓存:PHP 脚本不能输出
Cache-Control: no-cache、no-store或private;建议显式输出Cache-Control: public, max-age=600 -
请求方法限制:默认只缓存 GET 和 HEAD 请求;POST/PUT/DELETE 不缓存(除非手动改
fastcgi_cache_methods) -
Set-Cookie 头会禁用缓存:如果 PHP 输出了
Set-Cookie,Nginx 默认不缓存该响应(可通过fastcgi_ignore_headers Set-Cookie强制忽略,但需谨慎) -
后端响应必须带可缓存状态码:如 200、301、302;4xx/5xx 默认不缓存(除非在
fastcgi_cache_valid中明确声明)
4. 验证缓存是否工作
最直接方式是检查响应头:
- 成功命中缓存时,响应头会出现
X-FastCGI-Cache: HIT(需在配置中用add_header X-FastCGI-Cache $upstream_cache_status;输出) - 未命中为
MISS,绕过为BYPASS,过期为EXPIRED - 同时观察缓存目录(如
/var/cache/nginx/phpcache/)下是否有文件生成
不复杂但容易忽略:缓存不是“开个开关就全站生效”,它依赖配置+响应头+请求方法+location 显式启用四者协同。漏掉任意一环,都可能看似配了却始终 MISS。


















