7 votes

haproxy httpchk vérification multiple sur le backend

Est-il possible de vérifier deux conditions sur un seul backend ? exemple

backend web-static
        option httpchk GET /path/alive.php HTTP/1.1\r\nHost:\ www1.domain.com
        option httpchk GET /path2/alive.php HTTP/1.1\r\nHost:\ www1.domain.com
        server appsrv1 192.168.1.10:80 check inter 3000 weight 1

8voto

Jeff Saxe Points 71

Ah, j'ai eu la même question ! Nos développeurs ont produit un service Web multifonctionnel à partir d'un seul nom d'URL, parce que nous devons prendre en charge les navigateurs non conformes à la norme CORS (IE 8 et 9). Un nom DNS menant à une adresse VIP comporte plusieurs sous-répertoires, chacun correspondant à une application différente. Notre équilibreur de charge doit donc vérifier l'état de santé de chacun des services, puis le traiter comme un grand test "ET", c'est-à-dire que si même un des services ne passe pas le contrôle, alors nous devons retirer ce serveur de la ferme jusqu'à ce que todo d'entre eux passent.

Nous sommes en train de passer des équilibreurs de charge Cisco ACE, et sur cette plate-forme, il suffit de définir plusieurs configurations de "sondes", puis d'appeler plusieurs sondes au sein d'une même batterie de serveurs, une ligne après l'autre, et toutes les sondes sont exécutées. Comme vous l'avez probablement découvert, HAProxy ne vous permet pas de définir plus d'une "option httpchk"... ou du moins il les ignore toutes sauf une, ce qui ne vous permet pas d'obtenir les tests que vous recherchez. Mais j'ai trouvé dans le manuel que je pouvais le faire en n'utilisant pas httpchk, en substituant une série de lignes "connect, send, check" sous "option tcp-check". Cela fonctionne parfaitement.

option tcp-check
tcp-check connect
tcp-check send GET\ /FirstApplication/check.aspx?healthcheck\ HTTP/1.0\r\n\r\n
tcp-check expect string Healthy
tcp-check connect
tcp-check send GET\ /SecondApplication/check.aspx\ HTTP/1.0\r\n\r\n
tcp-check expect string YesThisIsGood
tcp-check connect
tcp-check send GET\ /ThirdApp/Check.aspx\ HTTP/1.0\r\n\r\n
tcp-check expect string ExpectedCheckResult
tcp-check connect
tcp-check send GET\ /NumberFourApp/check.aspx\ HTTP/1.0\r\n\r\n
tcp-check expect string YesItIsWorking

Notez que vous devez rétrograder chaque espace dans la chaîne que vous envoyez. J'utilise HTTP/1.0 dans la requête, qui par défaut ne fait pas de keepalive, donc je me reconnecte dans chaque série de lignes. Je suppose que je pourrais aussi utiliser HTTP/1.1, mais je devrais alors transmettre un en-tête Host, donc je pense que c'est plus facile de cette façon. En exécutant ces quatre vérifications d'affilée, cela ne prend toujours que 60 ms, donc je suis satisfait. Notez également que je n'utilise que "expect string", mais qu'il existe également un "expect rstring" pour la recherche par expression régulière dans le contenu du résultat renvoyé par le serveur.

2voto

sayap Points 747

Il serait probablement plus facile de faire un PHP "enveloppant" : il vérifie les autres fichiers, et si tout est correct, il retourne avec le code HTTP 200, sinon, 404.

Si je me souviens bien, ça a marché pour nous aussi quand nous voulions vérifier la fonctionnalité.

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