wordpress加速优化(二)配置Nginx fastcgi_cache缓存

技术文档3946阅读模式

如果你用的wordpress建站,之前已经配置Redis缓存进行了数据库缓存优化

本文介绍的是Nginx开启fastcgi_cache缓存加速,直接使用Nginx为页面生成缓存来加速wordpress,而且还支持html伪静态页面,效率较高,也比较适合小配置的VPS上使用。下面飞牛尽量用最精简的语言准确地描述开启Nginx fastcgi_cache加速的过程,请严格遵照步骤操作。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

一、Nginx配置实例

宝塔默认已经安装ngx_cache_purge模块,只需要通过修改配置文件来启用此模块。选择对应网站,点击设置,修改配置文件!(注意这里的配置文件,是对应网站的配置文件,不是主nginx模块的配置文件)文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

1、首先,将以下代码复制到配置文件顶部(里面代码需要在dev/shm/目录创建新文件夹,命名为nginx-chache(记住Nginx-cache)很重要!):文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_path /dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

wordpress加速优化(二)配置Nginx fastcgi_cache缓存
2、然后在server字段下添加以下代码,建议按照飞牛的添加在 #SSL-END下方:文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

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;
        }
       #如果需要对所有用户缓存,请将以上代码改为下方的,两段代码只可任选其一
        #if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+") {
            #set $skip_cache 1;
        #}
        #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!关于sock,宝塔面板的在/www/server/php/74/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;  
                add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
                #新增的缓存规则
                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;
        }
 
        #缓存清理配置(可选模块,请细看下文说明)
        location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow "服务器公网IP";
            deny all;
            fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
        }

注意代码里面需要修改的地方文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

1)add_header Cache-Control如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

2)sock的路径一定要填对,否则会出现502错误,关于sock,宝塔面板的在/www/server/php/74/etc/php-fpm.conf中有配置路径宝塔面板的sock。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

3)代码里面的服务器公网IP换成你的服务器公网IP。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

二、安装WordPress插件Nginx Helper

前面步骤完成后,我们需要在wordpress后台安装插件,进入WordPress 后台插件安装界面搜索 Nginx Helper 关键词在线安装即可。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

1、开启purge,选择nginx Fastcgin cahe,因为就我们用就是这个缓存。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

2、选择 Delete local server cache files。当然第一个也可以用,但是一般推荐用Delete local server cache files,因为每个服务器的环境都不一样,缓存路径也会不尽相同就会导致插件无法找到缓存文件并删除!文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

3、插件下面还提供了其它的一些设置,功能非常丰富,例如发表新文章、新评论时是否更新Nginx缓存等,根据自己需要勾选即可。
wordpress加速优化(二)配置Nginx fastcgi_cache缓存文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

清理模式选择文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

①、purge 模式文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了 CDN 的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实 IP,以便插件直接请求 purge 路径,而不用走 CDN 节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

②、文件模式文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

模式二是直接清理对应的缓存文件,不需要请求 purge 这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人使用这个模式)。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

三、修改缓存路径

由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

添加以下代码到WordPress根目录的wp-config.php文件中。文章源自飞牛士 FeiNews-https://www.feinews.com/experience/998.html

define('RT_WP_NGINX_HELPER_CACHE_PATH','/dev/shm/nginx-cache');

飞牛是将缓存文件配置在内存里的,毕竟内存OI比一般的普通磁盘要快。如果你磁盘性能较好,挂载目录为/data或者使用系统盘,那么就需要修改/dev/shm/nginx-cache为你的实际缓存磁盘!
保存以上的内容,重新启动Nginx,这样就成功实现了fastcgi_cache缓存。

四、细节调整

1、如果出现评论过的用户依然用的是缓存,那应该是wordpress没有记住cookie,把以下代码加入到functions.php 中即可。

add_action('set_comment_cookies','coffin_set_cookies',10,3);
function coffin_set_cookies( $comment, $user, $cookies_consent){
   $cookies_consent = true;
   wp_set_comment_cookies($comment, $user, $cookies_consent);
}

2、启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:
Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache
修改宝塔面板中php7.4配置文件中的session.cache_limiter,默认值是nocache,将它设置为none即可,如图:
wordpress加速优化(二)配置Nginx fastcgi_cache缓存

五、效果检测

服务器的缓存路径中能看到Nginx fastcgi_cache生成的缓存文件。wordpress加速优化(二)配置Nginx fastcgi_cache缓存

wordpress加速优化(二)配置Nginx fastcgi_cache缓存刷新页面,当前端页面头部header出现如下图所示的HIT,表示命中,fastcgi_cache缓存加速成功配置。
对于已经设置了不缓存的页面,Nginx fastcgi_cache会直接显示BYPASS,如果是登录状态是不显示缓存的。

按照教程一顿操作以后,你已经部署了后端redis和前段页面Nginx fastcgi_cache,你的wordpress应该在速度上有一个很大的提高。

如果想继续加快网站的访问速度,你可以利用对象存储和cdn进行动静分离和加速。关于这个,飞牛也是折腾了很多次也很久,最终慢慢掌握了点道道,你可以参考下面的文章。

wordpress实现动静分离(对象存储+CDN)

评论  3  访客  3
    • 夏目贵志
      夏目贵志 5

      typecho 也有类似的教程

      但是我开启了pjax 不知道会不会出问题 一直没去折腾看看!!

        • 飞牛
          飞牛

          @ 夏目贵志 你这有备案放国内,而且typecho又轻量,其实不用太折腾优化之类的。我这主要还是WordPress,又放境外小水管,图片比较多,只能这样。

            • 夏目贵志
              夏目贵志 5

              @ 飞牛 我现在用的香港 哈哈 8核16g内存的主机 一天2元,感觉国外的性价比高就搬家出来了!

              图床可以试试 https://www.jingtaiboke.com/unicloud-upload-demo.html 你搞过网站应该懂得!!

              图片全是阿里云cdn加速免费的。就是我那你问我的图床哈 !当然你也可以放我这里 但是你不要介意图片子在我这里!

        匿名

        发表评论

        匿名网友 填写信息

        :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

        确定