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