Nginx作为缓存服务

作者: 青衣敖王侯 | 来源:发表于2019-05-25 21:44 被阅读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的缓存服务就讲到这里,欢迎大家指正

相关文章

  • nginx 模块配置

    nginx 作为静态资源web服务 nginx 作为缓存

  • Nginx作为缓存服务

    一、介绍 Nginx缓存服务原理 缓存服务的类型分为服务端缓存,客户端缓存和代理缓存。通过Nginx作缓存服务即是...

  • Nginx作为缓存服务

      上一篇文章讲了Nginx作为代理服务的使用方式,这篇文章我们讲一讲Nginx作为缓存服务是怎么工作的,以及实战...

  • nginx缓存不起作用问题解决方法

    1. nginx不缓存原因 默认情况下,nginx是否缓存是由nginx缓存服务器与源服务器共同决定的, 缓存服务...

  • 一、nginx 之 概述

    Nginx 是一款高性能的 Web 服务器软件。可以作为反向代理、负载均衡与缓存服务器使用。Nginx 是为高并发...

  • 缓存相关的

    web缓存服务器 varnish / squid / nginx cache 有什么不同? Nginx 反向代理为...

  • Nginx 缓存及HTTPS

    1. Nginx 缓存 客户端缓存 服务端缓存 1.1 缓存配置 proxy_cache_path proxy_c...

  • Nginx面试题

    什么是Nginx? nginx是一个web服务器,反向代理服务器,缓存服务器 为什么使用nginx 跨平台,配置简...

  • Nginx的代理缓存设置

    Nginx的代理缓存设置 expires: 设置浏览器的缓存时间 (客户端缓存) 服务端设置缓存(反向代理缓存) ...

  • nginx、supervisor、gunicorn、gevent

    nginx 缓存请求,没有nginx,会把服务直接搞挂。 supervisor 进程死掉后自动拉起 gunicor...

网友评论

    本文标题:Nginx作为缓存服务

    本文链接:https://www.haomeiwen.com/subject/eowszqtx.html