nginx缓存
cache of nginx
缓存即数据交换的缓冲区,当A与B进行数据交互时,先去找缓存中是否有数据,若在缓存中找不到想要的数据,那么再去B中找;找到了就直接返回不用和B再打交道了。
1.缓存概述
生活中有很多场景,都和缓存相似。这不过年了,秃头男突然想吃猪肉炖粉条了,就去冰箱里去拿猪肉,发现冰箱里空空如也,于是乎就去集市买了两斤。单身汉一人一顿也吃不完啊,于是切了半斤把剩余的又放冰箱里了,美美的吃了一顿。下次再吃就不用去集市了,直接从冰箱里拿即可,等吃完再去集市买呗。
哲学上说存在即合理,那么缓存的存在肯定有他的优势,相反的,有好处就必然会有坏处,事物总是有两面性的。
我们购买电脑的时候常常会看到CPU的描述会有6m或者8m、二级或者三级缓存,对于普通消费者来说肯定是一脸懵逼不知所云,光听销售员吹的天花乱坠去了。对于开发者来说,缓存已经不是一个陌生的东西了,在这个21世纪快速消费的时代,满足消费者的极致体验和与消费者的快速交互,是互联网产品都要解决的一大难题。从而应运而生的各种技术,百家齐放,相互竞争,以让自家产品稳定运行、响应速度快人一等。
缓存追求的是快。在没有缓存时,一个get请求要从服务器获取数据,一般都会经过服务器方的统一网关入口,然后再到具体的服务器,服务器中存储数据的地方一般都是数据库,所以在服务器这里还要再调用应用程序比如MySQL、Oracle等数据库获取资源数据。
数据库是把数据存放到硬盘中,一读一写是一种IO操作,速度就很慢,而缓存是以电信号的形式存在于内存中的数据,读取的速度和硬盘相比就是一个天上一个地下了。
既然缓存是用电信号表示的,那么是不是没电了,缓存也就消失了。所以缓存的致命缺点就是断电即消失,无法找回,无法修复。而硬盘却可以在断电的情况下存储数据,二者在存储原理上是不一样的,所以快亦有风险。
2.缓存原则
秃头男的冰箱的位置放在厨房好,还是放在卧室好还是大厅好啊?对于做饭来说肯定是放在厨房好咯。所以缓存的第一个原则就是越近越好。
越靠近用户,则带宽等网络资源消耗就越少,路短了用时不就短了,能用本地缓存就不要发网络请求。
第二个原则是能用自家缓存就不要用别人家的缓存,秃头男能买的起冰箱就不要把肉放在隔壁老王家。也就是说,对于服务器来说,能用本机缓存最好,若使用其他机器上的缓存是不是还要发送网络请求,这一来一回是不是就会占用很多资源。
3.web缓存
那么什么是web缓存呢?
web缓存位于内容源web服务器和客户端之间,当访问一个url时,web服务器会去后端服务器取回要输出的内容,然后当下一个请求到来时,如果访问的是同一个url,web服务器则会直接输出内容给客户端,而不是向后端服务器再次发送请求。
web缓存服务器,降低了后端服务器和数据库的负载吗,减少了网络延迟,提高了用户访问速速。
那么我们常用的缓存软件比如redis、memcache,是不是web缓存呢?答案是不是的,为什么呢?因为这两者是需要通过应用程序去操作,需要通过建立连接,通过自己的程序也就是代码去控制存储拉取,要在服务器内部进行处理。而web缓存对于同一个url来说,第一次请求会访问服务器,但是第二次请求不到服务器就直接返回了。
为什么第二次请求不经过服务器呢?是因为web服务器的存在,请求在达到web服务器的时候就发现这个url已经请求过了,且缓存了该url的内容,所以直接通过缓存返回了。都没见到内部服务器的面儿。如上图所示,仅从距离上来看就能知道,web缓存可以降低网络开销,加快响应速度。
4.nginx缓存实战
说了那么多,我们来看看nginx缓存是怎么操作的吧!实践是检验真理的唯一标准,千看万看不如用手与干。我在看技术类文章的时候,也会眼高手低,想着:嗯,很简单,这么这么操作就行,很好记,很easy啦…等到要写了代码了:哎?怎么写的来着?相信很多人都有过这种行为。
代码这种东西,100个人写同一段代码,总会有人要么运行不起来要么有bug。因为不同的人环境不一样配置不一样,所以实践才能知道这段代码自己能不能运行得到期望的结果。光靠想是没用的!
nginx缓存相关指令
nginx的缓存指令在proxy模块中可以查到.
其中核心指令就是 proxy_cache、proxy_cache_path和proxy_cache_valid。
1
proxy_cache_path
nginx缓存是将缓存的内容存储到磁盘和内存两种途径,此指令声明了缓存在硬盘中的存储路径,最大存储量,失效时间等。
2
proxy_cache
nginx缓存是共享的,也就是proxy_cache_path声明的一个nginx缓存可以被其他localtion所共用,所以就有个zone的概念,proxy_cache_path声明zone即缓存的别名,proxy_cache指定该别名表示使用这块缓存。
3
proxy_cache_valid
此指令可以控制不同响应状态码的HTTP响应的缓存失效时间。比如响应码是200的缓存10s ,404状态则缓存1s。
nginx配置
1http {
2 proxy_cache_path cache/test levels=1:2 keys_zone=myCache:10m max_size=1g inactive=30s use_temp_path=off;
3 server {
4 listen 80;
5 add_header X-Cache $upstream_cache_status;
6 location / {
7 proxy_pass http://127.0.0.1:8088;
8 proxy_cache_valid 10s;
9 proxy_cache myCache;
10 }
11 }
12}
如上所示。
proxy_cache_path 指令
1
cache/test:缓存数据存储在根目录下的cache/test目录中
2
levels:表示缓存文件在目录中的存储方式,不用关心,最好是1:2就行。
3
keys_zone=myCache:10m:定义一块共享的内存区域,名称叫myCache,大小为10m,用来存储key值和缓存数据的信息,10m大约可以存8000个key。这个10m和缓存在硬盘中的容量不是一个概念。
4
max_size:缓存在硬盘中存储的最大容量,超容则删除最不常用的缓存腾出空间,删除规则也可以手动配置。
5
inactive:表示已缓存数据在硬盘中的最大存储时间,超时就删除,默认10分钟。
6
use_temp_path:是否使用临时存储路径,意思是先有临时存储路径,然后再把临时的存储文件转到真正的存储路径也就是proxy_cache_path中的路径,如果开启则需要配置临时缓存路径,一般不开启。
add_header指令
add_header X-Cache $upstream_cache_status;
它是headers模块中的指令,意思很明确,就是在HTTP响应的时候添加响应头,key值为 X-Cache,value为upstream_cache_status是upstream模块中的一个内置变量,它表示HTTP响应的缓存状态。
$upstream_cache_status
keeps the status of accessing a response cache (0.8.3). The status can be either “MISS”, “BYPASS”, “EXPIRED”, “STALE”, “UPDATING”, “REVALIDATED”, or “HIT”.
也就是表示响应是否命中缓存,hit表示命中,miss表示未命中。设置此请求头的原因是缓存是否使用,用肉眼辨别不出来,我们在响应头中加一个是否缓存的标记,通过查看响应头就能看出是否使用了缓存。
最后两个指令就简单了,proxy_cache用于设置该location的所有请求都将缓存,并制定缓存zone;proxy_cache_valid表示缓存在内存中的存储时间,它还可以制定响应码的缓存时间。
nginx缓存验证
1http {
2 proxy_cache_path cache/test levels=1:2 keys_zone=myCache:10m max_size=1g inactive=30s use_temp_path=off;
3 server {
4 listen 80;
5 add_header X-Cache $upstream_cache_status;
6 location / {
7 proxy_pass http://127.0.0.1:8088;
8 proxy_cache_valid 10s;
9 proxy_cache myCache;
10 }
11 }
12}
我们反向代理到一个Tomcat,端口设置为8088,启动nginx访问localhost,然后查看响应头中的X-Cache,并查看cache/test文件夹是否有什么东西。
1.先看下原始的Tomcat响应头作为对比,即不通过nginx直接访问Tomcat
发现是没有X-Cache响应头的。、
2.访问localhost,查看通过nginx访问的效果,第一次访问时有 X-Cache响应头且状态是miss状态。
同时发现cache/test文件夹下多了很多文件夹,二级文件夹,正是levels所配置的1:2,最下级是一个文件,即缓存数据,30s过后消失,文件夹依然存在,说明inactive生效。为了避免浏览器缓存,可以使用ctrl+F5刷新页面,发现缓存文件又出现了。
3.第二次访问,再次查看状态,发现X-Cache的状态已经变为hit ,表示缓存命中。
不过通过看响应头不够直观,改变个状态并不能说明什么。缓存是干什么的,不就是为了加快响应速度的吗,那我们就看响应速度到底有没有加快不就好了。
初次访问,缓存未命中:
再次访问,缓存命中时:
结果不言而喻,localhost的访问速度从300ms变成了10ms,其他静态文件的加载也快了很多。响应速度的提升还是相当不错的。
当然了,这三个指令仅仅是nginx缓存的冰山一角,作为nginx的铁杆粉丝或者说工作上nginx需要必知必会,那么就得深入的研究,如果你只是一个爱好技术的开发者,想了解更多的知识技能,可以不用了解那么深,学海无涯,学不完的东西哦。
来源:CSDN
作者:奔跑的蜗牛kei
链接:https://blog.csdn.net/weixin_46021767/article/details/103821542