极客专栏《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 了?
作者回复
是的
来源: http://www.jianshu.com/p/fcd41bc4241f