清漆+静态HTML页面

mat*_*sko 9 caching http varnish http-caching

我最近遇到了一个名为Varnish的http网络加速器.根据我的阅读,Varnish通过使用反向代理配置优化与HTTP服务器的HTTP通信的每个进程来加速网站的交付.

我的问题是,如果你有一个具有它的缓存机制配置一路下跌到静态html文件的网站,那么多少的效果光油对吗?反向代理是否会削减HTTP服务器处理请求所执行的工作?如果您在服务器端广泛缓存了所有内容(HTTP标头,Etags,过期标头,数据库缓存,片段和页面缓存),那么HTTP加速器还会做些什么来改进这一点?

Jam*_*ett 21

首先,我们应该区分正常Web系统中发生的两种不同类型的缓存:HTTP缓存服务器端缓存.

HTTP缓存由HTTP标头控制,特别是当您指出ETag和各种到期机制(包括Expires和各个方面Cache-Control)时.这是覆盖所有在RFC 2616(HTTP),部分13,并且允许HTTP 缓存返回到从一个HTTP请求的响应的客户端,而不必返回到原始服务器.实际上,在某些情况下,HTTP缓存机制允许客户端和服务器之间的另一台机器就像它是服务器一样.这实际上就是清漆的作用,我们将在一分钟内看到; 许多人都熟悉的另一个常见用途是当ISP在其网络中提供HTTP缓存时,通常可以比其网络外部的源服务器更快地响应其订户(并因此提高感知性能).

服务器端缓存包括数据库缓存,片段和页面缓存,它们实际上只是Web服务器的一种方式,通过执行一次,避免执行一些昂贵的操作(例如,数据库查询或呈现模板的特定部分)将结果保留在缓存中一段时间​​.

我之前说过,清漆是一个HTTP缓存,这意味着它可以比服务于静态文件的Web服务器更高效.考虑一下Web服务器必须做什么:

  1. 解析HTTP请求
  2. 将URI(以及任何相关的请求标头,例如Accept-Encoding)映射到文件上
  3. 提取有关文件的信息以在响应中构建HTTP标头; 这些公知为实体标题(RFC 2616第7.1节,其包括诸如Content-Length,Content-Type以及ExpiresLast-Modified在HTTP缓存使用头)
  4. 找出需要哪些额外的响应头(RFC 2616第6.2节 ;这些包括ETagVary,以及HTTP缓存的两个重要部分)和通用头字段(RFC 2616第4.5节)
  5. 将HTTP状态行和标头写入网络
  6. 将文件的内容写入网络

相比之下,清漆是所有这一切的上游,所以它所要做的就是:

  1. 解析HTTP请求
  2. 将URI(以及任何相关的请求标头)映射到其内部缓存中的条目
  3. 看看是否有条目; 如果有,写入网络; HTTP标头将存储在缓存中

如果没有条目,清漆必须做更多的工作:

  1. 连接到它后面的Web服务器,该服务器将运行第一个列表中的所有步骤1-6以生成响应
  2. 将响应写入网络,包括所有HTTP标头
  3. 将响应存储在其缓存中

特别是因为清单可以缓存HTTP标头和实体主体(整个响应),如果它可以从其缓存中提供服务,那么它的工作量就会减少.当您开始在服务器中动态生成响应时,差异可能变得更加明显:假设您有一个生成需要5秒钟的页面,但对于每个访问您网站的人来说都是相同的,清漆应该可以在缓存中的大多数毫秒(加上通过网络向HTTP客户端获取响应所需的时间),并且具有一个整洁的机制(宽限期),因此它可以继续执行它,同时点击后端服务器一次刷新页面的缓存版本.

当然,您可以引入服务器端缓存来提高Web服务器处理请求的速度,但是如果您有响应,则可以使用varnish进行缓存,这样做通常会更快.(有很多东西很难在清漆中缓存,特别是如果你使用的是cookie或者根据哪个用户正在看它们而改变页面.虽然在这些情况下可以继续使用清漆,除非你需要真的令人难以置信速度,据我所知,大多数人在点击清漆之前使用服务器端缓存和其他技术开始优化这些情况.)

(请注意,清漆也可以编辑标题,甚至可以编辑进出缓存的数据,这使事情变得复杂.但主要观点仍然存在,即使在动态清漆上编辑内容也非常快.)