Eu encontrei o seguinte problema:
tldr;
Quando reescrever dinamicamente o cabeçalho do Host HTTP com http-send-name-header Host
haproxy parece atrapalhar os cabeçalhos de resposta HTTP.
Fazê-lo funciona bem quando se usa nginx e proxy_set_header Host $upstream_addr;
O que eu preciso para chegar na máquina de destino: 1234 é: Host: target-machine:1234
em vez de Host: balancer:1234
Versão longa
Temos uma instalação do cliente onde apenas 32bit JVMs podem ser executadas, portanto estamos gerando n instâncias do mesmo aplicativo em n portas diferentes:
target-machine:8766
target-machine:8767
target-machine:8768
target-machine:8769
E temos um balanceador em execução em uma máquina balancer
dedicada.
Os clientes têm para serem balanceados com base em IP (um problema legado do software que usamos).
Agora chegamos à parte feia: o aplicativo que pretendemos usar depende do campo de cabeçalho HTTP Host
, pois algumas operações fazem com que ele envie uma solicitação interna.
Em nossa configuração atual, essa solicitação interna vai para o balanceador de carga, que, por sua vez, a envia para uma das máquinas de destino, mas necessariamente para a máquina de destino da qual se originou.
Eu usei nginx com o Módulo Upstream antes (mas não podemos mais, já que outro deve para este software é que os Posts HTTP não devem ser armazenados em cache pelo proxy, pois seu medidor de progresso de upload depende disso ( suspiro ... )) e poderia resolver esse problema adicionando: proxy_set_header Host $upstream_addr;
, ainda nginx não suporta upload de streaming.
Eu descobri o http-send-name-header Host
, que provavelmente faz exatamente o que eu preciso fazer (veja meu haproxy.cfg aqui) mas leva a outro problema que desaparece imediatamente quando eu mudo a linha para http-send-name-header $AnythingButHost
A diretiva adiciona o nome do servidor correto ao cabeçalho, mas ele parece mexer com as solicitações enviadas por proxy, já que o jetty fecha os fluxos prematuramente e lança org.mortbay.jetty.EofException
e também.
O que eu preciso é de um cabeçalho de host como:
Host: target-machine:8766
em vez de
Host: balancer:8181
Para o navegador, esse problema ilustra como na seguinte Screenshot (o tamanho do conteúdo enviado difere de quase completo para apenas um alguns KB).
Funciona imediatamente quando não altero o cabeçalho do host, mas funciona se eu alterar o cabeçalho do host para o mesmo valor exato, mas usar nginx.
Isso realmente me deixa perplexo.
Se eu puder ajudar você com mais alguma informação, me avise.