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

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

我正在探索使用 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

这对于单个后端来说效果很好,但我不知道如何根据哪个后端提供请求来包含正确的主机标头:

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

无论何时使用上述方法,它都不起作用,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 地址,因此我们使用主机标头来解析。

答案1

我不确定下面的方法是否可行,现在也无法测试,但也许这仍然有帮助。(我稍后有时间再看看):

解决方案 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

解决方案 2:

笔记 官方不推荐这个。阅读评论http 发送名称标头:据报道,该指令目前被用作覆盖传出请求中的 Host 标头字段的一种方式;虽然已知此技巧作为该功能的副作用已经起作用一段时间了,但它并未得到官方支持,并且在未来版本中可能不再起作用,这取决于此功能引起的技术困难……[致谢锈迹斑斑

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

答案2

我想补充gf_答案。所以他的答案的想法是添加一个自定义主机头该值是源主机名本身。在解决方案一中,基本上,他使用以下条件手动设置标头:srv_id事物。

第二种方法是将主机名作为主机头

但在他的解决方案中,他没有提到它只设置标题,如果标题已经存在,它不能替换现有的标题,所以如果你的情况需要更换主机头,你可以做这样的事情

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request replace-header Host node1.myapp.mycompany.com node1.myapp.mycompany.com if { srv_id 1 }
    http-request replace-header Host node2.myapp.mycompany.com node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

相关内容