Nginx系列-资源缓存配置

2,019 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上一篇关于nginx的文章,写了关于nginx的如下内容:

  • 环境搭建
  • location
  • gzip压缩
  • 日志开启

不了解的可以前往看看:
Nginx系列-基础模块配置

那通过这篇文章,你将了解到nginx的下面配置:

  • 资源缓存配置

Nginx默认缓存配置

首先我们将location按如下进行配置,并且给html目录底下的index.html文件引用一张图片,启动nginx。

location / {
  root html;
  index  index.html index.htm;
  add_header Cache-Control private;
}

启动完,打开浏览器访问,刷新再查看控制面板,我们看到图片的响应信息如下:

响应头里面包含了 EtagLast-Modified 这两个用于处理协商缓存的信息,nginx默认是给资源开启缓存的。

为啥有的资源是是 200 from memory cache ,有的是 304 呢?

通过对请求头的查看,可以发现响应是 200 from memory cache 的,在请求头没有携带上 Etag 等信息,默认走了强缓存。

上面我们还给缓存配置了private,说明缓存只能针对个人用户,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中,当然默认配置项是 private。若配置了public,则表示响应可以被任何中间人缓存。

Nginx配置缓存时间

location ~* .(gif|jpg|png|bmp|ico)$ {
  #设置缓存时间
   expires 1d;  
}

上面设置了图片资源缓存时间为1天,重启下nginx看看浏览器返回效果。

可以看到了响应头返回了 Cache-Control:max-age=86400 时间,当下次请求在1天时间范围内,则直接采用浏览器的缓存,若超出时间,则需向服务器校验,若无资源无更新,服务器会返回304状态码,此时会刷新缓存的新鲜度,并将资源给客户端。

Nginx禁用强缓存

location / {
  root html;
  index  index.html index.htm;
  # 禁用强缓存
  add_header Cache-Control no-cache;
}

在配置文件添加 add_header Cache-Control no-cache 多次刷新浏览器后,会发现文件响应码都是304了,走了协商缓存,也就是每次都向服务器发起了文件校验。图片如下:

Nginx禁用缓存

location / {
  root html;
  index  index.html index.htm;
  add_header Cache-Control no-store;
}

Cache-Control 修改为 no-store ,并执行 nginx -s reload 指令,多次刷新浏览器后,会发现资源文件的请求都走200了,没有从缓存获取数据了。

缓存相关标识

Etag

Etag 是一种作为web资源关联的标记,由响应头传送给客户端,下次请求会通过请求头 If-None-Match 带上,若服务器资源未发生变化,则返回 304 状态码。它主要是为了解决 Last-Modified 上的一些不足,比如,

  1. 某些文件修改是在秒级以下速度进行修改,但If-Modified-Since 能检查到的粒度是s级的。

采用弱 Etag,此时它是基于 MTime 来生成,只能精确到s,所以1s秒内生成的 Etag 是一样的。可以避免强 Etag 造成的频繁缓存刷新。弱 EtagW/ 开头。

  1. 某些文件会周期性变更,但其内容是不变化的,此时我们不希望它被认为被修改了等。
  2. 某些服务器不能精准获取文件的最后修改时间。
文件存储

from memory cache

不请求网络资源,资源存储在内存中,一般存储的有字体、图片、脚本。

from disk cache

不请求网络资源,资源存储在磁盘中,一般存储非脚本资源,如css。

总结

最后,再结合下如下浏览器缓存策略流程图,是不是对缓存整体流程和配置就熟悉了呢?下一篇,看看nginx是如何配置缓存策略。