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"
我有一个 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 主机进行路由,如
您应该问自己的另一个问题是
我已经在 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"