3

I have a tomcat 9.0.2 server supporting HTTP/2 and running on TLS1.2. Below is the connector configuration in 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>

I am using HA Proxy 1.8 and configuration is like below

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

Since, I have multiple backends based on host, I cannot use TCP mode and do pass through HTTP/2 SSL termination

Is there a way I can have HTTP/2 termination in backend mode http ?

4

2 回答 2

4

据我所知,HAProxy 不支持后端的 HTTP/2。他们最近才宣布前端支持。(编辑 2019 年 1 月 18 日 - 自 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 主机进行路由,如本答案它所指的邮件线程中所讨论的。另外,SNI 支持不是通用的(尽管从所有实际意图来看,除非支持像 XP 上的 IE8 这样的非常旧的浏览器)。

您应该问自己的另一个问题是,您是否真的需要在后端使用 HTTP/2,或者仅在 HAProxy 级别支持它就足够了

于 2018-01-27T12:57:06.840 回答
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 , 像壁虎) Chrome/71.0.3578.98 Safari/537.36"

于 2019-01-17T16:16:35.613 回答