WordPress Nginx FastCGI Cache 缓存加速

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:

如果你发现想要缓存的页面却是这个状态,就可以去检查排除规则中是不是包含了这个路径!反之,如果你发现后台登录不了,或者各种登陆态丢失问题,则应该到排除规则中加上该页面路径的关键字。

相关推荐
python ERROR: Command errored out with exit status 1:
Windows Server 2016 搭建 SMB 共享文件
Windows Server 2019 域环境搭建 SMB 共享文件服务
Parallels Desktop 15.1.3