使用 haproxy 和 http-send-name-header Host 进行负载平衡

使用 haproxy 和 http-send-name-header Host 进行负载平衡

我遇到了以下问题:

太长不看;

使用 haproxy 动态重写 HTTP Host 标头时,http-send-name-header HostHTTP Response 标头似乎会混乱。使用 nginx 和proxy_set_header Host $upstream_addr;

我需要到达目标机器:1234 是:Host: target-machine:1234而不是Host: balancer:1234

长版本

我们有一个客户安装,其中只能运行 32 位 JVM,因此我们在 n 个不同的端口上生成了同一应用程序的 n 个实例:

target-machine:8766
target-machine:8767
target-machine:8768
target-machine:8769

我们确实有一个在专用机器上运行的平衡器balancer。客户端根据 IP 进行平衡(这是我们使用的软件的遗留问题)。

现在我们来看看最难的部分:我们打算使用的应用程序依赖于HTTP Host标头字段,因为某些操作会导致它发送内部请求。在我们当前的设置中,此内部请求将发送到负载均衡器,负载均衡器随后将其发送到目标计算机之一,但必然发送到它所来自的目标计算机。

我使用了 nginx上游模块以前(但我们现在不能了,因为另一个必须该软件的缺点是 HTTP Posts 不应被代理缓存,因为其上传进度表取决于此(叹...)) 可以通过添加来解决这个问题:proxy_set_header Host $upstream_addr;,但是 nginx 不支持流式上传。

我确实发现了http-send-name-header Host可能正是我需要它做的事情(参见我的haproxy配置文件此处),但会导致另一个问题,当我将行更改为http-send-name-header $AnythingButHost

该指令将正确的服务器名称添加到标头,但它似乎会弄乱代理请求,因为 jetty 过早关闭流并抛出org.mortbay.jetty.EofException。我需要的是一个像这样的 Host 标头:

Host: target-machine:8766

代替

Host: balancer:8181

对于浏览器来说,这个问题如下:截屏(发送内容的大小从几乎完整到只有几KB不等)。

当我不更改主机头时,它会立即起作用,但如果我将主机头更改为完全相同的值但使用 nginx,它就会起作用。

这确实让我很困惑。如果我能为您提供更多信息,请告诉我。

答案1

这是 HAProxy 的一个错误,已在 1.4.23 中修复。请参阅更改日志并搜索以http-send-name-header查看修复。我无法找到该错误的网页,但有在邮件列表中进一步讨论

还有一个1.4 补丁

相关内容