我已经设置清漆坐在一个tomcat服务器的前面。我注意到的是,Varnish 似乎在向浏览器发送任何响应之前等待整个页面加载(所有 css、js 等)。
这会在用户看到任何东西之前造成巨大的延迟。如果我绕过 Varnish 直接访问该站点,它会立即响应。
虽然总页面加载时间可能相似,但人们认为网站速度很慢。
有没有人遇到过这个?
我已经设置清漆坐在一个tomcat服务器的前面。我注意到的是,Varnish 似乎在向浏览器发送任何响应之前等待整个页面加载(所有 css、js 等)。
这会在用户看到任何东西之前造成巨大的延迟。如果我绕过 Varnish 直接访问该站点,它会立即响应。
虽然总页面加载时间可能相似,但人们认为网站速度很慢。
有没有人遇到过这个?
除非您的 HTML 中有 JS 和 CSS 内联,否则您描述的行为在技术上是根本不可能的。您的浏览器需要接收和解析 HTML 以提取<script>
和<link>
标记并发送单独的 HTTP 请求;即使他们到达同一个 Varnish 服务器,它也不知道他们是同一个“页面”的一部分。
尝试更改 HTML 以从不使用 Varnish 的不同主机名加载静态(JS、CSS 和图像);这应该使事情更容易调试。您可以使用命令行 HTTP 客户端获得相同的结果,例如curl
. 如果您在这种情况下仍然看到同样缓慢的性能,请查看 Varnish 日志,它可能会为您提供很多想法,以便检查更多内容。随意将其添加为评论,这样我们将能够更好地帮助您。
加载完整的页面(所有 css、js 等)你的意思是只有嵌入的 js 和 css 资源,对吗?Varnish 将在将响应发送给客户端之前将其作为一个整体缓冲(并希望存储)。如果您的后端以增量方式发送响应(例如分块),则非缓存页面可能会显得较慢,因为它仅在后端发送最后一块后才由清漆交付。
如果这是一个问题,请更改应用程序的技术设计。确保可以从缓存中处理大多数请求(这些页面将非常快)并外部化 js 和 css 资源(浏览器缓存完全避免发出请求)。如果您的页面只有一小部分速度很慢并且缓存能力很差,请异步加载它(例如 Ajax)。
还有增量渲染的概念(当更多资源可用时浏览器重新渲染页面),但我不知道 Varnish 会如何改变这种行为。
我认为您对 varnish 的响应缓冲感到困惑。假设您的后端对给定请求响应 100k 页面的最快速度是 10 秒,每秒发送 10k。如果堆栈中没有 varnish,客户端连接会直接通过隧道连接到后端,并且浏览器会在 1 秒内开始接收数据(前 10k,然后开始解析、渲染、跟踪<link>
标签等)。
使用堆栈中的清漆,它会等待后端发送整个页面,然后再将第一个字节发送给客户端。所以客户端必须等待 10 秒才能开始渲染页面,如下<link>
标签等。信不信由你,这是一件好事,主要有两个原因。第一,如果该响应是可缓存的,下一个客户端将不必等待 10 秒让后端生成响应,varnish 将很快地提供它(ms,而不是 s)。如果您的命中率很高,您应该针对这一点进行优化,那么必须等待响应的第一个字节的初始成本会为未来的缓存命中带来很多好处。二,假设手机信号不稳定,请求相同的 100k 页面,但它无法像后端生成页面那样快速下载页面,它需要整整一分钟才能接收到 100k 页面。有了清漆,apache 就不必浪费一整分钟的连接和线程(请注意,大部分时间是空闲的),而它会慢慢地将数据传输到客户端。它尽可能快地发送数据以进行清漆,
对于已知不可缓存的请求,您可以根据需要通过 VCL 配置清漆,return (pipe)
这将导致没有响应缓冲。它会在收到数据后立即从您的后端直接向客户端发送数据。但在 default.vcl 中不使用管道。