nginx expires 缓存

本文针对nginx expires 设置进行讲解。nginx 缓存设置非常简单,可以设置在location /if 段里。

注:这个缓存是指针对浏览器所做的缓存,不是指服务器端的数据缓存.

下面就以具体的示例网站,针对该示例网站做实验。

一般缓存是针对不常发生变化的内容来做的缓存,在我们的这个示例网站中,可以看到图片是很多的,如果每次访问都请求加载很多图片资源的话,那是相当慢的,也是非常浪费服务器资源的。

nginx expires 缓存

ok,我们这边设置nginx 做下缓存,让浏览器一个星期内不再重复请求图片内容。

我们先看下,在没做缓存配置前的一个浏览器请求响应头信息:

nginx expires 缓存

 

注:我这里nginx 有配置过虚拟主机,把虚拟主机的配置单独抽离出来放在了vhosts 目录下,因此,下面所做的配置主要是针对该主机,如果配置在nginx.conf 文件中也同样适用的(前提要配置正确哦)。

nginx expires 缓存

配置如下:

location ~* \.(jpg|jpeg|gif|png){

        root       /data/www/OneGame/public ;
        expires 7d;

}

该配置表示:所有在/data/www/OneGame/public 目录下的以.jpg、.png、.gif、.jpeg为后缀  (不区分大小写)的文件缓存7天。

 以下是我配置文件完整内容:

nginx expires 缓存

 

nginx expires 缓存

 

让nginx  重新载入配置

nginx -s reload

 

然后强制刷新访问示例网站,查看一下图片的请求响应头信息。

nginx expires 缓存

可以看到响应头信息多了一个Cache-Control ,而且该值为:604800 ( 3600 * 24 * 7 ) ,该值单位为秒,即缓存7天。

再次刷新(非强制刷新)查看浏览器请求响应头信息

nginx expires 缓存

再次刷新后(非强制刷新),可以查看到,状态码304的数据浏览器已经没有再请求服务器了

nginx expires 缓存


原理是:第一次浏览器访问资源,服务器响应Etag 验证令牌,Last-Modified 时间,Cache-Control:max-age 缓存时长,第二次浏览器发送请求的时候在HTTP If-None-Match 请求标头中加上ETAG 验证令牌,服务器根据当前请求资源核对令牌如果它未发生变化,服务器返回"304 Not Modified"响应,告知浏览器缓存中响应未发生变化,可以继续延用Cache-Control响应头中max-age时长。这次不必再次下载响应,这节约了时间和带宽。

浏览器发出的所有 HTTP 请求会首先路由到浏览器缓存,以确认是否缓存了可用于满足请求的有效响应。 如果有匹配的响应,则从缓存中读取响应,这样就避免了网络延迟和传送产生的流量费用。

关于HTTP 缓存更多内容,推荐:https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn 。