我最近遇到了一个名为Varnish的http网络加速器。据我所知,Varnish通过使用反向代理配置来优化与HTTP服务器的每个HTTP通信过程,从而加快了网站的交付速度。
我的问题是,如果你有一个网站,它的缓存机制一直配置到静态html文件,那么Varnish会对此产生多大的影响?反向代理是否会减少HTTP服务器处理请求所执行的工作?如果您在服务器端广泛缓存了所有内容(HTTP标头、Etags、Expires标头、数据库缓存、片段和页面缓存),那么HTTP加速器还会在这方面做些什么呢?
发布于 2012-04-02 03:02:20
首先,我们应该区分正常web系统中发生的两种不同类型的缓存: HTTP缓存和服务器端缓存。
HTTP缓存由headers控制,特别是正如您所指出的ETag和各种过期机制(包括Expires和Cache-Control的各个方面)。这在RFC 2616 (HTTP), section 13中都有涉及,并且允许HTTP缓存返回对来自客户端的HTTP请求的响应,而不必返回源站。实际上,HTTP缓存机制允许客户机和服务器之间的另一台机器在某些情况下充当服务器。这实际上就是varnish正在做的事情,我们马上就会看到;很多人熟悉的另一个常见用法是is在他们的网络中提供HTTP缓存,它通常可以比网络外的源服务器更快地响应他们的订阅者(并因此提高感知到的性能)。
服务器端缓存包括数据库缓存、片段缓存和页面缓存,这些实际上都是web服务器避免执行一些昂贵的操作(例如,数据库查询或呈现特定的模板部分)的方法,只需执行一次操作,然后将结果保存在缓存中一段时间。
我之前说过varnish是一种HTTP缓存,这意味着它马上就能比web服务器更高效地提供静态文件服务。考虑一下web服务器必须做的事情:
Accept-Encoding)映射到一个文件Content-Length、<代码>D17和在HTTP URI中使用的<代码>D18和<代码>D19标头)中使用的哪些额外的响应头(<代码>C22;其中包括ETag和Vary,这两个都是超文本传输协议缓存的重要部分)和通用标头字段(RFC 2616 section 4.5)是必需的,以便将超文本传输协议状态行和标头写出到网络,文件的内容输出到相比之下,varnish是所有这一切的上游,所以它所要做的就是:
中
如果没有条目,varnish必须做更多的工作:
特别是,因为HTTP头和实体主体(整个响应)可以由varnish缓存,所以如果它可以在缓存之外提供服务,那么它需要做的工作就更少了。当您开始在服务器中动态生成响应时,差异可能会变得更加明显:假设您有一个需要5秒生成的页面,但对访问您的站点的每个人都是一样的,varnish应该能够在缓存之外的最多毫秒内提供该响应(加上通过网络将响应发送到HTTP客户端所需的时间),并且具有一种整洁的机制( ),因此它可以在访问后端服务器一次以刷新页面的缓存版本的同时继续执行此操作。
当然,你可以引入服务器端缓存来提高你的web服务器处理请求的速度,但是如果你有一个可以用varnish缓存的响应,这样做通常会更快。(在varnish中有很多东西很难缓存,特别是如果你正在使用cookie,或者你的页面会随着用户的浏览而改变。虽然在这些情况下可以继续使用varnish,除非你真的需要难以置信的速度,但据我所知,大多数人在使用varnish之前都会使用服务器端缓存和其他技术来优化这些情况。)
(请注意,varnish还可以编辑标头以及进出缓存的数据,这会使事情变得复杂。但是要点仍然存在,即使是在动态编辑的时候,清漆也可以非常快。)
https://stackoverflow.com/questions/9957683
复制相似问题