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

100人浏览   2024-08-09 08:47:19

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



  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.imydl.com 了,哈哈!虽然是个未命中缓存的结果,但说明 FastCGI 缓存已经生效了,再次 curl 这个 x-cache 就变成 HIT From www.imydl.com 了,命中缓存!哈哈!成功了!


开启 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 Helper 插件的安装和使用

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

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

相关推荐