关于 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·