Nginx高端成长之路程序员Api设计

【充电】《Nginx核心知识100讲》浏览器缓存、nginx控制

2019-01-20  本文已影响59人  言十年

极客专栏《Nginx核心知识100讲》97~98 小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。

97 | 用好浏览器的缓存

在互联网中使用缓存是最有效的提升访问速度的方法。在web服务器场景中不仅要考虑nginx作为缓存服务时的使用方法,还要考虑浏览器缓存生效的场景。浏览器的缓存是否生效可以通过nginx的指令去控制。而浏览器的缓存对用户的体验提升也是最大的。

浏览器缓存与nginx缓存

image.png

浏览器缓存

image.png

Last-Modified:比较简单,也就是我们访问的资源,比如我们使用了一个js文件,这个js文件的在服务器上上次被修改时间。

image.png image.png image.png image.png

浏览器请求发起,如果没有缓存就直接访问服务器了。如果有缓存并没有过期就从缓存中读取。如果缓存过期,先去判断Etag,如果有Etag就向nginx发送一个请求If-None-Match后面跟Etag的值。Etag的优先级是高于Last-Modified。这个时候服务器决定返回200还是304。如果返回给浏览器304,浏览器就直接从缓存中读取。如果是200就重新生成新的缓存替换原有的缓存。

如果没有Etag的值就会使用Last-Modified(上次修改时间),有了上次修改时间,就把这个时间带到If-Modified-Since告诉nginx,nginx再来做决策,判断是返回304还是200。

如果没有Etag也没有Last-Modified就会向服务器请求。

演示

浏览器访问https://www.taohui.pub/。禁止缓存,打开缓存,看看效果。

image.png

接下来看nginx怎么决策的,当它直接返回静态内容的时候,它可以根据浏览器发来的请求头部,决定是返回304还是200。

98 | Nginx决策浏览器过期缓存是否有效

本节介绍一个由headers模块提供的指令expires,这个指令用来告诉浏览器缓存究竟怎样过期。还会介绍not_modified模块,这个模块用来决策向浏览器返回304还是200,它的依据是http请求中的header和nginx中的一个指令If-Modified-Since

expires指令

image.png

max:表示缓存永久有效。Expires表示绝对时间,为了表示绝对有效设置的是2037年最后一天。Cache-Control是通过另外一个维度,因为服务器的时间跟浏览器的时间很可能不一致,所以http后续又添加了一个头部Cache-Control,是一个相对时间。

epoch:表示不使用这个缓存。能看到过期时间是1970年,cache-control为no-cache

演示

配置expires 为1h

image.png image.png

改成 -1h

image.png

设置具体的时间 expires @20h30m

image.png

not_modified模块

image.png image.png

if_modified_since:这个指令名字恰好与头部if_modified_since名字相同,要注意一下。

image.png image.png image.png image.png

演示

先请求下首页。

image.png

图中5be62ca4-264。264表示264字节(访问的首页恰好是264字节),前面的是时间的十六进制表示格式。

构造请求,然后修改If-None-Match。

image.png

修改了If-None-Match自然与Etag不等。所以返回200。

留言问题

1.老师,第二次访问的时候携带相同的etag的值,if none match变为false,所以就返回304了?

 作者回复
是的

上一篇下一篇

猜你喜欢

热点阅读