如何使用2个不同的后端在tcp模式下为相同的IP和端口配置HAProxy?

时间:2016-12-30 10:33:27

标签: nginx haproxy http2

我确实使用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 }

1 个答案:

答案 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 标头,除非确实有必要。