URL HAProxy reescreve no erro 404

9

Como fazer o HAProxy reescrever para um back-end diferente quando o primeiro está faltando o arquivo? O que eu preciso é de errorloc , mas fazer uma reescrita em vez de redirecionar, então o cliente não está ciente do redirecionamento.

Desenvolvemos um aplicativo com o NginX em mente, que era tanto o proxy reverso de balanceamento de carga quanto o servidor da Web para arquivos estáticos. O aplicativo é baseado no framework Opa que requer sessões fixas baseadas em cookies - suportadas tanto pelo NginX quanto pelo HAproxy. O recurso do aplicativo com o qual temos problemas é a geração dinâmica de conteúdo. Ele gera imagens sob demanda, mas após a geração ele é salvo em disco e pode ser acessado estaticamente com o caminho determinístico.

O problema foi facilmente resolvido com o NginX - ele tenta ler o arquivo local e usar o backend de carga balanceada apenas se o arquivo estiver faltando (ainda não foi gerado):

server {
  server_name wkaliszu.pl;
  location /thumb {
    root /path_on_disk/to_cached_content;
    expires 7d;
    # try to access already generated content
    try_files $uri @wkaliszu;
  }
  location / {
    # reverse proxy to the application
    [...]
  }
  location @wkaliszu {
    # reverse proxy to the application
    [...]
  }
}

O servidor foi migrado e agora usa o HAPproxy para balanceamento de carga, que não é um servidor da Web e não suporta esse recurso. Agora, a geração dinâmica de software é realizada a cada vez que o cliente tenta acessar o recurso, o que é muito mais lento e desperdiça recursos. Seria bom se ele pudesse usar o próximo backend se o primeiro (servidor web de cache simples para arquivos estáticos) falhasse com o erro 404, mas não consegui encontrar uma maneira de fazer isso de maneira simples. Redirecionando /thumb para NginX, que tenta ler o arquivo estático e novamente reescreve para o HAproxy com novo cabeçalho HTTP, vem à minha mente, mas eu gostaria de encontrar algo melhor.

    
por Marcin Skórzewski 02.02.2015 / 10:04

1 resposta

1

Os backends do HAProxy estão acima ou abaixo (ou a caminho de serem up / down).

Existem várias maneiras de verificar a integridade de um back-end, mas não conheço nenhuma que forneça rastreamento baseado em solicitação. Quando uma solicitação falha, esse backend seria marcado como inativo ou estaria falhando (a caminho de ser considerado inativo).

Essa é uma lógica muito diferente da configuração do Nginx que estava roteando solicitações por solicitação.

Eu vejo algumas opções aqui:

  • Nginx como proxy de cache
  • Use servidores de aplicativos para conteúdo estático
  • Use um CDN

Caching Proxy

No HAProxy, você usaria as ACLs para rotear solicitações de conteúdo estático para um back-end específico. Esses nós de back-end executariam o nginx com um proxy de armazenamento em cache. Se o nginx tivesse o arquivo armazenado em cache, ele apenas o serviria. Se não, ele chamaria seu back-end.

Use servidores de aplicativos para conteúdo estático

Se seus servidores de aplicativos forem eficientes na exibição de conteúdo estático, talvez você não precise dividir a solicitação em haproxy. Basta enviar todos os pedidos para os back-ends da sua aplicação. Crie lógica neles para fornecer conteúdo estático, se disponível, e se não enviar a solicitação ao back-end.

Opção CDN

Se você puder usar um domínio dedicado para o conteúdo estático, poderá usar um CDN. No CDN, você apenas aponta para o URL de origem para seus nós de aplicativo. Você pode então controlar o armazenamento em cache no nível CDN. Isso é semelhante ao armazenamento em cache do Nginx acima, exceto pelo fato de o provedor de CDN estar lidando com isso para você.

    
por 10.09.2015 / 23:14

Tags