我确实使用http模式配置了使用https终止的HAProxy:
frontend apache-https
#mode tcp
bind 192.143.56.150:443 ssl crt /etc/ssl/private/rabbit.pem
option http-server-close # needed for forwardfor
option forwardfor # forward IP Address of client
reqadd X-Forwarded-Proto:\ https
default_backend apache-http
acl fx_static hdr(host) -i static.rabbit.fx-com
use_backend nginx-cluster if fx_static
现在我想改变静态。域到http2。问题是,为了做到这一点,我需要切换到tcp模式,同时我将失去ACL http模式功能。
如何在tcp模式下为同一IP和端口配置HAProxy以使用2个不同的后端?
我想将此行与tcp模式一起用于静态。
use_backend nginx-cluster-http2 if { ssl_fc_alpn -i h2 }
答案 0 :(得分:1)
下面的解决方案消除了http
模式,因此注入了前向标头,有利于通过send-proxy
指令使用PROXY协议。后端服务器必须能够接受PROXY协议,Apache和Nginx都支持它。
使用SNI而不是Host
标头执行主机匹配。
静态域的HTTP / 2请求将被转发到HTTP / 2后端服务器,在监听127.0.0.1:8888
的示例中,其中明文HTTP / 2服务器必须正在侦听。
所有其他请求将被转发到127.0.0.1:9999
,其中明文HTTP / 1.1服务器必须正在侦听。
frontend fe
mode tcp
bind *:443 ssl no-sslv3 crt /etc/ssl/domain.pem
acl static_domain req.ssl_sni -i static.domain.com
acl http2 ssl_fc_alpn -i h2
use_backend be_static if static_domain http2
default_backend be_non_static
backend be_static
mode tcp
server 127.0.0.1:8888 send-proxy
backend be_non_static
mode tcp
server 127.0.0.1:9999 send-proxy
如果您确实需要转发标头,例如因为您的应用程序依赖它们,您可以使用以下解决方案:
frontend fe
mode tcp
bind *:443 ssl no-sslv3 crt /etc/ssl/domain.pem
acl static_domain req.ssl_sni -i static.domain.com
acl http2 ssl_fc_alpn -i h2
use_backend be_static if static_domain http2
default_backend be_non_static
backend be_static
mode tcp
server 127.0.0.1:8888 send-proxy
backend be_non_static
mode tcp
server 127.0.0.1:7777 send-proxy
frontend fe_non_static
mode http
bind 127.0.0.1:7777 accept-proxy
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend be_other
backend be_other
mode tcp
server 127.0.0.1:9999
对于第二个解决方案,我们的想法是HTTP / 2静态请求将像以前一样工作,而其他请求将首先被定向到一个私有的“本地”前端,监听端口7777,工作在http
模式,您可以在其中注入前进标题。
从私有“本地”前端,您可以像以前一样转发到后端服务器 - 只有这次您不需要send-proxy
指令。
鉴于几乎所有服务器都广泛支持PROXY协议,我建议不要使用 forward 标头,除非确实有必要。