使用Nginx FastCGI Cache缓存WordPress

前言

目前Wordpress缓存方案有很多,主流的静态页面缓存插件也是有很多,代表的WP RocketWP super cacheW3 Total Cache等,也有用key-value缓存数据库的方案,代表的有RedisMemcached缓存方案。前者静态页面插件采用PHP方式把页面缓存为静态文件,访问的时候通过Nginx-PHP-数据库-静态缓存页面,后者是通过Nginx-PHP-键值缓存数据库-生产页面。通过以上对比我们就会发现,都依然无法避免访问到后台的PHP和数据库或者键值缓存数据库。而我们理想最快的方式是通过Nginx直接访问静态页面,但是可惜除了整站生成静态没有其他办法,并且整站静态的文件更新是个大问题。因此很多人采用了Nginx FastCGI Cache缓存方案。让Nginx通过自带的FastCGI Cache直接缓存页面到内存,访问的时候可以最快的访问到我们请求的页面。

1.Nginx FastCGI Cache是什么?

NGINX中的fastcgi_cache缓存器是用于缓存动态生成的内容的,以减轻后端服务器的负担并提高网站的性能。当请求到达NGINX时,如果缓存中已经有了对应的响应,NGINX将直接返回缓存中的响应,而不需要再向后端服务器发起请求。这可以大大减少网站的响应时间和服务器负载。

fastcgi_cache缓存器的底层原理是在内存中缓存动态内容的响应。当有请求到达时,NGINX将检查缓存中是否有对应的响应,如果有,就直接返回缓存的响应,如果没有,就向后端服务器发起请求,并将响应缓存起来。缓存的响应是根据缓存键(cache key)来存储的。缓存键是一个字符串,由多个变量组成,如请求协议、请求方法、主机名、URI等。

在使用fastcgi_cache缓存器时,您可以根据需要配置缓存的失效时间、缓存的大小、缓存的键等。缓存的失效时间可以根据您的应用程序的实际情况进行设置,以确保缓存的内容始终是最新的。缓存的大小可以根据服务器的内存容量和应用程序的负载进行调整,以确保缓存不会过度消耗服务器资源。缓存的键可以根据您的应用程序的逻辑进行设置,以确保缓存的命中率最高。

总之,fastcgi_cache缓存器是一个非常有用的工具,可以帮助您优化网站的性能,降低服务器负载,提高用户体验。但需要注意的是,缓存器的设置和优化需要根据具体的应用程序和服务器环境进行调整。

2.如何实现FastCGI Cache缓存Wordpress

我们需要对FastCGI Cache做的任务如下:

  1. 设置缓存池信息(fastcgi_cache_path);
  2. 设置缓存key(fastcgi_cache_key);
  3. 过期文件处理(fastcgi_cache_use_stale)
  4. 缓存策略(fastcgi_cache_bypass/fastcgi_no_cache
  5. 后端请求成功时缓存时间(fastcgi_cache_valid
  6. 增加了调试信息头(add_header)

2.1Nginx.conf缓存配置

在Nginx.conf配置文件的server之前增加FastCGI缓存的配置:

FastCGI缓存可以选择文件缓存还是内存缓存:

  • 在fastcgi_cache_path中,可以将它设置为内存缓存路径,例如:/dev/shm/nginx-cache,如果你的磁盘IO不够快的话建议采用此方式,内存的读取速度是最快的。
  • 正常我们也可以使用文件缓存路径:/tmp/nginx-cache

选择好了以后,需要在对应的目录(/dev/shm或者/tmp)下创建对应的文件夹nginx-cache

单站点(文件缓存):

fastcgi_cache_path /tmp/nginx-cache levels=1:2 keys_zone=zach:256m inactive=1d max_size=1G;
#公共缓存配置
fastcgi_temp_path /tmp/nginx-cache/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;
Bash

多站点(文件缓存):

#站点 1 缓存配置
fastcgi_cache_path /tmp/nginx-cache/xxx levels=1:2 keys_zone=xxx:128m inactive=1d max_size=1G;
#站点 2 缓存配置
fastcgi_cache_path /tmp/nginx-cache/yyy levels=1:2 keys_zone=yyy: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;
Bash

注意:如果要开启更多站点缓存,请继续增加,注意每个站点的 缓存路径 和 keys_zone 要自定义区分一下,不要一样。

注意:

上述代码中得 fastcgi_cache_path 的参数也可以根据自己站点的需要来设定,具体含义如下:

  • path 表示缓存存放目录。
  • levels 表示指定该缓存空间有两层 hash 目录,第一层目录为 1 个字母,第二层目录为 2 个字母,保存的文件名会类似/tmp/blogcache/c/29/XXXXXX ;
  • keys_zone 参数用来为这个缓存区起名。
  • 128m 指内存缓存空间大小为 128MB。
  • inactive 的 1d 指如果缓存数据在 1 天内没有被访问,将被删除。相当于 expires 过期时间的配置。
  • max_size 的 1g 是指硬盘缓存空间为 1G。

2.2.增加缓存规则

缓存规则需要根据站点的本身的设置,不同类型的CMS使用的不一样。下面是针对Wordpress的配置:

# Cache 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/|/wp-admin/*|/wp-json/*|/xmlrpc.php|wp-.*.php|/feed|/rss|/pay|/notify|/opc|/p.php|/return|/download|/redirect|index.php|sitemap.xml|sitemap(_index)?.xml|sitemap.*.xml|sitemap.*.*.xml") {
             set $skip_cache 1;
         }  
       #对登录用户、评论过的用户不展示缓存
         if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|wordpress_logged_in_[a-f0-9]+") {
             set $skip_cache 1;
         }
         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";
                 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 xxx;
                 #fastcgi_cache_valid 200 301 302 1h;
                 fastcgi_cache_valid 200 12h;
                 fastcgi_cache_valid 301 302 3d;
                 fastcgi_cache_valid 304 1d;
                 #expires 45m;
         }
     # Cache END #
     
     # Cache purge START #
         location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow 服务器IP;
            deny all;
            fastcgi_cache_purge xxx "$scheme$request_method$host$1";
         }    
     # Cache purge END #
Bash

2.3注意事项:

1.以上规则设置需要注意fastcgi_cache这里需要写上文对应的keys_zone,这也是不同站点用不同keys_zone的原因。

2. add_header Cache-Control如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些,单位是秒。

3.代码里面的服务器公网IP换成你的服务器公网IP。

4.可选缓存配置:某些主题如果移动端访问报错,可以设置不缓存移动端 :

    #不缓存移动端访问
    if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|windowss(ce|phone))) {
            set $skip_cache 1;
    }
Bash

5.以上配置需要放置在server段。

6.如果出现评论过的用户依然用的是缓存,那应该是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);
}
Bash

7.启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,可以修改你php.ini配置文件中的session.cache_limiter设置:

session.cache_limiter=none
Bash

3.Wordpress Nginx FastCGI Cache缓存管理插件

WordPress后台安装Nginx Helper 插件后,点击Setting设置,开启Enable Purge,启用nginx Fastcgi cache (requires external settings for nginx),你还可以再页面源码底部增加FastCache的缓存时间戳:开启Enable Nginx Timestamp in HTML;选择Delete local server cache files.

插件使用注意事项:插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除。添加以下代码到WordPress根目录的wp-config.php文件中。

define('RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/nginx-cache/');
Bash

4.缓存效果验证:

采用浏览器开发工具重点网络响应标头,查询其中的缓存标识:

X-Cache:HIT From zach.vip

  • HIT代表缓存命中
  • MISS 代表没有找到缓存
  • BYPASS 代表跳过缓存
  • EXPIRED 代表缓存过期

同时我们可以查看网页源码的时间戳:

<!--Cached using Nginx-Helper on 2024-04-19 21:37:12. It took 347 queries executed in 0.811 seconds.-->
<!--Visit http://wordpress.org/extend/plugins/nginx-helper/faq/ for more details-->

愿你的网站飞起来!!!


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注