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

2019-08-0317:25:35 28 738
摘要

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

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

最后再次感谢【张戈博客】的分享和【自然博客】的热心帮助。

历史文章推荐:

  • 本博客公众号
  • 扫一扫关注!
  • weinxin
  • 本博客小程序
  • 微信内浏览本博客
  • weinxin

发表评论

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

目前评论:28   其中:访客  14   博主  14

    • 扫地僧一宿 扫地僧一宿 0

      nginx helper无法清理缓存。后台点击一键清理缓存后,查看服务器里面缓存文件仍然存在。

      • 耘宁 耘宁 0

        感谢博主,找了好几个,最后看博主文章折腾成功了,还想请教下Redis Cache和FastCGI Cache可以同时使用吗?是否有冲突还是说互补得

          • 明月登楼 明月登楼 Admin

            @耘宁 最好不要同时使用!选择一个使用就可以了!

          • buvidcai buvidcai 1

            请问博主有安装ngx_cache_purge模板吗?张戈博客上是有安装的,但是这篇文章没有提及。很怀疑那个5年没更新模板的可用性。

              • 明月登楼 明月登楼 Admin

                @buvidcai 不是模版,是Nginx模块!当然用了的!基于Nginx层面的,前端是不会看到的!不是插件、不是模版,是模块,五年没更新不是更能说明这个模块的高可用性和安全性嘛?

                  • buvidcai buvidcai 1

                    @明月登楼 感谢博主的回复,五年没更新我第一时间想到的是作者放弃维护,未能想到这个nginx模块已经十分完善。嗯,今天就安装。

                      • 明月登楼 明月登楼 Admin

                        @buvidcai 不客气模块对应的WordPress插件,一直都在更新的!所以这个非常安全的!不过,我个人倒是感觉插件用处不是很大,基本上缓存的机制很完美,一般设定的缓存规则就可以了,到期自动生成就是了,插件和模块用处不大!

                      • buvidcai buvidcai 1

                        @明月登楼 你好,博主。
                        请问,
                        x-cache及其他所有add_header都不显示,但是fastcgi_cache_path有文件生成,是否算成功缓存。
                        有时候主页会出现css和js变成http协议的而不加载,rm -rf fastcgi_cache_path后恢复,这是正常吗?

                          • 明月登楼 明月登楼 Admin

                            @buvidcai 不正常,缓存不会去改变http协议的,同时既然生成了缓存,那么就意味着得让前端命中缓存,连x-cache都不显示,那就是说没有命中缓存!仅仅是生成了缓存而已!

                              • buvidcai buvidcai 1

                                @明月登楼 实在是不知道哪里出了问题,但是按着博主的教程重新来了一遍,在各个方面尽量相同,最后终于成功了。似乎是与我原先的其他配置重合了。感谢博主。

                                • 明月登楼 明月登楼 Admin

                                  @buvidcai 不客气!

                          • 一线 一线 1

                            领导,是“/www/server/panel/vhost/nginx/你的域名.conf”这个吧。。

                              • 明月登楼 明月登楼 Admin

                                @一线 是的,具体位置根据你服务器配置部署不同而不同!只能你自己去找了!

                                  • 一线 一线 1

                                    @明月登楼 算是将就着搞定了,但是加了两行代码
                                    add_header X-Cache-Status $upstream_cache_status;
                                    add_header X-Cache-Status “$upstream_cache_status From $host”;
                                    add_header X-Cache “$upstream_cache_status From $host”;
                                    最后显示:
                                    x-cache-status: HIT
                                    x-cache-status: HIT From www.xxxxx.com
                                    但是不知道X-cache为什么不显示

                                      • 明月登楼 明月登楼 Admin

                                        @一线 不知道呀,主要还得看你怎么配置了!出现HIT不就行了!

                                  • 一线 一线 1

                                    领导,“上述代码应该放到站点.conf 文件的 Server{}”,wordpress的这个文件在哪。。。

                                      • 明月登楼 明月登楼 Admin

                                        @一线 跟WordPress没有关系,是放在你服务器上WEB服务器站点配置文件里的,比如:Nginx的站点配置文件!

                                      • 闲鱼 闲鱼 6

                                        你们缓存这方面真的折腾好多啊,点赞,我现在就是过得去就行了,除非能快的飞起 :mrgreen:

                                          • 明月登楼 明月登楼 Admin

                                            @闲鱼 呵呵,FastCGI缓存的好处其实就是减轻服务器的压力而已!对速度的影响其实不大,不过,我这里感觉倒是蛮明显的!

                                          • boke112导航 boke112导航 9

                                            看到服务器的代码就头疼,我宁愿去折腾主题代码,目前还是稳定比较好,不想折腾服务器了

                                              • 明月登楼 明月登楼 Admin

                                                @boke112导航 这个代码我都头疼N年了,直到前天才算是折腾成功,所以发文纪念一下!

                                              • 孙若 孙若 0

                                                不想动

                                                  • 明月登楼 明月登楼 Admin

                                                    @孙若 看自己需求了,至少我感觉速度还是很不错的!

                                                  • 小石 小石 4

                                                    来顶顶 :mrgreen: :mrgreen: