前言

今天我们来详细讨论nginx如何作为静态缓存,并且把自己踩的坑说下.

正文

只能通过重新编译的方式安装

使用nginx做为静态缓存必须要安装ngx_cache_purge模块, 但是这个模块通过yum包安装是不会携带的, 那么就要我们单独安装.

单独安装的话有两种方式, 一种是重新编译, 另一种是动态加载.

我一开始的nginx是使用yum安装的1.8.0版本. 后来发现动态加载的方式只有1.9.1以上的nginx版本才支持. 本来想升级到1.9+版本然后动态加载安装. 后来又发现ngx_cache_purge模块不支持动态加载. 所以只剩下重新编译这一条路了.

只能先升级到1.18.0版本

既然只能重新编译那么我就想不用升级了, 直接重新编译安装吧. 后来发现不升级nginx版本而重新编译安装的话会导致很多最新特性不支持, 比如http2特性. 而且我发现下载的1.8.0源码安装包缺少很多模块, 后来发现这个源码包只有832104大小. 而比较新的1.18.0版本大小又1039530. 所以老版本重新编译安装很麻烦, 缺少各种包. 于是只能升级到1.18.0版本.

升级1.18.0版本过程

卸载1.8.0版本nginx

yum remove nginx

下载rpm源并更新

cd /usr/local/temp 
#下载rpm源
wget http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm
#更新rpm
rpm -Uvh nginx-1.18.0-1.el7.ngx.x86_64.rpm

重新安装1.18.0版本

yum install -y nginx

注意: 这个yum安装的1.18.0版本是不携带ngx_cache_purge模块的

下载1.18.0源码解压和ngx_cache_purge源码解压

cd /usr/local/temp
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xvf nginx-1.18.0.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz

获取yum安装的nginx配置信息

nginx -V

20201209154047-2021-12-30-09-34-05

根据配置信息重新编译nginx

cd /usr/local/temp/nginx-1.18.0
#配置
./configure <刚刚的配置信息> --add-module=/usr/local/temp/ngx_cache_purge-2.3
#编译
make

备份原来的nginx程序, 并复制刚刚重新编译的nginx程序到执行目录下

mv /usr/sbin/nginx /usr/sbin/nginx.bak
cp /usr/local/temp/nginx-1.18.0/objs/nginx /usr/sbin/nginx

经过上面的步骤, 我们携带ngx_cache_purge模块的1.18.0版本nginx就安装完毕了. 接下来我们配置nginx缓存.

配置缓存

创建缓存文件

#文件夹可以直接指定喜欢的位置
mkdir /etc/nginx/wpCache
mkdir /etc/nginx/wpCache/temp
#让nginx拥有缓存文件夹所有权限,如果嫌麻烦就直接 777
chown -R nginx wpCache

配置nginx.conf文件

#配置缓存的路径, level和keys_zone不知道什么意思, 当1天都没访问时删除, 最大缓存量是1GB
fastcgi_cache_path /etc/nginx/wpCache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;
fastcgi_temp_path  /etc/nginx/wpCache/temp;
#缓存文件的键, 这个会存储在内存中, 当被命中时, 找到对应的缓存文件返回
fastcgi_cache_key "$scheme$request_method$host$request_uri";
#缓存失效的条件是请求错误, 超时, 不合理的请求头, 服务器500错误
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

对每个站点的conf文件进行配置, 我就以zixuehu.com作为示例

#开始缓存
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 127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params; 
    #新增的缓存规则
    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;
}
#缓存清理配置(可选),只允许自己站点ip来清理, 禁止其他ip帮我们清理, 当然你也可以不设置
location ~ /purge(/.*) {
    allow 127.0.0.1;
    allow <你网站的真实IP>;
    deny all;
    fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}

到此为止, 我们的缓存就配置好了, 接下来我们就是要配合wordpress的插件来让站点自动清理缓存了, 否则设置缓存反而适得其反.

配置Nginx Helper插件

这个插件的原理就是当页面发生修改时就删除对应的缓存文件, 比如当修改了某篇文章

20201209172657-2021-12-30-09-34-18 20201209172745-2021-12-30-09-34-28

在wp-config配置文件中配置缓存文件的位置,这样插件就知道去哪里删除了

//根据实际情况定义缓存的存放路径
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','<自己缓存文件的位置>');

测试

fastcgi_cache有三种状态: Miss: 未命中, 一般是第一次请求某个页面的时候 HIT: 命中, 当不是第一次请求的时候请求到了缓存文件 BYPASS: 忽略, 就是我们nginx配置的不需要缓存的文件, 比如后台页面 20201209173620-2021-12-30-09-34-41 20201209173706-2021-12-30-09-34-53 20201209173756-2021-12-30-09-35-19

总结

我们学习了如何使用nginx来实现缓存, 这种缓存对于网站访问速度的提升是非常大的, 因为数据库查询对于网站的访问速度有非常大的拖延。

THE END
开启精彩搜索

历史搜索

用户名或邮箱
密码
用户名
密码
重复密码
邮箱
注册
找回密码
注册 登录
邮箱
邮箱验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

新增

新增