【WordPress】使用FastCGI_Cache缓存加速

发布于 / Shiro / 11 条评论

写在开头

FastCGI_Cache是Nginx的缓存模块,能够从Nginx层面实现网页静态化,能有效提高网站的并发能力、减少PHP运行时间和请求响应时间。

当然,前提是你的服务器本身有足够的性能,如果只有1H1G,再怎么优化也无法显著提升。

需要注意的是,由于FastCGI_Cache缓存了PHP请求,导致部分需要运行PHP的功能会失效,例如阅读量统计,所以请自行斟酌得失。

下面是启用FastCGI_Cache的教程


创建缓存目录

我的服务器环境:TencentOS3+宝塔面板+Nginx-tengine
手动创建以下两个目录,并设置权限为755
/tmp/wpcache
/tmp/wpcache/temp

通过终端创建

mkdir /tmp/wpcache
mkdir /tmp/wpcache/temp
chmod 755 /tmp/wpcache
chmod 755 /tmp/wpcache/temp

也可以直接用宝塔面板创建


修改网站配置

将以下代码插入网站配置的 server 块前面(注意不是 Nginx 配置!)

fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:128m inactive=1d max_size=1G;
fastcgi_temp_path /tmp/wpcache/temp;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

代码位置

注意:

  1. 插入站点配置的方法适合单站点,如果需要开启多站点缓存请尝试直接修改 Nginx 配置。
  2. keys_zone=WORDPRESS:128m中,WORDPRESS是缓存名,需要和下面的配置对应,128m是缓存大小限制,可以适当调整。
  3. /tmp/wpcache是缓存路径,需要提前创建,不然宝塔面板可能会报错。

将以下代码插入网站配置 #SSL-END 注释后面

  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/|/wp-admin/*|/xmlrpc.php|wp-.*.php|/feed|/rss|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了!关于sock,宝塔面板的在/www/server/php/你的php版本/etc/php-fpm.conf中有配置路径宝塔面板的sock
        location ~ [^/]\.php(/|$)
            {
                try_files $uri =404;
                fastcgi_pass unix:/tmp/php-cgi-74.sock;
                fastcgi_index index.php;
                include fastcgi.conf;  
                #新增的缓存规则
                fastcgi_cache_bypass $skip_cache;
                fastcgi_no_cache $skip_cache;
                #添加一个头部,用于判断缓存状态
                add_header X-Cache "$upstream_cache_status From $host";
                fastcgi_cache WORDPRESS;
                add_header Cache-Control  max-age=0;
                add_header Nginx-Cache "$upstream_cache_status";
                add_header Last-Modified $date_gmt;
                add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
                add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
                add_header X-XSS-Protection "1; mode=block"; # XSS 保护
                etag  on;
                fastcgi_cache_valid 200 301 302 1d;
        }

代码插入位置
插入代码位置

注意:

  1. 务必修改 sock 版本,默认PHP7.4,只需将其替换为你当前使用的版本。
    例如你用的是PHP7.3就修改成 /tmp/php-cgi-73.sock
  2. 这里没有配置 purge 地址,因为很容易出现冲突,下面将采取插件直接清除缓存目录的方法。(不懂的话你完全可以忽略这句)
  3. 建议阅读一下配置中的注释

检查缓存状态

  1. 进入你的网站并注销登陆
  2. 右键网页选择检查工具,并在打开的开发者工具中选择网络,勾选禁用缓存后刷新两次
  3. 选择页面文件查看信息头,如果显示HIT即为缓存成功!

选择检查
开发者工具
查看请求信息

响应头释义

标识解释
HIT缓存有效
MISS没有找到缓存
BYPASS不缓存此请求
EXPIRED缓存已过期

安装WP缓存清除插件

登陆 WP 后台搜索并安装 Nginx Helper 插件

按图修改配置

配置
配置

修改缓存清除路径

  1. 打开 /你的网站目录/wp-content/plugins/nginx-helper/includes/class-nginx-helper.php
    找到RT_WP_NGINX_HELPER_CACHE_PATH
    (大概在第87行)
  2. 将默认缓存路径/var/run/nginx-cache
    修改为/tmp/wpcache
    修改缓存路径

然后就完成了
现在,没有登陆的用户访问到的是静态缓存,访客评论后会自动清缓存,管理员的请求不会被缓存。
当需要手动清除缓存的时候点击 Nginx Helper 插件里的Purge Entire Cache按键即可。


没有配置 Fastcgi_Cache 的 Nginx 是不完整的(bushi

  1. 请问跟wp rocket缓存插件有什么区别,哪一个更好

    1. @bestyuan 原理上没有太大的区别,都是缓存页面减轻服务器负担,只是实现方法和细节有所不同。
      这里没法直接比较哪一个更好,WP Rocket本身也很强,有缓存重定向,还能配合CDN云缓存,只有测试了才知道。
      主要还是看你配置好没有,但想要加速网站不是靠一个缓存就能行。
      推荐优化以下内容:
      1. 托管静态资源到CDN以减少服务器请求
      2. 使用Redis数据库缓存减少查询量
      3. 对页面进行缓存减少PHP运行
      4. 适当移除无用功能来减少渲染时间
  2. 和“超级缓存”插件相比,有啥优势吗,似乎超级缓存配置要简单一些

    1. @kano酱 超级缓存是在运行PHP时定向到缓存(未启用mod_rewrite),而FastCGI_Cache是在Nginx运行时就定向到缓存。在高并发的情况下不需要运行PHP肯定更胜一筹,但一般而言超级缓存插件足以满足博客需求。
      总之两者都是将请求定向到缓存,只不过实现的步骤不一样。
      还有就是,启用mod_rewrite的超级缓存将和FastCGI_Cache一样在Nginx运行时就能定向到缓存。
  3. 懒人直接寄了 :huaji2:

    1. @heartalborada :huaji12: 这有啥好寄的,加个代码,装个插件就完事 :huaji14:
      1. @Shiro 纯粹的不想动(
  4. 开缓存后,文章阅读量统计挂了 :huaji10:
    待补坑 :huaji12:

    1. @Shiro 啥阅读量?主题自带还是?
      1. @Daimon 好像是WP自带的,总之因为缓存了页面而不执行PHP导致了统计失效,感觉好难搞。 :huaji21:
  5. 用上了,孩子表示很高兴 :huaji2: