HA Proxy 在 http 模式下支持 HTTP/2 个后端服务器

HA Proxy support for HTTP/2 backend servers in http mode

我有一个 tomcat 9.0.2 服务器支持 TLS1.2 上的 HTTP/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 中终止?

据我所知,HAProxy 在后端不支持 HTTP/2。他们只有 recently announced front end support. (Edit 18th Jan 2019 - since added in v1.9 - https://www.haproxy.com/blog/haproxy-1-9-has-arrived/).

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

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 之前的 HAProxy 上运行(当添加了前端 HTTP/2 支持时)。但是,这意味着您的 Tomcat 需要在没有 SSL 的情况下进行设置。

HAProxy 也不建议使用 SNI 主机进行路由,如 and in the the mailing thread it refers to 中所述。此外,SNI 支持不是通用的(尽管从所有实际意图来看,它是通用的,除非在 XP 上支持真正的旧浏览器,如 IE8)。

您应该问自己的另一个问题是 ?

我已经在 Barry Pollard 之前的 post 的基础上完成了一个完整的 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, like Gecko) Chrome/71.0.3578.98 Safari/537.36"