Nginx可以缓存一些文件(一般是静态文件),减少Nginx与后端服务器的IO,提高用户访问速度。而且当后端服务器宕机时,Nginx服务器能给出相应的缓存文件响应相关的用户请求。
在tomcat的webapps目录下创建hello.html,内容写上“this is cache file”,充当要被缓存的文件;在/usr/local/nginx目录下创建cache_snowman文件夹(缓存区)用于存放缓存文件
缓存参数详细说明
父元素 | 名称 | 描述 |
---|---|---|
http | proxy_cache_path | 指定缓存区的根路径 |
levels | 缓存目录层级最高三层,每层1~2个字符表示。如1:1:2 表示三层。 | |
keys_zone | 缓存块名称 及内存块大小。如 cache_item:500m 。表示声明一个名为cache_item 大小为500m。超出大小后最早的数据将会被清除。 | |
inactive | 最长闲置时间 如:10d 如果一个数据被闲置10天将会被清除 | |
max_size | 缓存区硬盘最大值。超出闲置数据将会被清除 | |
location | proxy_cache | 指定缓存区,对应keys_zone 中设置的值 |
proxy_cache_key | 通过参数拼装缓存key 如:$host$uri$is_args$args 则会以全路径md5值做做为Key | |
proxy_cache_valid | 为不同的状态码设置缓存有效期 |
在http元素下添加缓存区声明
proxy_cache_path /usr/local/nginx/cache_snowman levels=1:2 keys_zone=cache_snowman:500m inactive=10d max_size=1g;
指定location设定缓存策略
#指定缓存区
proxy_cache cache_snowman;
#以全路径md5值做做为Key,可以理解为缓存文件名
proxy_cache_key $host$uri$is_args$args;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
可能levels这个参数有点难理解,在这里levels=1:2,意思就是以缓存文件名倒数生成两级目录,假设缓存文件名是123456,那么就会出现cache_snowman/6/45/123456
启动tomcat和nginx
访问hello.html文件
curl 127.0.0.1/snowman/hello.html
查看生成的缓存文件
关掉tomcat,访问仍然成功,因为走的是缓存文件
当页面被修改时就不能把之前缓存响应出去,应该把缓存清除掉。
清除缓存可以采用第三方模块 ngx_cache_purge 实现。
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
(可以用./sbin/nginx -V命令查看已安装模块)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=(ngx_cache_purge模块解压文件全路径)
make
(可以用nginx -t 检测查看安装是否成功)
配置location
location ~ /clear(/.*) {
#允许访问的IP
allow IP;
#禁止访问的IP
deny all;
#配置清除指定缓存区和路径(与proxy_cache_key一至)
proxy_cache_purge (缓存区名) $host$1$is_args$args;
}
前三行代码的意思是除了本机和虚拟机可以调用其他IP都拒绝(这个要根据业务来定)
注意:
$host$1$is_args$args,$1的意思是把“clear”路径剔除,不然会把它加进去一起md5(也就是192.168.1.101/ clear /snowman/hello.html),和之前的缓存文件不同名找不到,这就不对了。
(我的虚拟机IP是192.168.1.66)
访问生成缓存文件
http://192.168.1.66/snowman/hello.html
清除生成的缓存
http://192.168.1.66/clear/snowman/hello.html
出现成功页面就说明缓存文件已经被删除。