前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开启 Nginx 的 FastCGI Cache 缓存,加速 WordPress 伪静态页面

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

作者头像
明月登楼的博客
发布2019-08-18 17:58:24
2K0
发布2019-08-18 17:58:24
举报
文章被收录于专栏:草根博客站长Live

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

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

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

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

代码语言:javascript
复制
#下面 2 行的中的 wpcache 路径请自行提前创建,否则可能会路径不存在而无法启动 nginx,max_size 请根据分区大小自行设置
fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m 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;

上述代码我是添加在 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 里,这样便于统一管理,提高多站点管理的效率,单站点的话请自便。

代码语言:javascript
复制
#站点 1 缓存配置
fastcgi_cache_path /tmp/blogcache levels=1:2 keys_zone=blog:128m inactive=1d max_size=1G;
#站点 2 缓存配置
#如果要开启更多站点缓存,请继续增加,注意每个站点的 缓存路径 和 keys_zone 要自定义区分一下
#Ps:代码中的参数都只是范例,实际使用请根据服务器配置自行修改
fastcgi_cache_path /tmp/servicecache levels=1:2 keys_zone=service:128m inactive=1d max_size=1G;
#其他配置可以不变
fastcgi_temp_path /tmp/wpcache; #上面这些目录都需要手动提前创建好
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切 nocache 申明,避免不缓存伪静态等
fastcgi_hide_header Pragma; #不对从被代理服务器传来的应答进行转发
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 里添加缓存规则代码,具体如下:

代码语言:javascript
复制
        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;
        }
        #这里请参考你网站之前的配置,特别是 sock 的路径,弄错了就 502 了!
        location ~ [^/]\.php(/|$)
            {
                try_files $uri =404;
                fastcgi_pass  unix:/tmp/php-cgi.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";
                fastcgi_cache blog;
                fastcgi_cache_valid 200 301 302 304 1d;
        }
        #缓存清理配置(可选模块,请细看下文说明)
        location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow "此处填写你服务器的真实外网 IP";
            deny all;
            fastcgi_cache_purge blog "$scheme$request_method$host$1";
        }
        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)$ {
                access_log off; log_not_found off; expires max;
        }
        location = /robots.txt { access_log off; log_not_found off; }
        location ~ /\. { deny  all; access_log off; log_not_found off; }
}

至于说上述代码应该放到站点.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 缓存,经过多为站长好友测试反馈,速度提升非常的明显,建议大家也试试。

·END·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 草根博客站长有话说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站建设
网站建设(Website Design Service,WDS),是帮助您快速搭建企业网站的服务。通过自助模板建站工具及专业设计服务,无需了解代码技术,即可自由拖拽模块,可视化完成网站管理。全功能管理后台操作方便,一次更新,数据多端同步,省时省心。使用网站建设服务,您无需维持技术和设计师团队,即可快速实现网站上线,达到企业数字化转型的目的。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档