Nginx客户端缓存的原理是什么

66次阅读
没有评论

共计 3332 个字符,预计需要花费 9 分钟才能阅读完成。

本篇内容主要讲解“Nginx 客户端缓存的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“Nginx 客户端缓存的原理是什么”吧!

缓存的作用

缓存对于 Web 服务至关重要,尤其对于大型高负载 Web 站点。缓存作为性能优化的一个重要手段,可以在极大程度上减轻后端服务器的负载。通常对于静态资源,即不经常更新的资源,如图片,CSS 或 JS 等进行缓存,而不用每次都向服务器请求,这样就可以减轻服务器的压力。

缓存的分类

缓存可以分为客户端缓存和服务端缓存。

客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个协商缓存的请求), 它的优势是可以减少网络流量, 加快请求速度。

服务端缓存指的是反向代理服务器或 CDN 的缓存, 他的作用是用于减轻后端实际的 Web Server 的压力。

浏览器缓存可以分为两种模式,强缓存和协商缓存。

强缓存(无 HTTP 请求,无需协商)

直接读取本地缓存,无需向服务端发送请求确认,HTTP 返回状态码是 200(from memory cache 或者 from disk cache,不同浏览器返回的信息不一致的)。

相关的 HTTP Header 有:

Cache-Control

Expires

协商缓存(有 HTTP 请求,需协商)

浏览器虽然发现了本地有该资源的缓存,但是缓存已经过期,于是向服务器询问缓存内容是否还可以使用,若服务器认为浏览器的缓存内容还可用,那么便会返回 304(Not Modified)HTTP 状态码,告诉浏览器读取本地缓存;如果服务器认为浏览器的缓存内容已经改变,则返回新的请求的资源。

相关的 HTTP Header 有:

Last-Modified

ETag

缓存校验流程

由于网站内容的经常变化,为了保持缓存的内容与网站服务器的内容一致,客户端会通过内容缓存的有效期(强制缓存)以及 Web 服务器提供的访问请求的校验(协商缓存),快速判断请求的内容是否已经更新。客户端缓存校验流程图如下:

强制缓存

强制缓存原理:浏览器在加载资源的时候,会先根据本地缓存资源的 header 中的信息 (Expires 和 Cache-Control) 来判断缓存是否过期。如果缓存没有过期,则会直接使用缓存中的资源;否则,会向服务端发起协商缓存的请求。

客户端判断缓存是否过期和先前请求时服务端返回的 HTTP 消息头字段有关:

服务端返回字段作用 Cache-Control: max-age= x 客户端缓存时间超出 x 秒后则缓存过期。Cache-Control: no-cache 客户端不能直接使用本地缓存的响应,需要进行协商缓存,发送请求到服务器确认是否可以使用缓存。如果 Web 服务器返回 304,则客户端使用本地缓存,如果返回 200,则使用 Web 服务器返回的新的数据。Cache-Control: no-store 客户端不能对响应进行缓存。Cache-Control: public 可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。Cache-Control:private 只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。expires x 客户端缓存时间超出 x 秒后则缓存过期,优先级比 Cache-Control: max-age= x 低。协商缓存

协商缓存原理:当客户端向服务端发起请求时,服务端会检查请求中是否有对应的标识(If-Modified-Since 或 Etag),如果没有对应的标识,服务器端会返回标识给客户端,客户端下次再次请求的时候,把该标识带过去,然后服务器端会验证该标识,如果验证通过了,则会响应 304,告诉浏览器读取缓存。如果标识没有通过,则返回请求的资源。

Last-Modified 与 If-Modified-Since 属于 HTTP/1.0,是用于服务端对响应数据修改时间进行校验的服务端校验方法。Last-Modified 的值是由服务端生成后传递给客户端的,客户端发送请求时,会将本地内容缓存中的 Last-Modified 的值由请求消息头的 If-Modified-Since 字段传递给服务端,如果服务端的被请求的内容的最后修改时间和 If-Modified-Since 的(默认是 exact 精确匹配)值不一致,则将返回新的内容,否则返回响应状态码 304,客户端将使用本地缓存。

Etag 与 If-None-Match 属于 HTTP/1.1,优先级高于 Last-Modified 的验证,是用于服务端对响应数据进行实体标签校验的服务端校验方法。Etag 类似于身份指纹,是一个可以与 Web 资源关联的记号。当客户端第一次发起请求时,Etag 的值在响应头中传递给客户端;当客户端再次发起请求时,如果验证完本地内容缓存后需要发起服务端验证,Etag 的值将由请求消息头的 If-None-Match 字段传递给服务端。如果服务端验证 If-None-Match 的值与服务端的 Etag 值不匹配,则认为请求的内容已经更新,服务端将会返回新的内容,否则返回响应状态码 304,客户端将使用本地缓存。

下图可以看到客户端第一次请求时,客户端请求中没有 If-Modified-Since 和 Etag 标识,服务端响应了 200,并且返回了 Etag 和 Last-Modified 消息头。

当第二次客户端请求时,带上了 If-Modified-Since 和 If-None-Match 消息头,并且服务端经过校验后返回了 304 让客户端使用本地缓存。

用户行为对浏览器缓存的影响

当按下 F5 或者刷新时,客户端浏览器会添加请求消息头字段 Cache-Control: max-age=0,该请求不进行内容缓存的本地验证,会直接向 Web 服务器发起请求,服务端根据 If-Modified-Since 或者 If-None-Match 的值进行验证。

当按下 Ctrl+F5 或者强制刷新时,客户端浏览器会添加请求消息头字段 Cache-Control: no-cache,并且忽略所有服务端验证的消息头字段(Etag 和 Last-Modified),该请求不进行内容缓存的本地验证,它会直接向 Web 服务器发起请求,因为请求中没有携带服务端验证的消息头字段,服务端会直接返回新的内容。

Cache-Control 字段在请求和响应中的含义客户端请求

max-age:不想要在代理服务器中缓存了太长时间 (max-age seconds) 的资源。

max-stale:可以接收代理服务器上的过期缓存。若 max-stable 后没有值,则表示无论过期多久客户端都可以使用。

min-fresh:要求服务器使用其缓存时,至少保证在 min-fresh 秒内不会过期。

no-cache:告诉代理服务器,不能直接使用已有缓存作为响应返回,除非带着缓存条件到上游服务端得到 304 验证返回码才可使用现有缓存。

no-store:告诉各代理服务器不得缓存这个请求及其相应。

no-transform:告诉代理服务器不要修改消息包体的内容。

only-if-cached:告诉代理服务器仅能返回缓存,没有缓存的话就返回 504。

服务端响应

max-age:告诉客户端缓存 Age 超出 max-age 秒后则缓存过期。

s-maxage:与 max-age 相似,但仅针对共享缓存,且优先级高于 max-age 和 Expires。

public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。

private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

no-store:告诉所有下游节点不能对响应进行缓存。

no-cache:告诉客户端不能直接使用缓存的响应,使用前必须在源服务器验证得到 304 返回码。

no-transform:告诉代理服务器不能修改消息包体的内容。

must-revalidate:告诉客户端一旦缓存过期,必须向服务器验证后才可使用。

proxy-revalidate:与 must-revalidate 类似,但它仅对代理服务器的共享缓存有效。

到此,相信大家对“Nginx 客户端缓存的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-17发表,共计3332字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)