Nginx FastCGI缓存配置需四步对齐:建www可写缓存目录、http块定义fastcgi_cache_path、location中启用fastcgi_cache并设valid与key、用bypass/no_cache排除登录态和动态接口,缺一导致X-Cache为BYPASS。

电商商品页、CMS后台首页、API接口响应慢,PHP每次都要查库渲染模板,QPS一上500就超时——你需要在Nginx层直接缓存FastCGI响应,让热门请求绕过PHP-FPM和数据库,毫秒返回HTML。
确认Nginx已编译fastcgi_cache模块
宝塔面板默认Nginx 1.22+版本已启用该模块,但需实测验证。登录服务器终端,执行:
nginx -V 2>&1 | grep -o with-http_fastcgi_module
若输出为空,说明缺失模块,必须重装Nginx——【不可跳过】此时继续配置会报unknown directive错误,所有后续步骤无效。
宝塔用户可直接进入【软件商店】→ Nginx →【卸载】→ 重新安装1.24稳定版,勾选“编译安装”确保模块内建。
立即学习“PHP免费学习笔记(深入)”;
创建缓存目录并设置正确权限
缓存路径必须由Nginx主进程用户(通常是www)完全控制,否则缓存文件写入失败,命中率永远为0。
执行命令创建目录:
mkdir -p /www/server/nginx/cache
设置归属与权限:
chown -R www:www /www/server/nginx/cache && chmod -R 755 /www/server/nginx/cache
验证是否生效:
ls -ld /www/server/nginx/cache
输出中第一列应含rwx,第三列owner必须是www。
在Nginx全局配置中定义缓存区
这一步必须在http {}块内完成,且要放在所有include语句之前,否则站点配置中引用keys_zone会报错。
打开宝塔【文件】→ /www/server/nginx/conf/nginx.conf,在http {后第一行插入:
fastcgi_cache_path /www/server/nginx/cache levels=1:2 keys_zone=phpcache:100m inactive=30m max_size=2g use_temp_path=off;
其中keys_zone=phpcache是唯一标识符,后续站点配置中必须严格一致;max_size=2g防止磁盘占满;use_temp_path=off避免多层临时写入降低IO性能。
为具体网站启用FastCGI缓存
进入宝塔【网站】→ 目标站点 →【设置】→【配置文件】,在server块内找到location ~ \.php(.*)$ {区块。
第一步:在fastcgi_pass指令下方、fastcgi_param SCRIPT_FILENAME上方,插入缓存启用指令:
fastcgi_cache phpcache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_lock on;
第二步:在server块顶层(location外),添加缓存键规则,确保GET参数变化能生成独立缓存项:
fastcgi_cache_key "$scheme$request_method$host$request_uri";
第三步:排除登录态与动态接口,防止用户信息泄露——在location ~ \.php(.*)$ {内追加:
fastcgi_cache_bypass $cookie_PHPSESSID $arg_nocache;
fastcgi_no_cache $cookie_PHPSESSID $arg_nocache;
注意:$cookie_PHPSESSID适用于默认PHP session名,若框架使用自定义session cookie(如laravel_session),需同步替换变量名。
验证缓存是否生效
方法一:在站点配置中添加响应头便于肉眼判断:
在location ~ \.php(.*)$ {内加入:
add_header X-FastCGI-Cache $upstream_cache_status;
访问页面,用浏览器开发者工具查看响应头,出现HIT表示缓存命中,MISS表示未命中或被跳过。
方法二:手动触发缓存写入并检查文件:
curl -I https://your-site.com/ > /dev/null
ls -lh /www/server/nginx/cache/
若目录下出现十六进制命名的子目录及文件,且大小非零,说明缓存已实际落盘。



















