【问题标题】:How does Varnish handle HTTP/2 Server Push?Varnish 如何处理 HTTP/2 服务器推送?
【发布时间】:2018-07-26 19:35:14
【问题描述】:

我一直在寻找使用 HTTP2 改进页面加载的方法,特别是使用服务器推送。

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

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

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

【问题讨论】:

    标签: varnish http2


    【解决方案1】:

    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 和 apache 中启用 http2,我想澄清的是堆栈的哪一部分处理“推送”。理想情况下,推送标头将由 varnish 解释并从缓存中出来以获得最大效率。如果当您“推送”这些资源时它们没有从缓存中出来,我觉得就速度提升而言可能不值得。
    • 请重新阅读答案。您 CAB 在 haproxy 和 Apache 上启用了 HTTP/2,但您不能在 haproxy 上启用 HTTP/2 Push,因此它永远不会被使用,因此您的问题无关紧要。如果你的边缘点(haproxy)支持它,你只能启用推送——它不支持。仅仅因为某些东西支持 HTTP/2 并不意味着它支持所有的 HTTP/2。值得注意的是,通常不支持 Push,而且能够通过 HTTP/2 连接到下游系统(例如 Varnish/Apache)而不是仅仅接受传入的 HTTP/2 连接的支持更差(只有 Apache 允许这种 AFAIK)。跨度>
    • 但是假设 haproxy 和/或 Varnish 确实添加了推送支持,那么最好的选择是边缘点(如果充当 HTTP 代理,则为 haproxy,如果 haproxy 充当 TCP 代理,则为 Varnish)推送资源,并通过 Varnish 缓存请求这个推送的资源。
    • 啊,明白了,巴里干杯,我的阅读理解能力很差。因此,无论 varnish 是否可以解释推送都无关紧要,因为它与 haproxy 之间不会是 http2 连接......
    【解决方案2】:

    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>

    【讨论】:

    • 您不一定需要一直支持 HTTP/2 和/或 HTTP/2 和 PUSH。通过发送链接标头从边缘服务器推送是最简单的。请参阅关于 Apache 的讨论:github.com/icing/mod_h2/issues/154。我找不到任何地方可以说明 HAProxy 完全支持推送,所以怀疑你甚至不能这样做,除非切换到 TCP 模式。似乎他们更喜欢 103 而不是 Push (haproxy.com/blog/haproxy-1-9-has-arrived/#early-hints-http-103),这可能是一个不错的选择 - Push 很难正确处理。
    猜你喜欢
    • 2017-09-06
    • 2017-04-06
    • 2015-12-08
    • 2015-07-02
    • 2019-05-24
    • 1970-01-01
    • 2017-03-04
    • 2019-10-10
    • 2020-04-23
    相关资源
    最近更新 更多