Balanceamento de carga com o host haproxy e http-send-name-header

2

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.

    
por michael 31.10.2012 / 09:57

1 resposta

2

Este é um bug no HAProxy, que foi corrigido em 1.4.23. Consulte o log de alterações e pesquise http-send-name-header para ver a correção. Não consegui descobrir a página da web para o bug, mas há discussão adicional em uma lista de discussão .

Existe também um patch para 1.4 .

    
por 12.05.2014 / 19:30