Varnish 是如何处理 HTTP/2 Server Push 的?

How does Varnish handle HTTP/2 Server Push?

我一直在寻找使用 HTTP2 尤其是使用服务器推送来改善页面加载的方法。

我们有一个 HAProxy => Varnish => Apache 配置。

我知道 Varnish 5 可以处理 HTTP2 请求,但是当请求有服务器推送时 headers 以获取页面上的更多资源,这些资源是从缓存中出来还是只是传递给 Apache?

我的想法是,如果那些服务器推送 headers 没有被清漆处理,那将是页面加载的阻碍而不是净收益...

HAProxy 1.8 在前端仅支持 HTTP/2,然后将使用 HTTP/1.1 连接到 Varnish - 除非您将其用作 TCP 负载均衡器而不是 HTTP 负载均衡器? HAproxy 1.9 确实在后端添加了 HTTP/2(即在您的设置中添加到下游系统,如 Varnish)。我认为在将其用作 HTTP 代理时,两者都不支持 HTTP/2 Push。

Varnish 同样只支持 HTTP/2 在前端而不是推送 AFAIK。

所以基本上你不能在你当前的基础设施中使用 Push。它们将以 HTTP/1.1 连接的形式连接到 Apache(这是唯一支持推送的部分),因此它甚至不会尝试推送资源,除非使用 HTTP/2.

支持这一点的最简单方法是简化您的基础架构。我不确定您是否拥有同时需要 HAProxy 和 Varnish 的卷,或者您是否有其他原因需要这样设置?如果没有,那么您可以完全摆脱它们而只使用 Apache。或者,只需使用 HAProxy 作为 TCP 代理并使用 HTTP/2.

连接到任何 Apache 实例(无论是否通过 TLS)

另一种选择是在 HAProxy 前面放置另一个 Apache 实例来处理 HTTP/2 和 HTTP/2 推送。后端连接可以超过 HTTP/1 然后向这个新的 Apache 发送信号以使用 Link headers(甚至超过 HTTP/1)推送资源,它将从下游适当地(如果它是这样设置的,它可能会从 Varnish 缓存中读取它)。但是 运行 Apache -> HAProxy -> Varnish -> Apache 对大多数网站来说绝对听起来有点矫枉过正。

HTTP/2 HAproxy 1.9 现在支持推送 "option http-use-htx" 它可以使用 Varnish(和其他非 TLS)作为 HTTP/2 后端服务器,参数为 "proto h2".

它也可以使用启用了 TLS HTTP/2 的后端服务器和参数 "ssl verify none alpn h2"

但是我正在使用 Varnish 6.0 进行结构化以允许 HTTP/2 推回另一个启用 "proto h2" 的 HAproxy 前端,因为 Varnish 似乎只支持 HTTP/1.1 到它的后端服务器。 尽管 varnishlog 显示来自 HAProxy 的请求中使用了 HTTP/2 协议。

我已经测试了以下内容,它与 HTTP/2(end-2-end)一起工作。

HTTP/2-浏览器 -> Public-HAProxy-h2frontend -> Back-HAProxy-h2frontend-> HTTP/2-SSL-Webserver (IIS)

以下在 Varnish 之后失败,因为它只使用 http/1.1 到 Back-HAProxy-h2frontend,需要能够强制 varnish 继续使用 HTTP/2 到后端服务器。

HTTP/2-browser -> Public-HAProxy-h2frontend -> HTTP/2-Varnish -> Back-HAProxy-h2frontend-> HTTP/2-SSL 网络服务器 (IIS)