nginx缓存原理

一、HTTP字段理解

1.Expires:

    该字段的http1.0时的规范,值为一个绝对时间的GMT格式的时间字符串,代表缓存资源的过期时间,在这个时点之前即命中缓存。

    缺点:服务器返回的时间,可能与客户有时间差,时间差太大时可能会千万缓存混乱。

2.Cache-Control:

    该字段为http1.1时的规范,Cache-Control:max-age=3600为1小时。工作原理和expires一样,两个字段同时使用时,以cache-control为准。

3.协商缓存:

    继续保持上文,当cache-control没有命中,chrome会向服务器发送请求,服务器会验证协商缓存是否命中,如果协商缓存命中,请求返回http304 Not Modified.

    协商缓存利用Last-Modified,If-Modified-Since和ETag,if-None-Match这两对头部来管理。

    3.1.Last-Modified and If-Modified-Since

        last-modified:为服务器的response字段。

        if-modified-sine:为请求头部字段。

        通过比较两个时间来判断资源在两次请求期间是否有过修改,如果没有修改,则命中协商缓存,在chrome从缓存中获得资源,如果有修改过则服务器返回资源,同时返回新的last-modified.

    3.2.ETag and if-None-Match

        a.有些情况判断日期是不够的。修改信息不重要,last-modified不能精确到秒。

        b.ETag:为服务器字段。if-None-Match:为请求头部字段。

            第一请求chrome缓存数据和头部Etag,第二次请求时,request会带上if-none-match为上次的etag值。命中则用缓存,否则返回新资源和ETAG。

    注意:4个值一般同时启用,增加可靠性。分布式系统多台服务器的文件last-modified保持一致。分布式系统尽量关闭Etag,每台机器生成的Etag会不一样。

http://www.open-open.com/doc/view/e16e9c855ed4471594db279a07ad181e

原文地址:https://www.cnblogs.com/weibiao/p/6273748.html