2 votes

HAProxy - Détection des erreurs du serveur HTTP

Je souhaite utiliser HAProxy pour l'équilibrage de charge et le basculement d'une application Apache-PHP hébergée sur plusieurs serveurs dorsaux identiques. Existe-t-il un moyen de détecter un nœud défaillant sur HAproxy et de le retirer du groupe actif de nœuds dans le contexte d'une seule requête HTTP sans renvoyer une erreur 5xx ?

Idéalement, le serveur peut renvoyer un en-tête de réponse - "Status : Error" et HAProxy devrait détecter cet en-tête et supprimer ce nœud particulier de l'ensemble actif.

Je ne peux pas renvoyer l'erreur 5xx à partir de mon application.

Une telle configuration est-elle possible pour HAProxy ?

2voto

JeffSahol Points 541

Une réponse 5xx reste une réponse, elle est donc transmise par défaut au client.

Je n'ai pas vu de produit qui atteigne le niveau que vous mentionnez en sortant de la boîte. S'il n'en existe pas, vous avez besoin d'un équilibreur de charge qui vous permette d'écrire une règle de réponse personnalisée, et que cette règle ait accès à la modification de l'état du mauvais nœud dans le pool et renvoie la requête dans votre pool. F5 BigIP's , Riverbed StingRay (Zues) offrent certainement l'élément de script et la gestion des nœuds ( f5 par exemple, en bas de l'échelle ). Vernis y Calamar Bien qu'ils ne soient pas de purs équilibreurs de charge, ils offrent également la possibilité de modifier les réponses après la réponse du backend. Je ne suis pas sûr de leur accès à la gestion des nœuds/pools. Notez que vous devrez également gérer les délais d'attente des requêtes de la même manière que les réponses 5xx.

La page que vous utilisez pour surveiller l'état d'un nœud doit également être quelque chose qui teste en profondeur l'état des applications et qui peut être consulté assez fréquemment.

La solution la plus proche de HAProxy est la suivante observe <mode> ce qui lui permet de réagir aux erreurs qui se produisent dans le trafic régulier.

Je ne peux pas renvoyer l'erreur 5xx à partir de mon application.

A un moment donné, ça va arriver, préparez-vous.

2voto

Willy Tarreau Points 3934

Je suis d'accord avec la plupart des commentaires de mindthemonkey. Notez que vous pouvez également bloquer la réponse et la faire remplacer par un contenu personnalisé (en utilisant l'erreur 502), mais c'est un peu limité (par exemple, cela pourrait être utilisé pour envoyer une redirection pour que le navigateur renvoie la requête) et assez sale.

Pourquoi voulez-vous faire ça en premier lieu ? Dire que vous "ne pouvez pas renvoyer 5xx" est faux puisque vous le ferez de toute façon et que les clients doivent aussi gérer cela par définition et par les spécifications. Est-ce parce que vous êtes derrière un CDN qui se comporte mal lorsqu'il renvoie 5xx ? Si c'est le cas, vous pourriez simplement réécrire les codes d'erreur de sortie (mais faites très attention aux codes que vous utilisez, ils ont tous une sémantique très spécifique).

1voto

Unix-Ninja Points 246

Praveen, si vous utilisez au moins PHP 5.4, cela devrait aider votre application PHP :

Si vous utilisez PGP 4.3 à 5.3, vous pouvez utiliser header() à la place (consultez les pages de manuel pour l'utilisation).

Techniquement, vous pouvez configurer HAProxy pour qu'il fasse ce que vous demandez, mais il est probablement plus approprié de modifier simplement votre application pour qu'elle se comporte correctement. À ce stade, HA Proxy devrait s'en charger plus ou moins automatiquement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X