MrXiao

迅速提高你的WordPress网站速度 利用fastcgi_cache实现Nginx全静态网站缓存加速
各位站长初次接触WordPress估计不是在什么高端的服务器上吧?那么在性能欠佳的服务器上怎么样才能实现网站速度的...
扫描右侧二维码阅读全文
30
2016/01

迅速提高你的WordPress网站速度 利用fastcgi_cache实现Nginx全静态网站缓存加速

各位站长初次接触WordPress估计不是在什么高端的服务器上吧?那么在性能欠佳的服务器上怎么样才能实现网站速度的进一步提高呢?类似什么WP-Super-Cache等缓存类插件可能各位已经试了不少却没有一款能让你满意的吧?既然是缓存加速,自然要从系统底层也就是Nginx等服务端做起,从PHP端做起总觉得少点什么。当然,这里给出一些PHP缓存插件教程:

1、WP-Super-Cache 备用来源

2、Hyper Cache

3、W3 Total Cache(个人认为性能最强,综合性最好,使用本方法前博主使用的插件)
现在,如果你是VPS/独立服务器用户并且使用LNMP架构,那么本文十分适合你!由于这是博主第一次写技术性文章,为了方便小白站长语言都比较简洁朴素,希望老鸟勿追着打。教程正文开始~

本教程参考资料(转载保留出处,请自觉遵守CC协议):

1、张戈博客① 张戈博客② 张戈博客③

2、英文摘录,过了CET6的应该没问题——https://easyengine.io/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/

<h2>步骤一——编译安装ngx_purge_cache模块</h2>
<h3>1.检查是否安装</h3>
nginx -V | grep nginx-cache-purge -o

如果显示nginx-cache-purge即代表已安装。
若未安装,请使用以下命令安装(仅适用于Debian/Ubuntu 用apt-get方式安装的nginx):

sudo add-apt-repository ppa:brianmercer/nginx
sudo apt-get update
sudo apt-get install nginx-custom

若是CentOS用户,请参照一键安装包方法。

如果你是lnmp.org一键安装包或CentOS用户且不想深究此教程原理,可以使用以下无脑粗暴方法。如果你是爱学习的好孩纸,请继续阅读。

mkdir /home/cache/wpcache -p
cd ~
./lnmp stop
apt-get install git -y #centos用yum install git -y
git clone https://github.com/FRiCKLE/ngx_cache_purge
wget http://soft.vpser.net/web/nginx/nginx-1.0.15.tar.gz
tar zxvf nginx-1.0.15.tar.gz
cd nginx-1.0.15/
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --add-module=../ngx_cache_purge
make
make install
/root/lnmp start

<h2>步骤二——配置fastcgi缓存</h2>
<h3>1.修改nginx.conf</h3>
lnmp.org的一键包在/usr/local/nginx/conf/nginx.conf,其他的自行搜索 find / -name nginx.conf)

code

#在http层添加以下三行代码
fastcgi_cache_path /home/cache/wpcache levels=1:2 keys_zone=wpcache:10m inactive=20m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#wpcache为名字,可以随便修改。10m为内存占用

其中,/home/cache/wpcache是定义的缓存目录,keys_zone=wpcache:10m中,wpcache是可自定义的,但要与下文保持一致,10m是这个缓存可以占用的内存大小,inactive是缓存过期时间,20m代表20分钟。若要设置成一天,请将参数设置为1d。
<h3>2.修改站点conf文件</h3>

log_format example.com '$remote_addr - $remote_user [$time_local] $request '
'$status $body_bytes_sent $http_referer '
'$http_user_agent $http_x_forwarded_for';
server {
server_name example.com www.example.com;
access_log /home/wwwlogs/example.com.access.log;
error_log /home/wwwlogs/example.com.error.log;
root /home/wwwroot/example.com;
include wordpress.conf;
index index.php;
set $no_cache 0;
# 不缓存POST操作
if ($request_method = POST) {
set $no_cache 1;
}
if ($query_string != "") {
set $no_cache 1;
}
# 不缓存后台
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $no_cache 1;
}
# 已登录的不缓存(防止留言串号)
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $no_cache 1;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
try_files $uri /index.php;
include fastcgi_params; #Lnmp.org一键包改成include fcgi.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock; #Lnmp.org一键包改成fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache wpcache; #要跟前面设置的名称一样
fastcgi_cache_valid 30m; #缓存时间
}
location ~ /purge(/.*) {
allow 11.22.33.44; #此处该为你vps的ip
allow 8.8.8.8;
allow 127.0.0.1;
deny all;
fastcgi_cache_purge wpcache "$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 = /favicon.php { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ /\. { deny all; access_log off; log_not_found off; }
}

如果以上配置报错,请使用张戈提供的单站点配置优化。

#下面各个参数的含义请自行百度,我就不赘述了
#下面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;
server
{
listen 80;
#请修改为自己的域名
server_name xlinblog.net;
index index.html index.htm index.php default.html default.htm default.php;
#请修改为自己网站的存放路径
root /home/wwwroot/xlinblog.net;
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 WORDPRESS;
fastcgi_cache_valid 200 301 302 1d;
}
location / {
#此处可以添加自定义的伪静态规则(之前你新增的伪静态规则可以添加到这,没有就不用了)
try_files $uri $uri/ /index.php?$args;
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
}
#缓存清理配置(可选模块,请细看下文说明)
location ~ /purge(/.*) {
allow 127.0.0.1;
allow "此处填写你服务器的真实外网IP";
deny all;
fastcgi_cache_purge WORDPRESS "$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; }
#请注意修改日志路径
access_log /home/wwwlogs/xlinblog.net.log access;
}

请注意,这仅是单站点配置。如果你的Nginx上运行了两个或以上站点,下文将为你解决。
<h3>3.多站点配置</h3>
请在Nginx.conf的http模块中加入以下内容。

#站点1缓存配置
fastcgi_cache_path /tmp/mcfuzhu_cache levels=1:2 keys_zone=mcfuzhu:384m inactive=1d max_size=5G;
#站点2缓存配置
#如果要开启更多站点缓存,请继续增加,注意每个站点的 缓存路径 和 keys_zone 要自定义区分一下
#Ps:代码中的参数都只是范例,实际使用请根据服务器配置自行修改
fastcgi_cache_path /tmp/linblog_cache levels=1:2 keys_zone=xlinblog.net:384m inactive=1d max_size=5G;
#其他配置可以不变
fastcgi_temp_path /tmp/temp_cache;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;

请注意,以上提到的所有目录请先建立好,否则Nginx重启时会报错的哦~

然后,请按上面单站点的格式配置好每个域名的server模块,请注意区分每个站点的缓存路径和keys_zone。
<h2>步骤三——安装WordPress专用清理Nginx缓存插件——Nginx Helper</h2>
请先下载子霖博客准备好的zip插件包1.9.5版,安装后不要升级到最新版本,经各位测试发现1.9.5版本兼容性较好且博主准备的插件包自带了后面应对清理缓存后502的代码。

博客年久失修,文件已丢失,请各位下载wordpress原版。

安装完成后,请在wp-config.php中添加此代码:

define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache');

安装启用后,你可以按博主推荐的方式配置此插件。这里借一张图来描述一下插件设置各项的意义。

插件配置

在安装完成后,你就可以用Chrome内核浏览器打开你网站的任意网页畅享飞一般的流畅。如果插件成功安装与配置,在配置中勾选Enable Nginx Timestamp in HTML后,在源代码最后应该可以看到这么一项:

实例

<!-- 本页面已经被纯静态缓存,只有在文章、评论更新时本页面才会更新。缓存时间:2016-01-30 21:32:59。 缓存时执行了86 个请求,在 0.366秒内。 -->

(博主无齿的加了一条小广告,介意的强迫症站长可以从插件的nginx-helper.php文件中自行修改。)

在HTML的包头Headers中,你也应该可以看见如图所示。

缓存状态

X-Cache 一般会有3个状态:MISS、HIT、BYPASS。

  • MISS表示未命中

即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态(图略)。

  • HIT表示缓存命中

打开一个会缓存的页面,比如文章内容html页面,F5刷新几次即可在F12开发者模式当中的Header头部信息中看到缓存命中状态。

  • BYPASS表示缓存黑名单

即页面路径在Nginx规则中被设置成不缓存(set $skip_cache 1;),比如WP后台。

 
<h2>步骤四——解决清理缓存后全站502的窘况</h2>
不少站长安装完Nginx Helper插件之后急忙点击了Purge Cache来试试清理效果,结果首页直接空白了- -囧……博主第一次用的时候也是受害者还折腾了蛮久才弄明白。

经张戈测试,清理缓存后重载Nginx效果更佳,可我们不可能发表一篇文章就去ssh重载一遍呀~

所以,我们得到的解决方案是将插件的清理功能中配上一个php执行Linux命令的功能就好办啦。

首先请做好前提工作:

  1. 修改php配置文件php.ini,先找到safe_mode配置,确认safe_mode=off,即关闭php安全模式(lnmp一键安装包默认已经是关闭的了);
  2. 继续找到disable_functions配置,将其中的 exec 删除,即允许执行exec()函数;
  3. 最后重载php-fpm或php即可生效,比如lnmp环境可以执行 service php-fpm reload命令。

Ps:开启exec函数存在被恶意注入的风险!请各位站长三思而后行,不过做好了备份什么的话没什么大不了的。

然后,用FlashFXP连接ssh,修改/etc>/sudoers文件,在文件的最后一行加上:
www ALL=(root) NOPASSWD:/usr/local/nginx/sbin/nginx -s reload

这行代码的含义即允许www账户没有密码以root权限执行重载nginx命令。

然后用记事本等文本编辑器将以下内容保存为reload_nginx.sh文件,上传至/opt/,使得文件路径为/opt/reload_nginx.sh。(请不要随意修改文件路径,因为上文提供的插件使用的是这个路径)

/usr/bin/sudo /usr/local/nginx/sbin/nginx -s reload

给这个文件赋上读取执行权限:

chmod +xr /opt/reload_nginx.sh

这样,每次无论是我们手动清理缓存还是自动清理缓存都会重载一个nginx,重载操作对网站的正常访问几乎没有任何影响,如果你还开启了CDN的话更不用说啦~

 

 
<h2>博主有话说</h2>
其实这个方法最好与百度云加速等静态化CDN配合使用,完全可以打造出腾讯网易等门户级网站访问速度哦,下一次博主会给大家带来如何正确的配置CDN以达到缓存的最佳效果,敬请期待~

Last modification:February 6th, 2019 at 10:31 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment