Como fazer o HAProxy reescrever para um back-end diferente quando o primeiro está faltando no arquivo? O que eu preciso é errorloc
apenas fazer uma reescrita em vez de redirecionar, para que o cliente não esteja ciente do redirecionamento.
Desenvolvemos um aplicativo com o NginX em mente, que era o proxy reverso do balanceamento de carga e o servidor da web para arquivos estáticos. O aplicativo é baseado na estrutura Opa , que requer sessões persistentes baseadas em cookies - suportadas pelo NginX e 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 é salvo em disco e pode ser acessado estaticamente com caminho determinístico.
O problema foi facilmente resolvido com o NginX - ele tenta ler o arquivo local e usar o back-end com balanceamento de carga somente se o arquivo estiver ausente (ainda não 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 é servidor da Web e não suporta esse recurso. Agora, a geração dinâmica de software é realizada sempre 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 back-end se o primeiro (servidor web de cache simples para arquivos estáticos) falhar com o erro 404, mas não consigo encontrar uma maneira de fazê-lo de maneira simples. Redirecionar /thumb
para o NginX, que tenta ler o arquivo estático e reescreve novamente no HAproxy com o novo cabeçalho HTTP, vem à minha mente, mas gostaria de encontrar algo melhor.
Respostas:
Os back-end do HAProxy estão ativos ou inativos (ou a caminho de ativos / inativos).
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 falhar, esse back-end será marcado como inativo ou falhará (a caminho de ser considerado inativo).
Essa é uma lógica muito diferente da configuração do Nginx, que estava encaminhando solicitações por solicitação.
Vejo algumas opções aqui:
Cache de Proxy
No HAProxy, você usaria 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 cache. Se o nginx tivesse o arquivo em cache, ele seria útil. Caso contrário, chamaria o seu back-end.
Use servidores de aplicativos para conteúdo estático
Se os servidores de aplicativos forem eficientes na veiculação de conteúdo estático, talvez você não precise dividir a solicitação em haproxy. Basta enviar todas as solicitações para os back-end do seu aplicativo. Crie lógica neles para veicular conteúdo estático, se disponível, e se não enviar a solicitação ao back-end.
Opção CDN
Se você pode usar um domínio dedicado para o conteúdo estático, poderá usar uma CDN. Na CDN, você apenas aponta a URL de origem para os nós do aplicativo. Você pode controlar o cache no nível da CDN. Isso é semelhante ao armazenamento em cache do Nginx acima, exceto pelo provedor da CDN.
fonte