Nginx 基础配置 - 资源缓存配置
上一篇关于 nginx 的文章,写了关于 nginx 的如下内容:
环境搭建
location
gzip 压缩
日志开启
不了解的可以前往看看:前端人需要懂的nginx配置信息(一)
那通过这篇文章,你将了解到 nginx 的下面配置:
资源缓存配置
Nginx 默认缓存配置
首先我们将 location 按如下进行配置,并且给 html 目录底下的 index.html 文件引用一张图片,启动 nginx。
启动完,打开浏览器访问,刷新再查看控制面板,我们看到图片的响应信息如下:
响应头里面包含了 Etag
和 Last-Modified
这两个用于处理协商缓存的信息,所以 nginx 默认是给资源开启缓存的。
为啥有的资源是是 200 from memory cache
,有的是 304
呢?
通过对请求头的查看,可以发现响应是 200 from memory cache
的,在请求头没有携带上 Etag
等信息,默认走了强缓存。
上面我们还给缓存配置了private
,说明缓存只能针对个人用户,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中,当然默认配置项是 private
。若配置了public
,则表示响应可以被任何中间人缓存。
Nginx 配置缓存时间
上面设置了图片资源缓存时间为 1 天,重启下 nginx 看看浏览器返回效果。
可以看到了响应头返回了 Cache-Control:max-age=86400
时间,当下次请求在 1 天时间范围内,则直接采用浏览器的缓存,若超出时间,则需向服务器校验,若无资源无更新,服务器会返回 304 状态码,此时会刷新缓存的新鲜度,并将资源给客户端。
Nginx 禁用强缓存
在配置文件添加 add_header Cache-Control no-cache
多次刷新浏览器后,会发现文件响应码都是 304 了,走了协商缓存,也就是每次都向服务器发起了文件校验。图片如下:
Nginx 禁用缓存
将Cache-Control
修改为 no-store
,并执行 nginx -s reload
指令,多次刷新浏览器后,会发现资源文件的请求都走 200 了,没有从缓存获取数据了。
缓存相关标识
Etag
Etag
是一种作为 web 资源关联的标记,由响应头传送给客户端,下次请求会通过请求头 If-None-Match
带上,若服务器资源未发生变化,则返回 304
状态码。它主要是为了解决 Last-Modified
上的一些不足,比如,
某些文件修改是在秒级以下速度进行修改,但
If-Modified-Since
能检查到的粒度是s
级的。
采用弱 Etag
,此时它是基于 MTime
来生成,只能精确到 s,所以 1s 秒内生成的 Etag
是一样的。可以避免强 Etag
造成的频繁缓存刷新。弱 Etag
以 W/
开头。
某些文件会周期性变更,但其内容是不变化的,此时我们不希望它被认为被修改了等。
某些服务器不能精准获取文件的最后修改时间。
文件存储
from memory cache
不请求网络资源,资源存储在内存中,一般存储的有字体、图片、脚本。
from disk cache
不请求网络资源,资源存储在磁盘中,一般存储非脚本资源,如 css。
总结
最后,再结合下如下浏览器缓存策略流程图,是不是对缓存整体流程和配置就熟悉了呢?下一篇,看看 nginx 是如何配置缓存策略。
版权声明: 本文为 InfoQ 作者【梁龙先森】的原创文章。
原文链接:【http://xie.infoq.cn/article/e5b54bcb2550098295bde9b55】。文章转载请联系作者。
评论