Nginx作为缓存服务
2019-05-25 本文已影响2人
青衣敖王侯
上一篇文章讲了Nginx作为代理服务的使用方式,这篇文章我们讲一讲Nginx作为缓存服务是怎么工作的,以及实战的使用。
先看一张图:
Nginx作为缓存服务
面对第一次客户端的应用Nginx需要从后端的服务获取数据,对于后续的请求,Nginx若进行了缓存就不再从后端服务获取数据。
1.proxy_cache实战
1.1proxy_cache_path
语法:proxy_cache_path path [levels=levels].只能用在http中。
proxy_cache_path /root/cache levels=1:2 keys_zone=zzm_cache:10m max_size=1g inactive=60m use_temp_path=off;
- /root/cache:定义 proxy_cache 生成文件的根路径
- levels:默认所有缓存文件都放在上面指定的根路径中,从而可能影响缓存的性能。推荐指定为 2 级目录来存储缓存文件
- key_zone:这个的值是字符串,可以随意写。用于在共享内存中定义一块存储区域来存放缓存的 key 和 metadata(类似于使用次数),这样 nginx 可以快速判断一个 request 是否命中缓存。1m 可以存储 8000 个key,10m可以存在80000个key
- max_size:最大 cache 空间。如果不指定,会使用掉所有 disk space。当达到 disk 上限后,会删除最少使用的 cache
- inactive:内存中缓存的过期检查周期。示例配置中如果 1h 内都没有被访问,则不论状态是否为 expired,都会清除缓存。需要注意的是,inactive 和 expired 配置项的含义是不同的,expired 只是判断过期时间,不会删除缓存;而 inactive 是直接删除过期缓存
- use_temp_path:如果为 off,则 nginx 会将缓存文件直接写入指定的 cache 文件中,而不使用 temp_path 指定的临时存储路径
1.2proxy_cache
proxy_cache zone | off。默认是关闭的,可以用在http,server,location中。
location / {
proxy_cache zzm_cache;
proxy_pass http://zzm;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
- proxy_cache:对应 http 段的 key_zone,是你定义的 proxy_cache 所使用的共享空间的名称,我在1.1中定义的是zzm_cache,所以在这里也写的是zzm_cache。
- proxy_cache_valid:对指定的 HTTP 状态进行缓存,并指定缓存时间。可以自定义写入多个配置项。这里我们对200和304的返回码缓存12小时。其余的缓存10分钟
- proxy_cache_key:缓存的维度
- is_args:如果$args设置,值为"?",否则为""
- proxy_next_upstream 当请求服务器发生错误或超时时,会尝试到下一台服务器
1.3编写后端服务
SpringBoot访问zzm这个路径的时候,会返回配置文件中的spring.s项,具体值可以参考我们的启动设置:
启动3个后台进程
三个后台金正分别对应6000端口,6001端口,6002端口
1.4配置upstream
upstream zzm{
server 127.0.0.1:6000;
server 127.0.0.1:6001;
server 127.0.0.1:6002;
}
所以我们访问ip:port/zzm的时候会自动去访问后台
1.5效果展示:
我们首先注释掉proxy_cache zzm_cache;进行访问,也就是没有缓存的情况下,访问3次:
第一次结果
第二次结果
第三次结果
我们可以看到没有缓存的情况下,会进行轮询访问,每次访问的结果不一样,而且我们的缓存路径什么都没有,让我想起了一首歌空空如也:
缓存路径
接下来我们把缓存打开,访问3次,只会有下面这个页面:
访问3次都是这个页面
同时缓存路径有了变化:
发现多了两个目录
好奇的看了下目录下的文件内容:
缓存的文件内容
我们可以看到6000值被缓存下来了,同时key就是我们在浏览器敲击的url,所以我们可以大胆猜想第二次访问的时候就是从这个文件里面把相关的数据拿出来的。
1.6缓存扩展
1.6.1如何清空缓存
1.6.1.1直接rm 缓存目录下所有的文件,但这样会干掉所有的缓存
1.6.1.2使用ngx_cache_purge
1.6.2如何让部分页面不缓存
1.6.2.1proxy_no_cache string可以在http,server,location中配置
proxy_no_cache使用当我们再次访问http://47.100.199.15/zzm时,发现不会再缓存了。这里的配置文件中我写了很多变量,只要其中一个变量不为0,这个url就不会被缓存。
1.7缓存命中分析
1.7.1方式一:通过设置response的头信息Nginx-Cache
add_header Nging-Cache "$upstream_cache_status";
upstream_cache_status
当我们没有缓存的时候,我们可以看到应答会是MISS:
MISS
如果缓存了:
HIT
1.7.2方式二:通过设置log_format,打印日志分析
现在nginx.conf中加入新的配置项:
nginx.conf
此时我们怒刷前端页面,会发现后端日志如下:
access.log
Nginx的缓存服务就讲到这里,欢迎大家指正