前言
今天我们来详细讨论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
根据配置信息重新编译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插件
这个插件的原理就是当页面发生修改时就删除对应的缓存文件, 比如当修改了某篇文章
在wp-config配置文件中配置缓存文件的位置,这样插件就知道去哪里删除了
//根据实际情况定义缓存的存放路径
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','<自己缓存文件的位置>');
测试
fastcgi_cache有三种状态: Miss: 未命中, 一般是第一次请求某个页面的时候 HIT: 命中, 当不是第一次请求的时候请求到了缓存文件 BYPASS: 忽略, 就是我们nginx配置的不需要缓存的文件, 比如后台页面
总结
我们学习了如何使用nginx来实现缓存, 这种缓存对于网站访问速度的提升是非常大的, 因为数据库查询对于网站的访问速度有非常大的拖延。