我有一个支持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?
答案 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 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?
答案 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“