![使用 haproxy 和 http-send-name-header Host 进行负载平衡](https://linux22.com/image/796449/%E4%BD%BF%E7%94%A8%20haproxy%20%E5%92%8C%20http-send-name-header%20Host%20%E8%BF%9B%E8%A1%8C%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我遇到了以下问题:
太长不看;
使用 haproxy 动态重写 HTTP Host 标头时,http-send-name-header Host
HTTP 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 补丁。