我遇到了以下问题:
tldr;
使用http-send-name-header Hostdynamic重写HTTP主机头时http-send-name-header Host haproxy似乎搞乱了HTTP响应头。 这样做使用nginx和proxy_set_header Host $upstream_addr;时可以正常工作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代理不应该被代理caching,因为它的上传进度表取决于这个( 叹息… ))并且可以解决这个问题join: proxy_set_header Host $upstream_addr; ,但nginx不支持上传stream媒体。
我发现http-send-name-header Host可能正是我所需要的(请参阅我的haproxy.cfg ),但会导致另一个问题,当我将该行更改为http-send-name-header $AnythingButHost
该指令将正确的服务器名称添加到头部,但似乎与代理请求混乱,因为jetty过早地closures了stream,并抛出org.mortbay.jetty.EofException以及。 我需要的是一个主机头像:
Host: target-machine:8766
代替
Host: balancer:8181
对于浏览器来说,这个问题如下图所示(发送内容的大小从几乎完整到几KB不等)。
当我不更改主机头时它会立即起作用,但是如果我将主机头改为完全相同的值,但是使用nginx,它就可以工作。
这真的让我感到困惑。 如果我可以帮助你的任何更多的信息,让我知道。
这是HAProxy中的一个bug,在1.4.23中修复了。 查看更改日志并searchhttp-send-name-header以查看修复程序。 我无法找出错误的网页,但在邮件列表中有进一步的讨论 。
1.4还有一个补丁 。