Tengo un servidor haproxy con varios servidores detrás. Los backends se seleccionan mediante round-robin; de todos modos lo necesito para probar otros backends, si obtiene 404 del seleccionado.
Si se devuelve 404 desde todos los servidores accesibles, haproxy debería devolver 404 al cliente.
¿Es eso posible?
Respuesta1
No, no es posible (por el momento).
HAProxy reintenta otro servidor backend cuando hay errores antes de que se enviara la solicitud, por ejemplo, tiempo de espera de conexión. Si la conexión se establece con un servidor backend y se envía una solicitud, aunque sea un byte, HAProxy no intentará utilizar otro servidor backend.
Respuesta2
No.
option redispatch
es lo más parecido que tiene HAProxy, pero solo reintentará un back-end diferente si retries
es> 0 y la conexión al respaldado falla. No le importa el código de estado HTTP del backend, solo le importa si retrocedió (no se puede localizar, no hay respuesta)
Respuesta3
Sí, si he entendido bien, con la opción.
option httpchk GET /../CheckHealth.html
http-check disable-on-404
Donde CheckHealth.html debería ser una muestra de recurso accesible, si no se encuentra el recurso y se recibe un error 404, el nodo se ha configurado en "activo o de respaldo DETENIDO SOFT para mantenimiento" y el roundrobin nunca volverá a enviar una solicitud a ese nodo cambiando a los demás solamente.
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
fallará en www02 porque no hay WAR implementado allí, y el saldo en www01, www03 no se mostrará ninguna falla al cliente.