开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面

未知 0条评论
关于 WordPress 的加速优化几乎都是个老生常谈的话题了,今天明月再给大家分享一个加速 WordPress 的方法,这个方法是基于 Nginx 的Web缓存方式。Web缓存是指一个 Web 资源(如 html 页面,图片,js,数据等)存在于 Web 服务器和客户端(浏览器)之间的副本

关于 WordPress 的加速优化几乎都是个老生常谈的话题了,今天明月再给大家分享一个加速 WordPress 的方法,这个方法是基于 Nginx 的 Web 缓存方式。Web 缓存是指一个 Web 资源(如 html 页面,图片,js,数据等)存在于 Web 服务器和客户端(浏览器)之间的副本。 缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的 URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。Nginx 的 Web 缓存一般推荐 FastCGI 方式,另外还有一个叫 Proxy 方式,两者的缓存效率大同小异,今天以 FastCGI 方式为主给大家分享一下。

开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面

其实在 Nginx 里使用 FastCGI 缓存得方法【张戈博客】很早就有分享,并且非常的详细,有兴趣的朋友可以参考【Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面】、【Nginx 配置多站点下的 Proxy_cache 或 Fastcgi_cache 缓存加速】这些文章,本文的大部分代码也是参考上述文章而来的,特此声明,在这里再次感谢【张戈博客】博客的分享!

其实早在 2015 年看到【张戈博客】的分享文章后明月就尝试在自己博客上部署了,非常遗憾的是当时得水平实在有限,无论如何都不成功,主要问题就是缓存不生效,缓存目录一直都是空的!当时是百思不得其解,反反复复的测试都以失败告终,最后值得暂时放弃转而研究缓存插件直至最后的动静分离和 CDN 服务。说实话一直都很不甘心,后来陆陆续续的又尝试过依旧是失败,也就慢慢的淡忘了。

上周闲来无事浏览【张戈博客】的时候又萌生了再次尝试的念头,这次对代码进行了细致严谨得分析,借助谷歌搜索排除一切知识盲点,基本算是差不多吃透代码精髓了。时不我待马上在自己的博客服务器上进行了尝试,第一次依旧失败,还是以前的失败结果,代码依旧如下:

  1. #下面 2 行的中的 wpcache 路径请自行提前创建,否则可能会路径不存在而无法启动 nginx,max_size 请根据分区大小自行设置

  2. fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;

  3. fastcgi_temp_path /tmp/wpcache/temp;

  4. fastcgi_cache_key "$scheme$request_method$host$request_uri";

  5. fastcgi_cache_use_stale error timeout invalid_header http_500;

  6. #忽略一切 nocache 申明,避免不缓存伪静态等

  7. fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

上述代码我是添加在 Nginx.conf 文件的 http{}中,这样放置主要是考虑到以后多站点维护的方便的,这次依旧失败我的分析感觉问题就出在这段代码,通过控制台终端命令 curl 获取站点 head 信息发现很有可能是 Nginx 转发过来的“Date”、“Server”、“X-Accel-…”等等应答使 FastCGI 的缓存规则没有生效。于是,在上述代码“忽略一切 nocache 声明……”注释的下面添加 fastcgi_hide_header Pragma;让 Nginx 不对从被代理服务器传来的应答进行转发,保存配置重启 Nginx 后,再次用 curl 获取站点头信息,出现 x-cache: MISS From www.qqcnw.com 了,哈哈!虽然是个未命中缓存的结果,但说明 FastCGI 缓存已经生效了,再次 curl 这个 x-cache 就变成 HIT From www.qqcnw.com 了,命中缓存!哈哈!成功了!

开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面

开启 Nginx 的 FastCGI 缓存

于是开启了 FastCGI Cache,下面给大家贴出完整代码以方便大家借鉴使用:

代码依旧参照【张戈博客】分享得教程文章里的代码,这次是多站点的,单站点的话注意看代码注释修改即可。

注:多站点的话,明月强烈建议大家将下面的代码放到 nginx.conf 里,这样便于统一管理,提高多站点管理的效率,单站点的话请自便。

  1. #站点 1 缓存配置

  2. fastcgi_cache_path /tmp/blogcache levels=1:2 keys_zone=blog:128m inactive=1d max_size=1G;

  3. #站点 2 缓存配置

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

  5. #Ps:代码中的参数都只是范例,实际使用请根据服务器配置自行修改

  6. fastcgi_cache_path /tmp/servicecache levels=1:2 keys_zone=service:128m inactive=1d max_size=1G;

  7. #其他配置可以不变

  8. fastcgi_temp_path /tmp/wpcache; #上面这些目录都需要手动提前创建好

  9. fastcgi_cache_key "$scheme$request_method$host$request_uri";

  10. fastcgi_cache_use_stale error timeout invalid_header http_500;

  11. #忽略一切 nocache 申明,避免不缓存伪静态等

  12. fastcgi_hide_header Pragma; #不对从被代理服务器传来的应答进行转发

  13. fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

上述代码中得 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。

完成了在 Nginx.conf 里上述代码的添加后,需要再在站点.conf 里添加缓存规则代码,具体如下:

  1.         set $skip_cache 0;

  2.         #post 访问不缓存

  3.         if ($request_method = POST) {

  4.             set $skip_cache 1;

  5.         }

  6.         #动态查询不缓存

  7.         if ($query_string != "") {

  8.             set $skip_cache 1;

  9.         }

  10.         #后台等特定页面不缓存(其他需求请自行添加即可)

  11.         if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {

  12.             set $skip_cache 1;

  13.         }

  14.         #对登录用户、评论过的用户不展示缓存(这个规则张戈博客并没有使用,所有人看到的都是缓存)

  15.         if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {

  16.             set $skip_cache 1;

  17.         }

  18.         #这里请参考你网站之前的配置,特别是 sock 的路径,弄错了就 502 了!

  19.         location ~ [^/]\.php(/|$)

  20.             {

  21.                 try_files $uri =404;

  22.                 fastcgi_pass  unix:/tmp/php-cgi.sock;

  23.                 fastcgi_index index.php;

  24.                 include fastcgi.conf;

  25.                 #新增的缓存规则

  26.                 fastcgi_cache_bypass $skip_cache;

  27.                 fastcgi_no_cache $skip_cache;

  28.                 add_header X-Cache "$upstream_cache_status From $host";

  29.                 fastcgi_cache blog;

  30.                 fastcgi_cache_valid 200 301 302 304 1d;

  31.         }

  32.         #缓存清理配置(可选模块,请细看下文说明)

  33.         location ~ /purge(/.*) {

  34.             allow 127.0.0.1;

  35.             allow "此处填写你服务器的真实外网 IP";

  36.             deny all;

  37.             fastcgi_cache_purge blog "$scheme$request_method$host$1";

  38.         }


  39.         location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

  40.                 access_log off; log_not_found off; expires max;

  41.         }


  42.         location = /robots.txt { access_log off; log_not_found off; }

  43.         location ~ /\. { deny  all; access_log off; log_not_found off; }


  44. }

至于说上述代码应该放到站点.conf 文件的 Server{}哪里,比较保险的建议放在站点 server_name 和 root 的下面为宜,理论上这样最完美。
注:代码中红色加粗的地方是需要对应 nginx.conf 里相应参数的以及需要修改为自己服务器的实际内容

需要注意的地方

给站点配置文件添加 FastCGI Cache 缓存规则代码的时候要注意注释掉类似 include enable-php.conf; 这样的引用,因为这个和代码里的 include fastcgi.conf; 重复了,不注释掉的话也会造成缓存规则不生效的现象,一般 LNMP 环境下默认站点配置文件里都有这个引用语句的,所以一定要记得排除注释掉哦!

在 fastcgi_cache_valid 里设定的是触发 FastCGI 缓存规则的 HTTP 状态码,因为明月是在使用了 CDN 后开启的 FastCGI 缓存的,所以我添加了 304 这个状态码以便兼容 CDN 回源(304 可不是重定向哦,这是个另类的 30X 系状态码)。

开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面

Nginx Helper 插件的安装和使用

到这里给 Nginx 开启 FastCGI 缓存基本就完成了,重启 Nginx 后缓存就开始生效了!因为 WordPress 是个动态的博客平台,访问者某篇文章发表评论、站长修改了某篇文章、回复了评论、发布了文章的等等这些动态操作都会对缓存有影响和改变,所以灵活的根据场景来清理缓存就很有必要了,WordPress 上就有一个插件是专门来针对 FastCGI 缓存管理的,叫做 Nginx Helper,这个插件可以在 WordPress 后台插件库里直接在线安装的。有关插件的详细使用请移步【Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面】一文了解,明月就不再多做赘述了!

明月一直没有向大家分享开启 Nginx 的 FastCGI Cache 缓存最主要得原因就是一直以来自己没有实测成功过,这次终于成功了就迫不及待的马上给大家分享出来,Nginx 的 FastCGI 缓存方式目前来看是 WordPress 站点相对很安全的一种缓存方式了,不像缓存插件在 PHP 代码层面的读写权限面临很大的漏洞风险,这种基于 Nginx 后端的缓存写入和读取就相对的安全了很多,并且从执行效率上来说也更加得高效了。目前明月所有的 WordPress 站点、包括负责托管得站点都开启了 FastCGI 缓存,经过多为站长好友测试反馈,速度提升非常的明显,建议大家也试试。

开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面



QQ菜鸟网提醒您:本活动还有秒将失效

本文地址:http://www.qqcnw.com/a/2875.html