如何在HAProxy上启用HTTP / 2?

时间:2016-11-17 13:38:23

标签: http https haproxy http2

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

enter image description here

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

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

3 个答案:

答案 0 :(得分:32)

HAProxy 1.8支持HTTP / 2

来自the 1.8 announcement

  

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

您需要h2中的haproxy.conf指令。来自 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。

答案 1 :(得分:1)

haproxy真的不支持http / 2

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

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

答案 2 :(得分:1)

如果您能够在NginX旁边运行一些HaProxy,则应该在您的负载均衡器上运行。 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

  • 使用HTTP/2

  • 中的NginX终止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标头。