什么是fastcgi_cache缓存?
在了解FastCGI缓存和浏览器缓存之前,我们先来简单说说Nginx的缓存机制。缓存就像是一个临时仓库,当客户端(比如浏览器)向服务器请求资源时,如果这个资源已经被缓存起来了,服务器就可以直接从缓存中取出该资源返回给客户端,而不需要重新去处理请求,这样可以大大节省时间和服务器资源。
Nginx的缓存机制主要有两种类型,一种是FastCGI缓存,另一种是浏览器缓存。FastCGI缓存主要用于缓存动态内容,而浏览器缓存则是让浏览器本地存储一些静态资源,下次访问时可以直接从本地读取。
FastCGI是一种用于在Web服务器和应用程序之间进行高效通信的协议。FastCGI缓存就是将FastCGI应用程序生成的动态内容进行缓存,用于提高动态内容的性能。它特别适合处理FastCGI协议的应用,比如 PHP(Wordpress)。fastcgi_cache缓存从系统层面实现网页静态化,生成缓存需依赖Nginx (PHP不参与),资源占用少很多,速度更快,极大减少服务器负担、并发能力。
宝塔面板启用fastcgi_cache为网站加速
本文以宝塔面板为基础,面板环境安装过程中已经默认加载了ngx_cache_purge模块
检查模块是否安装
nginx -V 2>&1 | grep -o ngx_cache_purge
如果正确安装则返回如下内容

创建缓存目录
makedir -P /var/run/nginx-cache
chown -R www:www /var/run/nginx-cache
这里用命令行创建了一个nginx-cache的文件,并将所有者设置为www用户和组,这个也可以通过宝塔的文件管理进行设置
配置全局的nginx设置
打开nginx配置文件,在http组中找到 include mime.types;在后面填写如下代码
# 定义缓存池
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

配置网站的nginx设置
打开网站设置中的配置文件,在server组中填写如下内容
#nginx helper option start
set $skip_cache 0;
#post 访问不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
#动态查询不缓存
if ($query_string != "") {
set $skip_cache 1;
}
#后台等特定页面不缓存(其他需求请自行添加即可)
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
#对登录用户、评论过的用户不展示缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
#这里请参考你网站之前的配置,特别是sock的路径,弄错会显示502!如果你的网站使用PHP7.4,就写-74.sock
location ~ \.php$
{
try_files $uri =404; # 防遍历漏洞
include fastcgi_params;
fastcgi_pass unix:/tmp/php-cgi-82.sock; # 宝塔PHP82默认sock,根据使用的版本修改
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 缓存核心逻辑(与主配置缓存池匹配)
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 10s;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# 再次强制注入调试头(双重保障)
add_header X-FastCGI-Cache $upstream_cache_status always;
add_header X-Skip-Cache $skip_cache always;
}
#缓存清理配置
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
配置wp-config.php
在文件管理中打开wp-config.php文件,在后面添加
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/var/run/nginx-cache');
define( 'WP_CACHE', true);
完成上述配置后,重载nginx配置,并重新启动
Nginx Helper插件配置
安装插件
配置好了fastcgi_cache缓存之后,我们需要安装插件, fastcgi_cache 有一个量身定做的 WordPress 缓存清理插件:Nginx Helper。这个插件不定时更新,而且更新的很频繁。安装这个插件 ,非常简单,直接进入 WordPress 后台插件安装界面搜索 Nginx Helper 关键词在线安装即可。

配置插件
首先是开启purge,然后我们选择nginx Fastcgin cahe,因为就我们用就是这个缓存。之后选择 Delete local server cache files。当然第一个也可以用,但是一般推荐用Delete local server cache files,因为每个服务器的环境都不一样,缓存路径也会不尽相同就会导致插件无法找到缓存文件并删除!
插件还提供了其它的一些设置,功能非常丰富,例如发表新文章、新评论时是否更新Nginx缓存等。
清理模式选择
①purge 模式
这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。
出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了 CDN 的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实 IP,以便插件直接请求 purge 路径,而不用走 CDN 节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!
②文件模式
模式二是直接清理对应的缓存文件,不需要请求 purge 这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人推荐使用这个模式)。
由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!这个问题已经在上面的wp-config.php的配置中解决了
我的插件配置功能如下图

验证缓存状态
使用浏览器隐身模式打开网站前台(未登录状态),按 F12 进入开发者工具 > “网络” > 点网址> 点“标头”查看详情。

HIT:缓存成功
MISS:缓存失败,建议刷新页面2次看下有没有变成HIT。
BYPASS:跳过缓存
EXPIRED:缓存过期
细节处理
Cache-Control信息显示no-cache
启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:
Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache
问题出在了宝塔面板中的session.cache_limiter的PHP.ini设置部分, 默认值是nocache,我们需要将它设置为none即可。
动态内容
由于FastCGI_Cache会缓存PHP请求,可能会导致网站异常。例如阅读量计数失效、缓存评论者信息、缓存登陆界面等,需要添加额外代码排除。因此不建议新手使用FastCGI_Cache缓存。FastCGI_Cache缓存需要使用专门缓存插件。
经测试define( ‘WP_CACHE’, true)在本站主题使用过程中可以解决点赞、阅读缓存不变化的情况
