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

时间:2010-06-15 15:19:46

标签: varnish

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

这会在用户看到任何内容之前造成巨大延迟。如果我绕过Varnish并直接进入该网站,它会立即响应。

虽然总页面加载时间可能相似,但人们认为网站速度很慢。

有人遇到过这个吗?

3 个答案:

答案 0 :(得分:2)

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

尝试更改HTML以从不使用Varnish的其他主机名加载静态(JS,CSS和图像);这应该使事情更容易调试。 您可以通过使用命令行HTTP客户端获得相同的结果,例如curl。 如果您在这种情况下仍然看到相同的缓慢性能,请查看清漆日志,它可能会为您提供更多可供检查的内容。随意添加它作为评论,这样我们就能够更好地帮助你。

答案 1 :(得分:0)

使用加载的完整页面(所有css,js等)你的意思是只嵌入的js和css资源,我是对的吗?在将响应发送到客户端之前,Varnish将缓冲(并希望存储)整个响应。如果您的后端以递增方式发送响应(例如,分块),则非缓存页面可能会显得较慢,因为它仅在后端发送其最后一块后由varnish传递。

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

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

答案 2 :(得分:0)

我认为你对清漆的响应缓冲感到困惑。假设你的后端可以用给定请求的100k页面响应最快10秒,每秒发送10k。如果堆栈中没有清漆,客户端连接会直接通过隧道传输到后端,浏览器会在1秒钟内开始接收数据(前10k,开始解析,渲染,跟踪<link>标签等)。

在堆栈中使用varnish,它会在将第一个字节发送到客户端之前等待后端发送整个页面。所以客户端必须等待10秒才能开始呈现页面,跟随<link>标签等。信不信由你,这有两个主要原因。一,如果该响应是可缓存的,则下一个客户端将不必等待10秒以使后端生成响应,清漆将很快服务(ms,而不是s)。如果你的命中率很高,你应该对其进行优化,那么等待响应的第一个字节的初始成本会在未来的缓存命中中支付很多分红。二,让我们说一个手机上的手机信号不稳定请求相同的100k页面,但它不能像后端那样快速下载页面,它需要一分钟才能收到100k页面。有了清漆,apache不必浪费连接和线程整整一分钟(大多数是空闲,请注意),同时缓慢地将数据传输到客户端。它尽可能快地将数据发送到清漆,然后继续下一个请求,同时清漆将数据缓慢地发送给客户端。

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