在向浏览器发送响应之前,Varnish等待整个页面加载

问题描述:

我已经设置了清漆坐在tomcat服务器前面。我注意到的是,在向浏览器发送任何响应之前,Varnish似乎等待整个页面加载(所有css,js等)。在向浏览器发送响应之前,Varnish等待整个页面加载

这会在用户看到任何东西之前导致巨大的延迟。如果我绕过清漆并直接进入现场,它会立即响应。

尽管总页面加载时间可能相似,但感觉是该网站很慢。

有没有人遇到过这个?

随着加载的全部页面(所有的CSS,JS等)你的意思是只有嵌入的JS和CSS资源,我是对吗?在发送给客户之前,清漆会缓冲(并希望存储)整个响应。如果您的后端以增量方式发送响应(例如,分块),则非缓存页面可能会显得较慢,因为它仅在后端发送其最后一部分后才通过清漆传送。

如果这是一个问题,请更改应用程序的技术设计。确保大多数请求可以从缓存中提供(这些页面将非常快)并且将css资源(浏览器缓存避免了根本不需要的请求)外部化。如果只有一小部分页面缓慢且缓存不准确,请异步加载它(例如Ajax)。

还有增量渲染的概念(随着更多资源可用,浏览器会重新渲染页面),但我不明白Varnish如何改变这种行为。

除非在HTML中嵌入JS和CSS,否则所描述的行为在技术上是不可能的。 您的浏览器需要接收并解析HTML,才能提取<script><link>标签并发送单独的HTTP请求;即使他们到达相同的Varnish服务器,也不会知道他们是同一个“页面”的一部分。

尝试更改HTML以加载静态(JS,CSS和图像)不同的主机名称,不会去光油;这应该使事情更容易调试。 您可以使用命令行HTTP客户端获得相同的结果,例如curl。 如果您在这种情况下仍然看到相同的低性能,请查看光油日志,它可能会给您提供不少想法,以便查看更多内容。随意添加,作为评论,这样我们将能够更好地帮助你。

我觉得你被涂料的反应缓冲困惑了。假设最快的后端可以响应一个100k页面,对于给定的请求是10秒,每秒发送10k。如果您的堆栈中没有清漆,则客户端连接会直接隧道传输到后端,并且浏览器在1秒内开始接收数据(第一个10k,并开始解析,呈现并跟随<link>标签等)。

随着清漆在您的堆栈中,它发送第一个字节到客户端之前等待后端发送整个页面。因此,客户端必须等待10秒钟,直到它可以开始呈现页面,跟在<link>标签之后。相信与否,这有两个主要原因是好事。其一,如果该响应是可缓存的,则下一个客户端将不必等待10秒钟以便后端生成响应,而清漆将很快(ms,而不是s)提供服务。如果您的命中率很高,您应该优化,那么必须等待响应的第一个字节的初始成本在未来的缓存命中中支付许多分红。二,假设一个手机上的一个单点信号请求相同的100k页面,但它不能像后端能够生成的一样快速下载页面,它需要一整分钟来接收100k页面。使用清漆后,apache不必浪费连接并在整个分钟内(大部分是空闲的,介意你)连线,而它将数据缓慢地传输到客户端。它将数据尽可能快地发送到清漆,然后移动到下一个请求,而清漆缓慢地将数据发送到客户端。

对于已知不可缓存的请求,您可以通过VCL配置varnish,如果您愿意,可以配置为return (pipe),这将导致无响应缓冲。它会在收到数据后立即将数据从您的后端发送到客户端。但是在default.vcl管道中没有使用。