代码之家  ›  专栏  ›  技术社区  ›  Chaitanya

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

  •  3
  • Chaitanya  · 技术社区  · 8 年前

    我有一个支持HTTP/2的tomcat 9.0.2服务器,运行在TLS1.2上。下面是服务器中的连接器配置。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中终止HTTP/2?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Barry Pollard    7 年前

    据我所知,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),并且 也许 可以使用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主机进行路由,如中所述 this answer mailing 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 ?

        2
  •  0
  •   wyzeman    7 年前

    我已经在BarryPollard的前一篇文章的基础上完成了一个完整的h2管道,并做了一些修改,现在已经可以在dev中使用了。需要进行一些进一步的测试,以扫清生产道路。但至少是它的工作。

    浏览器不支持h2明文(h2c),因为谷歌希望每个人都使用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
    

    以下是我从backend access\u日志中看到的内容:

    1.1.1.3--[2019年1月17日: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”

    推荐文章