0x01 前言
庞展博客使用过 WP Super Cache、WP-Rocket这两款缓存插件。现在有折腾切换到了 Nginx+FastCGI,效果好那么一点。服务器的占用没有前面两个插件高。关于 Nginx+FastCGI 的介绍我也不想累述了,这次折腾参考了 张戈博客 和 明月登楼博客 详情点击查看两篇文章。下面开始我的部署过程,庞展博客环境使用 LNMP1.6、Nginx1.16、PHP7.3
0x02 Nginx添加Ngx_cache模块
LNMP一键安装包预置了 lnmp.conf 文件,可以在其中添加所需要的 Nginx 模块、PHP 模块、数据库路径、网站默认路径、启用 Openssl、启用 Fileinfo、Nginx 加载 Lua、启用 Swap 等等丰富可调整参数。我们需要用到的就是调整 Nginx 编译参数 Nginx_Modules_Options 这一参数。首先我们下载 Nginx 缓存清除模块 ngx_cache_purge 安装包。
ngx_cache_purge 官方地址:http://labs.frickle.com/files/,我们可以挑选一个新版本下载到服务器上;
先进入到 lnmp1.6 的 src 源目录将 ngx_cache_purge 下载到此目录
cd /root/lnmp1.6/src
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz # 下载 ngx_cache_purge 模块;
tar zxvf ngx_cache_purge-2.3.tar.gz # 解压 ngx_cache_purge
编辑 lnmp.conf 配置文件添加Nginx自定义模块参数;
cd /root/lnmp1.6 # 进入 lnmp1.6 目录; vim lnmp.conf # 编辑 lnmp 配置文件; Nginx_Modules_Options='' # 修改 lnmp.conf 配置文件中此默认值为以下值; Nginx_Modules_Options='--add-module=/root/lnmp1.6/src/ngx_cache_purge-2.3' # 修改后的值,编辑后保存; ./upgrade.sh nginx # 执行 nginx 升级文件,并非升级只是利用接口编译 ngx_cache_purge 模块; 1.16.0 # 执行上一步操作后会显示当前 Nginx 版本,直接输入你看到的Nginx版本后回车开始编译 ngx_cache_purge 模块; nginx -V 2>&1 | grep -o ngx_cache_purge # 编译完成后输入命令如果看到 ngx_cache_purge 回显则说明编译成功;或者键入 nginx -V 回显以下信息中包含 --add-module=/root/lnmp1.6/src/ngx_cache_purge-2.3 则说明编译成功;
# 以下信息为键入 nginx -V 后的回显信息; nginx version: nginx/1.16.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.1.1b 26 Feb 2019 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.6/src/openssl-1.1.1b --with-openssl-opt='enable-weak-ssl-ciphers' --add-module=/root/lnmp1.6/src/ngx_cache_purge-2.3
0x03 Nginx 配置
在修改Nginx 配置前需要先在 tmp 目录下创建缓存目录,等下要是忘了重启 Nginx 后站点就GG了...
cd / # 进入到根目录; mkdir /tmp/pangzhan_cache # 创建一个名为 pangzhan_cache 的目录; mkdir /tmp/temp # 创建一个名为 temp 的目录; cd /usr/local/nginx/conf # 进入到 Nginx 配置文件目录; vim nginx.conf # 编辑 Nginx 配置文件;
在 Nginx 配置文件的 http { 添加一下代码 } 具体看以下代码注释。
# 站点 1 缓存配置; fastcgi_cache_path /tmp/pangzhan_cache 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/temp; # 上面这些目录都需要手动提前创建好; 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;
0x04 站点 Nginx 配置
以下代码放在站点.conf (站点nginx配置)文件的 Server{ } 哪里,建议放在站点 server_name 和 root 的下面为宜,理论上这样最完美。
Ps:代码中加粗的地方是需要对应 nginx.conf 里相应参数的以及需要修改为自己服务器的实际内容。
Ps:给站点配置文件添加 FastCGI Cache 缓存规则代码的时候要注意注释掉类似 include enable-php.conf; 这样的引用,因为这个和代码里的 include fastcgi.conf; 重复了,不注释掉的话也会造成缓存规则不生效的现象,一般 LNMP 环境下默认站点配置文件里都有这个引用语句的,所以一定要记得排除注释掉哦!
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 12h; fastcgi_cache_valid 301 302 3d; fastcgi_cache_valid 304 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 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; } }
0x05 安装 Nginx Helper 插件
到这里 Nginx FastCGI 缓存配置基本就完成了,重启 Nginx 后缓存就开始生效了!因为 WordPress 是个动态的博客平台,访问者某篇文章发表评论、站长修改了某篇文章、回复了评论、发布了文章的等等这些动态操作都会对缓存有影响和改变,所以灵活的根据场景来清理缓存就很有必要了,WordPress 上就有一个插件是专门来针对 FastCGI 缓存管理的,叫做 Nginx Helper,这个插件可以在 WordPress 后台插件库里直接在线安装的。
Ps:由于插件定义的清理缓存的路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!在WordPress根目录下的wp-config.php中新增如下代码即可:
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/pangzhan_cache'); # 根据实际情况定义缓存的存放路径
0x06 效果预览
X-Cache 一般会有3个状态:MISS、HIT、BYPASS。
MISS表示未命中
即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态。
HIT表示缓存命中
打开一个会缓存的页面,比如文章内容html页面,F5刷新几次即可在F12开发者模式当中的Header头部信息中看到如图缓存命中状态:
BYPASS表示缓存黑名单
即页面路径在Nginx规则中被设置成不缓存(set $skip_cache 1;),比如WP后台,查看header:
如果你发现想要缓存的页面却是这个状态,就可以去检查排除规则中是不是包含了这个路径!反之,如果你发现后台登录不了,或者各种登陆态丢失问题,则应该到排除规则中加上该页面路径的关键字。