Des erreurs HTTP 502 s'affichent lorsque j'effectue des demandes via un Classic Load Balancer. Comment résoudre ces erreurs ?

Dernière mise à jour : 08/04/2022

Je vois des erreurs HTTP 502 lorsque mon client envoie des requêtes à un site Web via un Classic Load Balancer (CLB). Comment résoudre ce problème ?

Brève description

Des erreurs HTTP 502 (erreur de passerelle) peuvent se produire pour l'une des raisons suivantes :

  • Le serveur Web ou les serveurs d'applications backend associés exécutés sur des instances EC2 renvoient un message qui ne peut pas être analysé par votre Classic Load Balancer.
  • Le serveur Web ou les serveurs d'applications backend associés renvoient un message d'erreur 502 propre.

Pour trouver la source de ces erreurs 502 :

Si la réponse du backend est la source de l'erreur ELB 502, le problème peut être causé par :

  • Une réponse contenant plus d'un CRLF entre chaque en-tête.
  • Une réponse contenant un en-tête Content-Length qui contient un nombre non entier.
  • Une réponse dont le corps contient plus d'octets que la valeur d'en-tête Content-Length.

Si l'erreur 502 est générée par vos serveurs backend, contactez le propriétaire de votre application. Si l'erreur 502 est générée par le Classic Load Balancer, la réponse HTTP du serveur backend est incorrecte. Procédez comme suit pour résoudre les erreurs 502 générées par ELB :

Solution

1.    Vérifiez si le corps de réponse renvoyé par l'application backend est conforme aux spécifications HTTP détaillées dans les RFC suivantes :
RFC 7230 – HTTP/1.1 : Message Syntax and Routing
RFC 7231 – HTTP/1.1 : Semantics and Content
RFC 7232 – HTTP/1.1 : Conditional Requests
RFC 7233 – HTTP/1.1 : Range Requests
RFC 7234 – HTTP/1.1 : Caching
RFC 7235 – HTTP/1.1 : Authentication

2.    Confirmez que l'en-tête de réponse possède la syntaxe correcte : une clé et une valeur, telle que Content-Type:text. Assurez-vous que l'encodage Content-Length ou Transfer n'est pas absent dans l'en-tête de réponse HTTP. Pour plus d'informations sur les champs d'en-tête HTTP de serveur web, consultez la Liste de champs d'en-tête HTTP. Examinez les réponses HTTP renvoyées en exécutant une commande similaire à la suivante :

curl -vko /dev/null server_instance_IP

3.    Vérifiez que le journal d'accès ELB ne contient pas d'erreurs HTTP 502 en double. Des Erreurs 502 pour elb_status_code et backend_status_code indiquent un problème avec une ou plusieurs instances du serveur Web. Identifiez les instances de serveur Web qui présentent le problème, puis vérifiez les journaux du serveur Web des instances du serveur Web backend. Consultez les emplacements des journaux suivants pour certains serveurs Web et systèmes d'exploitation courants :

Journaux Apache

  • Les journaux de serveur web de CentOS, RHEL, Fedora et Amazon Linux se trouvent dans le répertoire /var/log/httpd/.
  • Les journaux de serveur web de Debian et Ubuntu Linux se trouvent dans le répertoire /var/log/apache2 and /var/log/lighthttpd/.

Journaux NGINX

  • L'emplacement du journal d'accès NGINX est défini dans le fichier nginx.conf : access_log/path/to/access.log
  • L'emplacement par défaut est /var/log/nginx/access.log

Journaux IIS

Les journaux de serveur web de Windows IIS 7, IIS 7.5 et IIS 8.0 sont stockés dans le répertoire inetpub\logs\Logfiles. Pour plus d'informations sur les journaux Internet Information Server (IIS), consultez Le code d'état HTTP dans IIS 7.0 et les versions ultérieures. Si vous avez confirmé que vos erreurs 502 sont générées par ELB et que la réponse de votre serveur backend est conforme aux conventions RFC, contactez le support AWS.