Eu tenho um servidor haproxy com vários back-ends por trás dele. Os backends são escolhidos com round-robin; de qualquer forma, preciso tentar outros back-ends, se obtiver 404 do selecionado.
Se 404 for retornado de todos os backends acessíveis, o haproxy deverá retornar 404 ao cliente.
Isso é possível?
Responder1
Não, não é possível (por enquanto).
O HAProxy tenta novamente outro servidor back-end quando há erros antes do envio da solicitação, por exemplo, tempo limite de conexão. Se a conexão for estabelecida com um servidor backend e a solicitação for enviada, mesmo que seja um byte, o HAProxy não tentará usar outro servidor backend.
Responder2
Não.
option redispatch
é a coisa mais próxima que o HAProxy tem, mas ele só tentará novamente um back-end diferente se retries
for> 0 e a conexão com o backup falhar. Ele não se importa com o código de status HTTP do back-end, apenas se importa se o backup foi feito (não pode ser alcançado, sem resposta)
Responder3
Sim, se bem entendi, com a opção
option httpchk GET /../CheckHealth.html
http-check disable-on-404
Onde CheckHealth.html deve ser uma amostra de recurso acessível, se o recurso não for encontrado e um erro 404 recebido, o nó foi definido como "ativo ou backup SOFT STOPPED para manutenção" e o roundrobin nunca enviará solicitação novamente para esse nó mudando para os outros apenas.
Algo como :
backend backend_servers
balance roundrobin
option httpchk GET /.../CheckHealth.html
http-check disable-on-404
server www01 XX:YY:ZZ:KK:8180 check
server www02 XX:YY:ZZ:MM:8180 check
server www03 XX:YY:ZZ:FF:8180 check
falhará em www02 porque não há WAR implantado lá e equilibrará em www01, www03 sem falha mostrada ao cliente.