42 votes

AWS ELB Apache2 503 Service Unavailable: Le serveur en aval est à pleine capacité

Nous gérons quelques sites Web depuis l'infrastructure AWS d'Amazon depuis environ deux ans et il y a environ deux jours, le serveur web a commencé à tomber en panne une ou deux fois par jour avec la seule erreur que je puisse trouver :

HTTP/1.1 503 Service Unavailable: Le serveur en arrière-plan est à pleine capacité

Aucune alarme (CPU/Disk IO/DB Conn) n'est déclenchée par CloudWatch. J'ai essayé d'accéder au site via l'IP élastique pour contourner l'ELB et j'ai obtenu ceci :

Requête HTTP envoyée, en attente de réponse... Erreur de lecture (Connexion réinitialisée par le pair) dans les en-têtes. Nouvel essai.

Je ne vois rien d'anormal dans les journaux Apache et j'ai vérifié qu'ils étaient correctement rotés. Je n'ai aucun problème pour accéder à la machine quand elle est "en panne" via SSH et en regardant la liste des processus, je vois 151 processus apache2 qui me semblent normaux. Redémarrer Apache résout temporairement le problème. Cette machine fonctionne uniquement comme serveur web derrière un ELB. Toute suggestion serait grandement appréciée.

Utilisation du CPU Moyenne : 7,45 %, Minimum : 0,00 %, Maximum : 25,82 %

Utilisation de la mémoire Moyenne : 11,04 %, Minimum : 8,76 %, Maximum : 13,84 %

Utilisation du Swap Moyenne : N/A, Minimum : N/A, Maximum : N/A

Utilisation de l'espace disque pour /dev/xvda1 monté sur / Moyenne : 62,18 %, Minimum : 53,39 %, Maximum : 65,49 %

Laissez-moi clarifier que je pense que le problème réside dans l'instance EC2 individuelle et non dans l'ELB, mais je ne voulais pas exclure cette possibilité même si je n'ai pas pu joindre l'IP élastique. Je soupçonne que l'ELB renvoie simplement les résultats de l'instance EC2 réelle.

Mise à jour : 2014-08-26 Je devrais avoir fait cette mise à jour plus tôt, mais le "correctif" a été de prendre un instantané de l'instance "défaillante" et de démarrer l'AMI résultant. Elle n'est plus tombée en panne depuis. J'ai examiné le contrôle de l'état lorsque j'avais encore des problèmes et je pouvais accéder à la page de contrôle de l'état (curl http://localhost/page.html) même lorsque j'avais des problèmes de capacité provenant du répartiteur de charge. Je ne suis pas convaincu que cela était dû à un problème de contrôle de l'état, mais comme personne, y compris Amazon, ne peut fournir de meilleure réponse, je le marque comme tel. Merci.

Mise à jour : 2015-05-06 Je voulais revenir ici et dire que je crois fermement qu'une partie du problème était les paramètres du contrôle de l'état. Je ne veux pas exclure la possibilité qu'il y ait un problème avec l'AMI car les choses se sont définitivement améliorées après le lancement de l'AMI de remplacement, mais j'ai découvert que nos contrôles de santé étaient différents pour chaque répartiteur de charge et que celui qui posait le plus de problèmes avait un seuil de non-fonctionnement agressif et un délai de réponse. Notre trafic a tendance à augmenter de manière imprévisible et je pense qu'entre les paramètres de contrôle de santé agressifs et les pics de trafic, c'était la tempête parfaite. En diagnostiquant le problème, je me suis concentré sur le fait que je pouvais atteindre le point de contrôle de l'état à ce moment-là, mais il est possible que le contrôle de l'état ait échoué en raison de la latence et ensuite nous avions un seuil de santé élevé (pour cet ELB particulier), donc il fallait un certain temps pour que l'instance soit de nouveau considérée comme saine.

44voto

cgenco Points 101

Vous obtiendrez un "Le serveur back-end est à pleine capacité" lorsque le répartiteur de charge ELB effectue ses vérifications d'état de santé et reçoit une "page non trouvée" (ou une autre erreur simple) en raison d'une mauvaise configuration (généralement avec virtualhost NameVirtual).

Essayez de rechercher le dossier des fichiers journaux en utilisant l'agent utilisateur "ELB-HealthChecker". par exemple

grep ELB-HealthChecker  /var/log/httpd/*

Cela vous donnera généralement une erreur 4x ou 5x qui est facilement corrigée. par exemple. Le flood, MaxClients, etc. donnent au problème beaucoup trop de crédit.

Pour information Amazon: Pourquoi ne pas afficher la réponse renvoyée par la demande? Même un code d'état aiderait.

18voto

Dominic O'Connor Points 300

Je viens de rencontrer ce problème moi-même. Le ELB Amazon renverra cette erreur s'il n'y a pas d'instances en santé. Nos sites étaient mal configurés, donc la vérification de la santé ELB échouait, ce qui a causé le ELB à retirer les deux serveurs de rotation. Avec aucun site en santé, le ELB a renvoyé une erreur 503 Service Unavailable: Le serveur en arrière-plan est à pleine capacité.

6voto

ErikE Points 4616

[EDIT après avoir mieux compris la question] N'ayant aucune expérience de l'ELB, je pense quand même que cela ressemble étrangement à l'erreur 503 qui peut être déclenchée lorsque Apache est devant un Tomcat et inonde la connexion.

L'effet est que si Apache envoie plus de requêtes de connexion que ce que le backend peut traiter, les files d'attente d'entrée du backend se remplissent jusqu'à ce que plus aucune connexion ne puisse être acceptée. Lorsque cela se produit, les files de sortie correspondantes d'Apache commencent à se remplir. Lorsque les files sont pleines, Apache déclenche une erreur 503. Il est logique que la même chose puisse se produire lorsque Apache est le backend, et que le frontend envoie à un rythme tel que les files se remplissent.

La solution (hypothétique) consiste à dimensionner les connecteurs d'entrée du backend et les connecteurs de sortie du frontend. Cela devient un jeu d'équilibre entre le niveau d'inondation anticipé et la RAM disponible des ordinateurs impliqués.

Donc, lorsque cela se produit, vérifiez vos paramètres maxclients et surveillez vos workers occupés dans Apache (mod_status). Faites de même si possible avec tout ce que ELB a qui correspond à la file d'attente du connecteur Tomcat, maxthreads, etc. En bref, examinez tout ce qui concerne les files d'attente d'entrée d'Apache et les files d'attente de sortie d'ELB.

Bien que je comprenne parfaitement qu'il ne soit pas directement applicable, ce lien contient un guide de dimensionnement pour le connecteur Apache. Vous devriez rechercher les particularités de file d'attente correspondantes à ELB, puis faire les calculs : http://www.cubrid.org/blog/dev-platform/maxclients-in-apache-and-its-effect-on-tomcat-during-full-gc/

Comme observé dans les commentaires ci-dessous, pour submerger le connecteur Apache, un pic de trafic n'est pas la seule possibilité. Si certaines requêtes sont servies plus lentement que d'autres, un ratio plus élevé de celles-ci peut également entraîner le remplissage des files d'attente du connecteur. C'était vrai dans mon cas.

De plus, lorsque cela m'est arrivé, j'étais perplexe de devoir redémarrer le service Apache pour ne plus recevoir de 503 : de nouveau. Attendre simplement que l'inondation du connecteur se termine n'était pas suffisant. Je n'ai jamais compris cela, mais on peut spéculer qu'Apache servait peut-être à partir de son cache?

Après avoir augmenté le nombre de workers et les paramètres de pre-fork maxclients correspondants (il s'agissait d'Apache multithreadé sur Windows qui a quelques autres directives pour les files d'attente si je me souviens bien), le problème 503 a disparu. Je n'ai en fait pas fait les calculs, mais j'ai simplement ajusté les valeurs jusqu'à ce que je puisse observer une marge confortable par rapport à la consommation maximale des ressources de la file d'attente. Je m'en suis arrêté là.

J'espère que cela vous a été utile.

4voto

nandoP Points 1961

Vous pouvez augmenter les valeurs du vérificateur d'état de l'ELB, de sorte qu'une seule réponse lente ne retirera pas un serveur de l'ELB. Il vaut mieux que quelques utilisateurs reçoivent un service indisponible que que le site soit en panne pour tout le monde.

MODIFICATION : Nous pouvons nous en sortir sans préchauffer le cache en augmentant le délai d'attente du contrôle d'état à 25 secondes......après 1-2 minutes... le site est aussi réactif que possible

MODIFICATION : il suffit de lancer une série de demandes ponctuelles, et lorsque vos outils de surveillance montrent à la direction à quel point vous êtes rapide, alors prépayez simplement l'Amazon RI :P

MODIFICATION : il est possible qu'une seule instance enregistrée de l'ELB en amont ne soit pas suffisante. il suffit de lancer quelques autres, et de les enregistrer avec l'ELB, cela vous aidera à cerner votre problème

0voto

Ben Randall Points 101

Cela fait quelques années de retard, mais j'espère que cela aidera quelqu'un.

Je voyais cette erreur lorsque l'instance derrière l'ELB n'avait pas de véritable adresse IP publique. J'ai dû créer manuellement une adresse IP élastique et l'associer à l'instance, après quoi l'ELB l'a presque instantanément pris en charge.

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