【问题标题】:How can I enable HTTP/2 on HAProxy?如何在 HAProxy 上启用 HTTP/2?
【发布时间】:2017-04-01 02:01:18
【问题描述】:

我们最近从 HTTP 转向了 HTTPS。由于我们已经迁移到 HTTPS,我们正在考虑迁移到 HTTP/2 以获得性能优势。

如上所述,浏览器和 LB 之间的请求是安全的 (HTTPS),而 LB 和应用服务器之间的通信仍然使用 HTTP

在当前设置下启用 HTTP/2 的可能性有多大?我们可以在浏览器和 LB 之间启用 HTTP/2,而 LB 和应用服务器之间的通信保持在 HTTP 上吗?

【问题讨论】:

    标签: http https haproxy http2


    【解决方案1】:

    2017 年更新:HAProxy 1.8 支持 HTTP/2

    来自the 1.8 announcement

    HAProxy 1.8 现在在客户端(在前端部分)支持 HTTP/2,并且可以充当 HTTP/2 客户端与您的 HTTP/1.1 和 HTTP/1.0 应用程序之间的网关。

    您需要在 haproxy.conf 中使用 h2 指令。来自 CertSimple's HAProxy HTTP/2 and dynamic load balancing guide

    frontend myapp
      bind :443 ssl crt /path/to/cert.crt alpn h2,http/1.1
      mode http
    

    HAProxy 的旧版本

    较旧版本的 HAProxy(如 1.6 和 1.7)仅支持直通 HTTP/2 - 即将流量引导到支持 HTTP/2 的单独应用服务器。这要复杂得多-请参阅有关如何执行此操作的其他答案。要终止 HTTP/2 并读取 HAProxy 上的流量,您需要 HAProxy 1.8。

    【讨论】:

    • 这里快速说明:alpn http/1.1,h2 - alpn 选项的顺序是“preference”。因此,如果您希望用户首先使用 HTTP2,请使用:alpn h2,http/1.1
    • 只是一个简短的说明。从 HTTP2 到 HTTP1.1 的转换仍然存在一些问题。对于我们的 HTTPS GZip POST,Transfer-Encoding(不包含在 HTTP2 中)没有自动转换为 HTTP1.1,因此没有读取正文。如果有人遇到同样的问题,请尝试仅使用 http 1.1。那里的协议需要 Transfer-Encoding = chunked (即使它是 HTTP2 的默认设置)。因此,如果在 HAProxy 上手动完成,这是可行的。让系统自动转换不会加这个header。
    • @TobiasReich 添加指向您报告的 HAProxy 错误的链接
    • 我承认,我现在还没有提交错误报告。 (老实说,我还没有找到他们的 bugtracker 页面。Githup 页面也没有提供问题......)
    【解决方案2】:

    如果您能够在 HaProxy 旁边运行一些 NginX,则以下内容应该适用于您的负载均衡器。 NginX 被(ab)用作纯 SSL 终结器,而不是功能齐全的 Web 服务器,因此此 NginX 不提供任何内容。

    警告:这是在匆忙中完成的,因此无法验证这是否真的有效。缺少一些示例,对于链接非常抱歉。

    我将这个想法命名为 Munchhausen 的著名照片,他将自己和马从泥潭中拉出来

    蒙克豪森方法

    首先,do a H2 setup in HaProxy 就像Scott Farrell 的答案一样,并进行了以下调整:

    frontend http-in
        mode http
        bind *:80
        option forwardfor
        default_backend nodes-http
    
    frontend https-in
        mode tcp
        bind *:443 ssl crt /etc/ssl/dummy.pem alpn h2,http/1.1
        use_backend nodes-http2 if { ssl_fc_alpn -i h2 }
        default_backend nodes-http
    
    frontend http-lo
        mode http
        bind 127.0.0.1:82
        #http-request set-header X-Forwarded-For req.hdr_ip([X-Forwarded-For])
        default_backend nodes-http
    
    backend nodes-http
        mode http
        server node1 web.server:80 check
    
    backend nodes-http2
        mode tcp
        server loadbalancer 127.0.0.1:81 check send-proxy
    

    这会将HTTP/2 连接循环回您的负载平衡器机器,并接受解码后的请求以通过http-lo 再次进入负载平衡。

    现在在 LB 本身上,启动 NginX 以侦听端口 81,如配置中所示 实例终止HTTP/2 连接并将其再次代理回您的负载均衡器。

    在 NginX 中确保:

    • 使用send-proxy-protocol in NginX

    • NginX 中使用HTTP/2 终止SSL

    • 将所有内容透明地(又名愚蠢)代理回HaProxy 端口82

      # Sorry, example `NginX`-config is missing here,
      # but it includes something like:
      proxy_pass http://127.0.0.1:82;
      
    • 不要忘记在代理请求中通过 X-Forwarded-For 标头包含 Client-IP(我不知道如何配置 NginX 以在传出代理请求上使用“发送代理”协议)。

    请注意,此设置大部分是静态的。变化的部分是关于所有这些域及其 TLS 证书。

    HTTP/2请求流程的ASCII图片

         Browser
            |  HTTP/2
            V
         Loadbalancer HaProxy *:443
            |  frontend https-in
            |  backend nodes-http2
            |  send-proxy
            |  TCP (transparent, HTTP/2)
            V
         Loadbalancer NginX 127.0.0.1:81 
            |  HTTP/2 termination
            |  proxy_protocol
            |  proxy_pass 127.0.0.1:82
            |  Add header X-Forwarded-For
            |  HTTP
            V
         Loadbalancer HaProxy 127.0.0.1:82
            |  frontend https-lo
            |  Forward Header X-Forwarded-For
            |  backend nodes-http
            |  # DO YOUR LOADBALANCING HERE
            |  HTTP
            V
          web.server:80
    

    是的,它通过 HaProxy 循环了 2 次,但是由于 HaProxy 的运行速度如此之快,它的运行速度非常快。

    真正低效的部分是将HTTP/2 标头解压缩为纯HTTP 标头..

    【讨论】:

      【解决方案3】:

      haproxy 还不支持 http/2

      它唯一的支持是检测 http/2 请求,并将 https / tcp443 tcp 流传递给支持 https 和 http/2 的服务器

      这是别人的指南 http://m12.io/blog/http-2-with-haproxy-and-nginx-guide

      【讨论】:

      • 您的评论似乎已过时。 HAProxy 在 1.8 版本中支持 Http2
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2021-06-10
      • 2021-04-01
      • 2017-04-30
      • 2018-07-30
      • 2018-03-22
      相关资源
      最近更新 更多