Quero usar o HAProxy para balanceamento de carga e failover de um aplicativo Apache-PHP hospedado em muitos servidores back-end idênticos. Existe alguma maneira de detectar um nó com falha no HAproxy e removê-lo do grupo ativo de nós no contexto de uma única solicitação HTTP sem retornar um erro 5xx.
Idealmente, o servidor pode retornar um cabeçalho de resposta - "Status: Error" e o HAProxy deve detectar esse cabeçalho e remover aquele nó específico do conjunto ativo.
Não consigo retornar o erro 5xx do meu aplicativo.
Essa configuração é possível para o HAProxy?
Responder1
Uma resposta 5xx ainda é uma resposta, portanto, por padrão, ela seria passada para o cliente.
Não vi um produto que chegasse ao nível que você mencionou fora da caixa. Se não existir, você precisará de um balanceador de carga que permita escrever uma regra de pós-resposta personalizada e que essa regra tenha acesso para modificar o estado do nó inválido no pool e alimentar a solicitação de volta ao seu pool.F5 BigIPs,Arraia do leito do rio (Zues)certamente oferecem o elemento de script e gerenciamento de nós (f5 por exemplo, na parte inferior).VernizeLulaembora os balanceadores de carga não puros também ofereçam a capacidade de modificar as respostas após a resposta do back-end. Não tenho certeza sobre o acesso deles ao gerenciamento de nós/pools. Observe que você também precisaria lidar com os tempos limite de solicitação da mesma maneira que as respostas 5xx.
A página que você usa para monitorar o status de um nó também precisa ser algo que teste minuciosamente o status dos aplicativos e pode ser acessada com bastante frequência
O mais próximo que o HAProxy parece chegar disso éobserve <mode>
o que lhe permite reagir a erros que ocorrem no tráfego normal.
Não consigo retornar o erro 5xx do meu aplicativo.
Em algum momento isso vai acontecer, cuide disso.
Responder2
Eu concordo com a maioria dos comentários do mindthemonkey. Observe que você também pode bloquear a resposta e substituí-la por um conteúdo personalizado (usando o erro 502), mas isso é um pouco limitado (por exemplo: pode ser usado para enviar um redirecionamento para fazer o navegador postar a solicitação novamente) e bastante sujo.
Por que você quer fazer isso em primeiro lugar? Dizer que você "não pode retornar 5xx" está errado, pois você o fará de qualquer maneira e os clientes também terão que lidar com isso por definição e pelas especificações. Isso ocorre porque você está atrás de um CDN que se comporta mal ao retornar 5xx? Nesse caso, talvez você queira apenas reescrever os códigos de erro de saída (mas tenha muito cuidado com os códigos que você usa, todos eles têm uma semântica muito específica).
Responder3
Praveen, se você estiver usando pelo menos PHP 5.4, isso deve ajudar seu aplicativo PHP:
Se você estiver usando PGP 4.3 a 5.3, você pode usar header() (verifique as páginas de manual para uso).
Tecnicamente, você pode configurar o HAProxy para fazer o que você pede, mas provavelmente é mais apropriado simplesmente modificar seu aplicativo para se comportar corretamente. Nesse ponto, o HA Proxy deve lidar com isso mais ou menos automaticamente.