【充电】《Nginx核心知识100讲》浏览器缓存、nginx控制
极客专栏《Nginx核心知识100讲》97~98 小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
97 | 用好浏览器的缓存
在互联网中使用缓存是最有效的提升访问速度的方法。在web服务器场景中不仅要考虑nginx作为缓存服务时的使用方法,还要考虑浏览器缓存生效的场景。浏览器的缓存是否生效可以通过nginx的指令去控制。而浏览器的缓存对用户的体验提升也是最大的。
浏览器缓存与nginx缓存
image.png浏览器缓存
image.pngLast-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/
。禁止缓存,打开缓存,看看效果。
接下来看nginx怎么决策的,当它直接返回静态内容的时候,它可以根据浏览器发来的请求头部,决定是返回304还是200。
98 | Nginx决策浏览器过期缓存是否有效
本节介绍一个由headers模块提供的指令expires,这个指令用来告诉浏览器缓存究竟怎样过期。还会介绍not_modified模块,这个模块用来决策向浏览器返回304还是200,它的依据是http请求中的header和nginx中的一个指令If-Modified-Since
。
expires指令
image.pngmax:表示缓存永久有效。Expires表示绝对时间,为了表示绝对有效设置的是2037年最后一天。Cache-Control是通过另外一个维度,因为服务器的时间跟浏览器的时间很可能不一致,所以http后续又添加了一个头部Cache-Control,是一个相对时间。
epoch:表示不使用这个缓存。能看到过期时间是1970年,cache-control为no-cache
演示
配置expires 为1h
image.png image.png改成 -1h
image.png设置具体的时间 expires @20h30m
not_modified模块
image.png image.pngif_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了?
作者回复
是的