使用WordPress建站的过程中,对于优化WordPress性能、加快网站访问速度这一环节走了不少的“弯路”。当网站出现访问缓慢、CPU内存耗尽的情形时,最开始想到的是升级服务器配置,后来发现有些无良的VPS商家背后限制资源严重,加钱升级真的很伤人。
最大的体会就是同样的配置,在不同的VPS商家那里跑同一个网站,在同样的流量情况下,居然一个顺畅而另一个卡顿,这个给我最大的感受就是在购买VPS之前一定要看看别人的评测,尤其是VPS主机性能评测这一块,一定要仔细对比,否则容易花不少冤枉钱。
后来给Wordpress做优化时,关注在页面缓存上,之前用过的缓存插件包括但不限于WordPress Super Cache、WP Fastest Cache、W3 Total Cache、cos-html-cache、Cachify……总得来说,安装了缓存插件后提速还是有效果的,但是也带来了不少的问题。
为何要开启Nginx fastcgi_cache缓存?
说到wordpress的缓存,大家最常见也最容易想到的肯定是 WP-Super-Cache 的静态html缓存,以及 memcached 或 redis 动态缓存,插件的缓存效果肯定是有的,但是容易出现各种问题,比如配置很复杂、配置全英文、插件之间的冲突等。
还比如配置复杂、生成规则、插件冲突以及无法应对突发流量,也就是说使用缓存插件还是无法达到应对大流量冲击的情况。最后,在朋友的推荐下启用了Nginx fastcgi_cache缓存,直接使用Nginx为页面生成缓存,效率比使用PHP缓存插件要高得多,特别适合小配置的VPS上使用。
所以今天我要教大家一个更高级的缓存:Nginx fastcgi_cache缓存,直接在nginx层面缓存页面,还支持缓存伪静态!效果比起传统的php缓存好得太多了,因为很多人使用宝塔面板,所以今天的教程是基于宝塔面板的教程。
准备事项
- 备份网站、服务器镜像备份(安全第一、有备无患)
- 宝塔切换Nginx 版本为Tengine
- 宝塔面板Nginx全局配置
- 宝塔面板wordpress网站配置
- 安装WordPress清理缓存插件Nginx Helper
- 判断缓存状态
- 停用、卸载WP Super Cache缓存插件
备份网站、服务器镜像备份
每一次重要的更新升级动手前,都建议大家先给网站做备份、最好是服务器也做个镜像备份最保险。
开始配置
现在宝塔面板都默认编译了 Nginx ngx_cache_purge 模块,所以我们直接跳过安装方法。
如果不确定有没有安装,可以先检测下当前服务器环境是否有安装过。
链接ssh,运行下面代码,如果显示 ngx_cache_purge 则标识已安装。
nginx -V 2>&1 | grep -o ngx_cache_purg
宝塔切换Nginx 版本为Tengine
Nginx 的版本Tengine性能方面要更好一些,所以建议切换。
设置前的简单说明
本地or内存?在fastcgi_cache_path和fastcgi_temp_path中,有人会建议将它设置为内存路径,例如:/dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:200m inactive=60m;
,如果你的磁盘IO很慢的话建议采用此方式,毕竟内存的读写速度非常快。
请仔细阅读代码中的所有注释,该修改的修改,该创建的创建,该补充的根据实际情况补充,额,基本没什么问题的,宝塔面板的直接复制粘贴就可以了。
宝塔面板Nginx全局配置
在服务器根目录创建 /tmp/wpcache,/tmp/wpcache/temp 并且给这两个目录 755 或 777 权限
/tmp/wpcache
/tmp/wpcache/temp
来到宝塔后台,在软件商店找到Nginx,点击设置按钮,在配置修改中 server 之前添加以下内容:
fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:200m 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;
这里需要注意一下,WORDPRESS:200m的意思是分给缓存200M的内存,如果你的可用内存少于200M会出现保存失败,同理,你的内存很大,你可以分配500M都没问题 这个按配置来。
加好之后截图如下:
宝塔面板wordpress网站配置
在宝塔后台的网站列表中,找到你的网站,并且点击设置按钮,然后在 #SSL-END 后加入将以下代码添加到配置文件中去:
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.xml|/sitemap_*.xml|sitemap(_index)?.xml|sitemap-*.xml|/pay|/notify|/return|/download") {
set $skip_cache 1;
}
#对登录用户、评论过的用户不展示缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9] |wp-postpass|wordpress_no_cache|wordpress_logged_in|b2_token") {
set $skip_cache 1;
}
#这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!如果你的网站使用PHP7.4,就写-74.sock
location ~ [^/].php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
#新增的缓存规则
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache "$upstream_cache_status From $host";
fastcgi_cache WORDPRESS;
add_header Cache-Control max-age=0;
add_header Nginx-Cache "$upstream_cache_status";
add_header Last-Modified $date_gmt;
add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
add_header X-XSS-Protection "1; mode=block"; # XSS 保护
etag on;
fastcgi_cache_valid 200 301 302 1d;
}
#缓存清理配置
location ~ /purge(/.*) {
allow 127.0.0.1;
allow "服务器外网IP"; # 引号要保留
deny all;
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
这里要注意下,要修改 allow "服务器外网IP"; # 引号要保留 中的ip为自己服务器的真实ip;
add_header Cache-Control
如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些。
加好之后的截图如下:
特别注意sock的路径,弄错了就502了!关于sock,宝塔面板的在 /www/server/php/你的php版本/etc/php-fpm.conf 中有配置路径宝塔面板的sock添加好之后,重载Nginx设置,缓存就加好了。
安装WordPress清理缓存插件Nginx Helper
配置好了fastcgi_cache缓存之后,我们需要安装插件, fastcgi_cache 有一个量身定做的 WordPress 缓存清理插件:Nginx Helper。
这个插件不定时更新,而且更新的很频繁。安装这个插件 ,非常简单,直接进入 WordPress 后台插件安装界面搜索 Nginx Helper 关键词在线安装即可。
这个插件是为 wordpress fastcgi_cache缓存 打造的一个插件,十分的好用,插件设置页面如下:
首先是选中 Enable Purge
开启purge,然后我们选择 nginx Fastcgin cahe
,因为就我们用就是这个缓存,之后选择 Delete local server cache files
,当然第一个也可以用,但是一般推荐用Delete local server cache files
,因为每个服务器的环境都不一样,缓存路径也会不尽相同就会导致插件无法找到缓存文件并删除!
一般默认的选项就可以了,图上是强子手记博客的配置,大家可以看下,如果看不懂可以用谷歌浏览器翻译下。配置好之后保存。
清理缓存模式选择说明
①、purge 模式
这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。
出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了 CDN 的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实 IP,以便插件直接请求 purge 路径,而不用走 CDN 节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!
②、文件模式
模式二是直接清理对应的缓存文件,不需要请求 purge 这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人推荐使用这个模式)。
由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!
插件设置保存后,还需要修改插件默认的缓存目录,找到插件目录下的 nginx-helperincludesclass-nginx-helper.php,修改里面的 /var/run/nginx-cache 为 /tmp/wpcache,不然插件无法清理缓存!
解决办法
很简单,在 WordPress 根目录下的 wp-config.php 中新增如下代码即可:
//根据实际情况定义缓存的存放路径
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache');
Ps:不知道添加到第几行的话,可以添加到 define('WPLANG', 'zh_CN'); 的后面即可。添加后建议重载一下 php,确保变量生效(主要针对开启了 PHP 缓存的网站!)。
如果全部设置好,该保存的保存、该重启的重启,就完事了。
判断缓存状态
保存重启nginx后就可以看到缓存效果啦。
按 F12 开启开发者工具,在未登录的情况下访问网站首页,查看文件头,如果出现 HIT 则是缓存了,BYPASS 则是因设置原因未缓存(对于已经设置了不缓存的页面,Nginx fastcgi_cache会直接显示BYPASS,如果是登录状态那也是不显示缓存的),MISS 即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态,如图所示:
对了记得退出登录 首次访问会显示BYPASS,第二次就缓存了。同时,在服务器的缓存路径/tmp/wpcache
中也能看到Nginx fastcgi_cache生成的缓存文件。
如果发现你的评论过的用户依然用的是缓存,那应该是WP没有记住cookie,把以下代码加入到functions.php
中即可。
add_action('set_comment_cookies','coffin_set_cookies',10,3);
function coffin_set_cookies( $comment, $user, $cookies_consent){
$cookies_consent = true;
wp_set_comment_cookies($comment, $user, $cookies_consent);
}
停用、卸载WP Super Cache缓存插件
如果之前启用了 WP Super Cache 插件,现在可以去停用、卸载了。
多个站点启用
如果要给同一个服务器内多个站点同时配置Nginx fastcgi_cache缓存加速,上面的代码就不行了,需要修改几个小地方,具体可以查看下面这个教程:Nginx配置多站点下的Fastcgi_cache缓存加速
总结
教程就写到这里了,更进一步的个性化设置就靠用户自己摸索了,据说使用这个缓存之后,连百度也会更喜欢你的网站,从而更快地收录和增加权重哦!
Nginx开启fastcgi_cache缓存对于加快网页响应速度以及节省服务器资源有着非常重要的意义。
细节调整
启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:
Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,
经过排查,问题出在了宝塔面板中的 session.cache_limiter
的PHP.ini设置部分, 默认值是nocache,我们需要将它设置为none即可。
X-Powered-By
我们用宝塔面板会默认的出现X-Powered-By 7.x 出现php的版本信息,从安全角度来说还是很不友好的。X-Powered-By是网站响应头信息其中的一个,出于安全的考虑,一般会修改或删除掉这个信息。
宝塔面板里我们如何修改呢:PHP.ini设置 expose_php = off
设置好之后,重载php服务即可。
利用宝塔面板给WordPress开启Nginx fastcgi_cache缓存加速方法就说完了,如果有什么疑问可以留言,说实话利用宝塔面板来搞这个Nginx fastcgi_cache缓存加速还是非常方便的。喜欢折腾的小伙伴赶紧试试。
其实,Nginx Helper 还支持redis cache模式的缓存,也是非常不错的!Nginx Helper真的是非常强大,关键是这么强大的插件还是免费的。
所以,如果我们勾选Enable Nginx Timestamp in HTML 你在查看网页源代码的时候会发现一些信息,如果你不需要这些信息,可以选择关闭。