我正在探索使用 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 设置主机?
- 如果是这样,这意味着我的
check
s 也需要根据后端提供正确的主机头,该怎么做?
编辑:正在使用 HA-Proxy 版本 1.7.9 2017/08/18
让我再介绍一下背景。我们以前只myapp.mycompany.com
提供 api 请求。我们需要扩展它。我们的客户端仍将调用myapp.mycompany.com
,但这只会指向 HAProxy,它会将其平衡为node1.myapp.mycompany.com
和node2.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