HAProxy: detección de errores del servidor HTTP

HAProxy: detección de errores del servidor HTTP

Quiero usar HAProxy para el equilibrio de carga y la conmutación por error de una aplicación Apache-PHP alojada en muchos servidores backend idénticos. ¿Hay alguna forma de detectar un nodo fallido en HAproxy y eliminarlo del grupo activo de nodos en el contexto de una única solicitud HTTP sin devolver un error 5xx?

Idealmente, el servidor puede devolver un encabezado de respuesta: "Estado: Error" y HAProxy debería detectar este encabezado y eliminar ese nodo en particular del conjunto activo.

No puedo devolver el error 5xx desde mi aplicación.

¿Es posible tal configuración para HAProxy?

Respuesta1

Una respuesta 5xx sigue siendo una respuesta, por lo que, de forma predeterminada, se pasará al cliente.

No he visto un producto que llegue al nivel que mencionas desde el primer momento. Si no existe ninguno, necesita un equilibrador de carga que le permita escribir una regla de respuesta posterior personalizada y que esa regla tenga acceso para modificar el estado del nodo defectuoso en el grupo y devolver la solicitud a su grupo.F5 BigIP,Raya del lecho del río (Zues)ciertamente ofrece el elemento de secuencias de comandos y gestión de nodos (f5, por ejemplo, hacia abajo).BarnizyCalamarAunque los balanceadores de carga no son puros, también ofrecen la capacidad de modificar las respuestas posteriores a la respuesta del backend. Sin embargo, no estoy seguro de su acceso a la administración del nodo/grupo. Tenga en cuenta que también deberá tratar los tiempos de espera de las solicitudes de la misma manera que las respuestas 5xx.

La página que utilice para monitorear el estado de los nodos también necesitaría ser algo que pruebe exhaustivamente el estado de las aplicaciones y pueda accederse con bastante frecuencia.

Lo más cercano que HAProxy parece llegar a esto esobserve <mode>lo que le permite reaccionar ante errores que ocurren en el tráfico regular.

No puedo devolver el error 5xx desde mi aplicación.

En algún momento va a suceder, atiendelo.

Respuesta2

Estoy de acuerdo con la mayoría de los comentarios de mindthemonkey. Tenga en cuenta que también puede bloquear la respuesta y reemplazarla con un contenido personalizado (usando el error 502), pero esto es un poco limitado (por ejemplo: podría usarse para enviar una redirección para que el navegador publique la solicitud nuevamente) y bastante sucia.

¿Por qué quieres hacer esto en primer lugar? Decir que "no puede devolver 5xx" es incorrecto, ya que lo hará de todos modos y los clientes también tienen que lidiar con esto por definición y especificación. ¿Esto se debe a que estás detrás de una CDN que se comporta mal al devolver 5xx? Si es así, tal vez simplemente desee reescribir los códigos de error de salida (pero tenga mucho cuidado con los códigos que utiliza, todos tienen una semántica muy específica).

Respuesta3

Praveen, si estás usando al menos PHP 5.4, esto debería ayudar a tu aplicación PHP:

Si está utilizando PGP 4.3 a 5.3, puede usar header() en su lugar (consulte las páginas de manual para conocer su uso).

Técnicamente puedes configurar HAProxy para que haga lo que le pidas, pero probablemente sea más apropiado simplemente modificar tu aplicación para que se comporte correctamente. En ese punto, HA Proxy debería manejarlo más o menos automáticamente.

información relacionada