在HTTP模式下对HTTP / 2后端服务器的HA代理支持

时间:2018-01-26 18:39:22

标签: haproxy http2 tomcat9

我有一个支持HTTP / 2并在TLS1.2上运行的tomcat 9.0.2服务器。以下是server.xml中的连接器配置

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
    address="0.0.0.0"
    maxThreads="150" SSLEnabled="true" asyncTimeout="10000" maxHeaderCount="50"
    maxPostSize="1048576" scheme="https" secure="true" compression="force" 
    compressionMinSize="2048" maxConnections="10000">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig protocols="TLSv1.2">
        <Certificate certificateKeystoreFile="${keystore.file.path}"
            certificateKeystorePassword="${keystore.password}"
            certificateKeyAlias="${server.cert.alias}"
            certificateKeystoreType="${keystore.type}" />
    </SSLHostConfig>
</Connector>

我正在使用HA Proxy 1.8,配置如下

frontend  mydomain-ux
  mode    http
  bind    <ip>:8080 ssl crt /etc/certs/mydomain.com.cert.pem
  http-request set-var(txn.path) path
  acl mydomain hdr_end(host) -i mydomain.com
  use_backend mydomain_server if mydomain  

backend  mydomain_server
  mode    http
  server  mydomain_backeend_server <server-ip>:8443 ssl

因为我有多个基于主机的后端,我不能使用TCP模式并通过HTTP / 2 SSL终止

我是否可以在后端模式下使用HTTP / 2终止http?

2 个答案:

答案 0 :(得分:2)

据我所知,HAProxy在后端不支持HTTP / 2。他们只recently announced front end support。 (编辑于2019年1月18日 - 自v1.9中添加 - https://www.haproxy.com/blog/haproxy-1-9-has-arrived/)。

即使没有后端HTTP / 2支持, 也可以在HTTPS上终止前端,然后在TCP上转发到后端(不使用HTTPS),可以< / strong>可以使用HTTPS的SNI部分来执行您想要的可选路由(这是完全未经测试的btw):

frontend  mydomain-ux
  mode    tcp
  bind    <ip>:8080 ssl crt /etc/certs/mydomain.com.cert.pem alpn h2,http/1.1
  use_backend     mydomain_server      if { ssl_fc_sni mydomain.com}
  use_backend     mydomain_server2     if { ssl_fc_sni mydomain2.com }
  default_backend mydomain_server

backend  mydomain_server
  mode    tcp
  server  mydomain_backeend_server <server-ip>:8081

这将允许您的后端在端口8081上讲HTTP / 2但不使用HTTPS(端口8443),甚至可以在1.8之前(当添加前端HTTP / 2支持时)在HAProxy上工作。但是,这意味着您的Tomcat需要在没有SSL的情况下进行设置。

HAProxy也不建议使用SNI主机进行路由,如this answermailing thread it refers to中所述。另外SNI支持不是通用的(尽管对于所有实际意图,除非在XP上支持像IE8这样的老浏览器)。

您应该问自己的另一个问题是if you really need HTTP/2 in the backend or if just supporting this at the HAProxy level is enough

答案 1 :(得分:0)

我已经在Barry Pollard的上一篇文章的基础上完成了完整的h2管道,并做了一些修改,并且它的性能足以在开发人员中使用。还需要进行一些进一步的测试来清除生产路径。但至少是它的工作。

浏览器不支持

h2明文(h2c),因为Google希望每个人都使用ssl,但它在2个httpd服务器(经过apache测试,但不适用于nginx或tomcat或其他httpd)之间运行良好。

frontend  mydomain-ux
  mode    tcp
  bind    0.0.0.0:443 ssl crt /etc/ssl/tdl.pem  alpn h2,h2c,http/1.1
  bind    0.0.0.0:80  alpn h2,h2c,http/1.1
  use_backend     mydomain_server     if { ssl_fc_alpn -i h2 }
  default_backend mydomain_server

backend  mydomain_server
  mode    tcp
  http-request add-header X-Forwarded-Proto https
  server  mydomain_backeend_server 1.1.1.1:80
  server  mydomain_backeend_server2 1.1.1.2:80

这是我从后端access_log可以看到的内容:

1.1.1.3--[17 / Jan / 2019:10:57:49 -0500]“ GET / HTTP / 2.0” 403 3985“-”“ Mozilla / 5.0(Windows NT 6.1; Win64; x64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 71.0.3578.98 Safari / 537.36“