Nginx作为缓存服务

作者 : 开心源码 本文共2454个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共183人阅读

??上一篇文章讲了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的缓存服务就讲到这里,欢迎大家指正

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Nginx作为缓存服务

发表回复