【发布时间】:2018-07-26 19:35:14
【问题描述】:
我一直在寻找使用 HTTP2 改进页面加载的方法,特别是使用服务器推送。
我们有一个 HAProxy => Varnish => Apache 配置。
我知道 varnish 5 可以处理 HTTP2 请求,但是当请求在页面上有更多资源的服务器推送标头时,这些资源是从缓存中出来还是只是传递给 apache?
我的想法是,如果这些服务器推送标头没有被清漆处理,那将是页面加载的威慑,而不是净收益......
【问题讨论】:
我一直在寻找使用 HTTP2 改进页面加载的方法,特别是使用服务器推送。
我们有一个 HAProxy => Varnish => Apache 配置。
我知道 varnish 5 可以处理 HTTP2 请求,但是当请求在页面上有更多资源的服务器推送标头时,这些资源是从缓存中出来还是只是传递给 apache?
我的想法是,如果这些服务器推送标头没有被清漆处理,那将是页面加载的威慑,而不是净收益......
【问题讨论】:
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(这是唯一支持 Push 的部分),因此除非使用 HTTP/2,否则它甚至不会尝试推送资源。
支持这一点的最简单方法是简化您的基础架构。我不确定您是否拥有同时需要 HAProxy 和 Varnish 的卷,或者您是否有其他原因以这种方式进行设置?如果没有,那么您可以完全摆脱它们而只使用 Apache。或者,只需使用 HAProxy 作为 TCP 代理,并使用 HTTP/2 连接到任何 Apache 实例(无论是否通过 TLS)。
另一种选择是在 HAProxy 前面放置另一个 Apache 实例来处理 HTTP/2 和 HTTP/2 推送。后端连接可以通过 HTTP/1 然后向这个新的 Apache 发出信号以使用 Link 标头(甚至通过 HTTP/1)推送资源,并且它将适当地从下游请求资源(如果可以从 Varnish 缓存中读取它,如果它是这样设置的)。但是运行 Apache -> HAProxy -> Varnish -> Apache 对于大多数网站来说听起来确实有点矫枉过正。
【讨论】:
HAproxy 1.9 现在通过“选项 http-use-htx”支持 HTTP/2 推送 它可以使用 Varnish(和其他非 TLS)作为带有参数“proto h2”的 HTTP/2 后端服务器。
它还可以使用支持 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-browser -> 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-Webserver (IIS) p>
【讨论】: