Configure o HAProxy para incluir cabeçalhos de host para diferentes back-ends

3

Estou explorando o uso do HAProxy como um balanceador na frente de um conjunto de web apis que são executados no IIS.

  • node1.myapp.mycompany.com
  • node2.myapp.mycomapny.com

No momento, estamos usando os Cabeçalhos do Host para resolver corretamente o aplicativo da Web correto no IIS. Por exemplo, podemos ter otherapp.mycompany.com em execução no mesmo servidor / porta, mas usando o Host Headers, o IIS sabe qual deles servir.

Minha tentativa inicial no HAProxy me deixou com erros 404, porque eu não estava incluindo os cabeçalhos de host em minha solicitação e, portanto, o IIS estava exibindo o site padrão vinculado ao IP fornecido e não resolvendo pelo nome do host.

A correção me deixou com algo assim:

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80

Isso funciona muito bem para um único back-end, mas fico pensando em como incluir os cabeçalhos de host corretos, dependendo de qual back-end está atendendo a solicitação:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    reqirep ^Host: Host:\ node1.myapp.mycompany.com
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

O acima não funciona sempre que node2 é usado porque não resolve corretamente no IIS (o nó2, neste caso, está em um servidor diferente e, portanto, em um IP diferente. Na verdade, se estivessem em execução no mesmo servidor / ip Eu suspeito que o trabalho de solicitação "trabalho", mas todos eles seriam servidos pelo node1 pelo cabeçalho do host).

  • É possível definir o host com base na URL do back-end usada para atender à solicitação?
  • Nesse caso, isso implica que meu check s também precisa fornecer o cabeçalho de host correto com base no back-end, como isso seria feito?

Editar: Estou usando o HA-Proxy versão 1.7.9 2017/08/18

Deixe-me dar um pouco mais de fundo. Costumávamos ter apenas myapp.mycompany.com servindo solicitações de API. Precisamos expandi-lo. Nossos clientes ainda chamarão myapp.mycompany.com , mas isso apenas apontará para o HAProxy, que equilibrará isso para node1.myapp.mycompany.com e node2.myapp.mycompany.com . Nossas configurações atuais de servidor nos obrigam a vincular um único endereço IP em cada servidor, portanto, usamos cabeçalhos de host para resolver.

    
por Matt 04.10.2017 / 17:26

1 resposta

3

Não tenho certeza se o seguinte irá funcionar e não posso testar agora, mas talvez isso ainda seja útil. (Eu vou dar uma olhada novamente mais tarde com mais algum tempo):

Solução 1 (as pessoas informaram que este não funciona, portanto, tente a segunda solução primeiro):

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request set-header Host node1.myapp.mycompany.com if { srv_id 1 }
    http-request set-header Host node2.myapp.mycompany.com if { srv_id 2 }
    server web01 node1.myapp.mycompany.com:80
    server web02 node2.myapp.mycompany.com:80

Solução 2:

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-send-name-header Host
    server node1.myapp.mycompany.com node1.myapp.mycompany.com:80
    server node1.myapp.mycompany.com node2.myapp.mycompany.com:80
    
por 04.10.2017 / 18:08