我最近遇到了一个名为Varnish的http网络加速器。根据我的阅读,Varnish通过使用反向代理配置优化与HTTP服务器的HTTP通信的每个进程来加速网站的交付。
我的问题是,如果你的网站将其缓存机制一直配置为静态html文件,那么Varnish对此有多大影响?反向代理是否会削减HTTP服务器处理请求所执行的工作?如果您在服务器端广泛缓存了所有内容(HTTP标头,Etags,过期标题,数据库缓存,片段和页面缓存),那么HTTP加速器还会做些什么来改进它?
答案 0 :(得分:21)
首先,我们应该区分正常网络系统中发生的两种不同类型的缓存: HTTP缓存和服务器端缓存。
HTTP缓存由HTTP标头控制,特别是当您指出ETag
和各种到期机制(包括Expires
和Cache-Control
的各个方面)时。这已全部包含在RFC 2616 (HTTP), section 13中,并允许HTTP 缓存从客户端返回对HTTP请求的响应,而无需返回原始服务器。实际上,在某些情况下,HTTP缓存机制允许客户端和服务器之间的另一台机器就像它是服务器一样。这实际上就是清漆的作用,我们将在一分钟内看到;许多人都熟悉的另一个常见用途是,当ISP在其网络中提供HTTP缓存时,通常可以比其网络外部的源服务器更快地响应其订户(从而提高感知性能)。
服务器端缓存包括数据库缓存,片段和页面缓存,它们实际上只是Web服务器的一种方式,避免执行一些昂贵的操作(例如,数据库查询或呈现特定的这样做一次然后将结果保存在缓存中一段时间。
我之前说过清漆是一个HTTP缓存,这意味着它可以比服务于静态文件的Web服务器更高效。考虑一下Web服务器必须做什么:
Accept-Encoding
)映射到文件Content-Length
,Content-Type
以及Expires
和Last-Modified
标头等内容用于HTTP缓存)ETag
和Vary
,这两者都是HTTP缓存的重要部分)和通用标头字段(RFC 2616 section 4.5)是必需的相比之下,清漆是所有这一切的上游,所以它所要做的就是:
如果没有条目,清漆必须做更多的工作:
特别是因为清单可以缓存HTTP标头和实体主体(整个响应),如果它可以从缓存中提供服务,那么它的工作量就会减少。当您开始在服务器中动态生成响应时,差异可能变得更加明显:假设您有一个生成需要5秒钟的页面,但对于每个访问您网站的人来说都是相同的,清漆应该可以在缓存中的大部分毫秒(加上通过网络向HTTP客户端获取响应所需的时间),并且具有一个简洁的机制(grace period),因此它可以在命中后端服务器时继续执行一次刷新页面的缓存版本。
当然,您可以引入服务器端缓存来提高Web服务器处理请求的速度,但如果您有响应,则可以使用varnish进行缓存,这样做通常会更快。 (有很多东西很难在清漆中缓存,特别是如果你使用的是cookie或者根据哪个用户正在看它们而改变页面。虽然在这些情况下可以继续使用清漆,除非你需要真的令人难以置信速度,据我所知,大多数人在点击清漆之前使用服务器端缓存和其他技术开始优化这些情况。)
(请注意,清漆也可以编辑标题,甚至可以编辑进出缓存的数据,这使事情变得复杂。但主要观点仍然存在,即使在动态清漆上编辑内容也非常快。)