Ich habe einen Haproxy-Server mit mehreren Backends dahinter. Die Auswahl der Backends erfolgt per Round-Robin-Verfahren. Wenn das ausgewählte Backend eine 404-Fehlermeldung liefert, muss es trotzdem andere Backends ausprobieren.
Wenn von allen erreichbaren Backends 404 zurückgegeben wird, sollte haproxy 404 an den Client zurückgeben.
Ist das möglich?
Antwort1
Nein, das ist (derzeit) nicht möglich.
HAProxy versucht es erneut mit einem anderen Backend-Server, wenn vor dem Senden der Anfrage Fehler aufgetreten sind, z. B. ein Verbindungstimeout. Wenn die Verbindung mit einem Backend-Server hergestellt ist und eine Anfrage gesendet wird, auch wenn es sich nur um ein Byte handelt, versucht HAProxy nicht, einen anderen Backend-Server zu verwenden.
Antwort2
Nein.
option redispatch
ist das Nächstliegende, was HAProxy hat, aber es wird nur dann einen erneuten Versuch mit einem anderen Backend unternehmen, wenn retries
> 0 ist und die Verbindung zum Backend fehlschlägt. Der HTTP-Statuscode vom Backend ist dabei egal, es ist nur wichtig, ob das Backend ausgefallen ist (nicht erreichbar, keine Antwort).
Antwort3
Ja, wenn ich das richtig verstanden habe, mit der Option
option httpchk GET /../CheckHealth.html
http-check disable-on-404
Wobei CheckHealth.html ein erreichbares Ressourcenbeispiel sein sollte. Wenn die Ressource nicht gefunden wird und ein 404-Fehler auftritt, wurde der Knoten auf „Aktiv oder Backup SOFT STOPPED für Wartungsarbeiten“ gesetzt und das Roundrobin sendet nie wieder eine Anfrage an diesen Knoten, sondern wechselt nur zu den anderen.
Etwas wie :
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
wird auf www02 fehlschlagen, weil dort kein WAR bereitgestellt ist, und der Rest auf www01, www03, ohne dass dem Client ein Fehler angezeigt wird.