配置 HAProxy 以包含不同后端的主机标头

Mat*_*att 6 iis proxy haproxy host-headers

我正在探索使用 HAProxy 作为在 IIS 上运行的一组 web api 前面的平衡器。

  • node1.myapp.mycompany.com
  • node2.myapp.mycomapny.com

我们目前正在使用主机头来正确解析 IIS 上的正确 Web 应用程序。例如,我们可能在同一服务器/端口上运行 otherapp.mycompany.com,但使用主机头 IIS 知道要提供哪个服务。

我对 HAProxy 的最初尝试给我留下了 404 错误,因为我的请求中没有包含主机标头,因此 IIS 提供绑定到给定 IP 的默认站点,而不是按主机名解析。

修复给我留下了这样的东西:

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)

这对单个后端很有用,但我对如何根据哪个后端提供请求包含正确的主机头感到头疼:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)

每当node2使用上述内容时都不起作用,因为它在 IIS 中无法正确解析(在这种情况下,node2 位于不同的服务器上,因此 IP 不同。事实上,如果它们在同一服务器/IP 上运行,我怀疑请求工作“工作”,但它们都将由每个主机标头的 node1 提供服务)。

  • 是否可以根据用于提供请求的后端的 url 设置主机?
  • 如果是这样,这意味着我的checks 还需要基于后端提供正确的主机标头,这将如何完成?

编辑:我正在使用 HA-Proxy 版本 1.7.9 2017/08/18

让我再介绍一下背景。我们过去只myapp.mycompany.com提供 api 请求。我们需要扩展它。我们的客户仍然会调用myapp.mycompany.com,但这只会指向 HAProxy,它会将其平衡为node1.myapp.mycompany.comnode2.myapp.mycompany.com。我们当前的服务器配置让我们在每台服务器上绑定一个 IP 地址,因此我们使用主机头来解析。

gf_*_*gf_ 13

我不确定以下是否有效,现在无法测试,但也许这仍然有帮助。(我稍后会再看一看):

解决方案1:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request set-header Host node1.myapp.mycompany.com if { srv_id 1 }
    http-request set-header Host node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)

解决方案2:

注意 官方不推荐使用此方法。阅读关于http-send-name-header的评论:据报道,该指令当前被用作覆盖传出请求中的 Host 标头字段的方法;虽然这个技巧一段时间以来一直被认为是该功能的副作用,但它没有得到官方支持,并且可能在未来版本中不再起作用,这取决于该功能引起的技术困难...... [Credits to rustyx。 ]

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-send-name-header Host
    server node1.myapp.mycompany.com node1.myapp.mycompany.com:80
    server node1.myapp.mycompany.com node2.myapp.mycompany.com:80
Run Code Online (Sandbox Code Playgroud)