502 Bad Gateway – TooBigHeaders

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Problème constaté

En réponse aux appels d'API, l'application cliente reçoit un code d'état HTTP 502 Bad Gateway avec le code d'erreur protocol.http.TooBigHeaders .

Message d'erreur

L'application cliente reçoit le code de réponse suivant:

HTTP/1.1 502 Bad Gateway

De plus, le message d'erreur suivant peut s'afficher:

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

Causes possibles

Cette erreur se produit si la taille totale des en-têtes envoyés par le serveur cible/backend à Apigee Edge dans le cadre de la réponse HTTP est supérieure à la limite autorisée dans Apigee Edge.

Voici les causes possibles de cette erreur:

Cause Description Instructions de dépannage applicables
La taille des en-têtes dans la réponse est supérieure à la limite autorisée La taille d'un en-tête particulier ou la somme des tailles de tous les en-têtes envoyés par la cible/le serveur backend dans le cadre de la réponse HTTP à Apigee Edge dépasse la limite autorisée dans Apigee Edge. Utilisateurs Edge Public and Private Cloud

Étapes de diagnostic courantes

Utilisez l'un des outils ou techniques suivants pour diagnostiquer cette erreur:

Surveillance des API

Pour diagnostiquer l'erreur à l'aide de la surveillance des API:

  1. Connectez-vous à l'interface utilisateur Apigee Edge en tant qu'utilisateur disposant du rôle approprié.
  2. Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.

  3. Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Enquêter).
  4. Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
  5. Vous pouvez sélectionner le filtre Proxy pour affiner le code d'erreur.
  6. Tracez le code d'erreur par rapport à l'heure.
  7. Sélectionnez une cellule avec le code d'erreur protocol.http.TooBigHeaders, comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  8. Vous verrez les informations sur le code d'erreur protocol.http.TooBigHeaders comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  9. Cliquez sur Afficher les journaux, puis développez la ligne de la requête ayant échoué.

    ( Afficher l'image plus grande)

  10. Dans la fenêtre Journaux, notez les détails suivants :
    • Code d'état:502
    • Source de l'erreur: target
    • Code d'erreur:protocol.http.TooBigHeaders.
  11. Si la source d'erreur a la valeur target et que le code d'erreur a la valeur protocol.http.TooBigHeaders, cela indique que la réponse HTTP de la cible ou du serveur backend comporte des en-têtes dont la taille est supérieure à la limite autorisée dans Apigee Edge.

Outil de traçage

  1. Activez la session de trace, puis effectuez l'une des opérations suivantes :
    1. Attendez que l'erreur 502 Bad Gateway se produise.
    2. Si vous pouvez reproduire le problème, effectuez l'appel d'API et reproduisez l'erreur 502 Bad Gateway.
  2. Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
  3. Parcourez les différentes phases de la trace et localisez l'origine de l'échec.
  4. Généralement, cette erreur s'affiche dans le flux nommé Error juste après la phase Request sent to target server (Requête envoyée au serveur cible), comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

    Notez les valeurs de l'erreur à partir de la trace:

    • erreur:response headers size exceeding 25,600
    • error.class: com.apigee.errors.http.server.BadGateway

    Cela indique qu'Apigee Edge (composant de processeur de messages) génère l'erreur dès qu'il reçoit la réponse du serveur backend en raison d'une taille d'en-tête dépassant la limite autorisée.

  5. Vous verriez l'échec dans la réponse d'erreur Response Sent to Client (Réponse envoyée au client) envoyée par Apigee Edge, comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  6. Notez les valeurs de l'erreur à partir de la trace. L'exemple de trace ci-dessus montre :
    • Erreur:502 Bad Gateway.
    • Contenu de l'erreur:{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. Accédez à la phase AX (Données analytiques enregistrées) dans la trace et cliquez dessus pour afficher les informations associées.

    ( Afficher l'image plus grande)

    Notez la valeur de ce qui suit:

    En-têtes d'erreur Valeur
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    Contenu de l'erreur: corps {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

NGINX

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX, procédez comme suit:

  1. Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés concernant HTTP 502 Bad Gateway.
  2. Vérifiez les journaux d'accès NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    :ORG, ENV et PORT# sont remplacés par des valeurs réelles.

  3. Recherchez s'il existe des erreurs 502 avec le code d'erreur protocol.http.TooBigHeaders pendant une durée spécifique (si le problème s'est produit par le passé) ou si des requêtes échouent toujours avec 502.
  4. Si vous trouvez des erreurs 502 avec le X-Apigee-fault-code correspondant à la valeur de X-Apigee-fault-code , déterminez la valeur de la source X-Apigee-fault-code .

    Exemple d'erreur 502 du journal d'accès NGINX:

    L'exemple d'entrée ci-dessus du journal d'accès NGINX contient les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-code :

    En-têtes d'erreur Valeur
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

Cause: la taille des en-têtes dans la réponse est supérieure à la limite autorisée

Diagnostic

  1. Déterminez le code d'erreur, la source de l'erreur et la taille de la charge utile de la réponse de l'erreur observée à l'aide de l'API Monitoring, de l'outil Trace ou des journaux d'accès NGINX, comme expliqué dans la section Étapes de diagnostic courantes.
  2. Si la source d'erreur a la valeur target, cela indique que la réponse envoyée par le serveur cible/backend à Apigee comporte des en-têtes dont la taille est supérieure à la limite autorisée dans Apigee Edge.
  3. Vous pouvez vérifier que la réponse de la cible/du backend comporte des en-têtes dont la taille était supérieure à la limite autorisée à l'aide de l'une des méthodes suivantes:

    Message d'erreur

    Pour valider à l'aide du message d'erreur:

    Si vous avez accès au message d'erreur complet reçu d'Apigee Edge, reportez-vous au faultstring. faultstring indique que la taille de l'en-tête de réponse a dépassé la limite autorisée.

    Exemple de message d'erreur:

    "faultstring":"response headers size exceeding 25,600"
    

    Dans le message d'erreur ci-dessus, notez dans faultstring que la réponse comporte des en-têtes dont la taille totale dépasse la limite autorisée.

    Demande réelle

    Pour valider à l'aide de la requête réelle:

    Si vous avez accès à la requête réelle envoyée au serveur cible/backend, procédez comme suit:

    1. Si vous êtes un utilisateur de cloud public/cloud privé, envoyez une requête directement au serveur backend à partir du serveur backend lui-même ou de toute autre machine à partir de laquelle vous êtes autorisé à envoyer la requête au serveur backend.
    2. Si vous êtes un utilisateur du cloud privé, vous pouvez également envoyer la requête au serveur backend à partir de l'un des processeurs de messages.
    3. Examinez la réponse reçue du serveur backend, puis calculez et vérifiez la taille totale des en-têtes transmis dans la réponse.
    4. Si vous constatez que la taille des en-têtes dans la charge utile de la réponse est supérieure à la limite autorisée dans Apigee Edge, c'est la cause du problème.

      Exemple de réponse du serveur cible:

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      Dans l'exemple ci-dessus, Testheader1 et Testheader2 ont des tailles plus élevées, ce qui est la cause de cette erreur, car elle dépasse la limite autorisée dans Apigee Edge.

    Journaux du processeur de messages

    Pour valider à l'aide des journaux du processeur de messages:

    Si vous êtes un utilisateur de cloud privé, vous pouvez utiliser les journaux du processeur de messages pour vérifier si la taille des en-têtes de réponse a dépassé la limite autorisée dans Apigee Edge.

    1. Vérifiez les journaux du processeur de messages:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Recherchez s'il existe des erreurs 502 pendant une durée spécifique (si le problème s'est déjà produit par le passé) ou si des requêtes échouent toujours avec 502. Vous pouvez utiliser la chaîne de recherche suivante :
      grep -ri "response headers size exceeding"
      
    3. Vous trouverez des lignes de system.log semblables à ce qui suit. La taille des en-têtes de réponse peut varier dans votre cas :
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
      
    4. Dès que le processeur de messages reçoit la réponse du serveur backend/cible et constate que la taille totale des en-têtes est supérieure à 25 Ko, il s'arrête et génère l'erreur:

      response headers size exceeding 25,600

      Cela implique que la taille totale de l'en-tête est supérieure à 25 Ko et Apigee génère l'erreur lorsque la taille commence à dépasser la limite de 25 Ko avec le code d'erreur protocol.http.TooBigHeaders.

Résolution

Corriger la taille

Option 1 [recommandée]: corrigez l'application du serveur cible de sorte qu'elle n'envoie pas d'en-têtes dépassant la limite Apigee

  1. Analysez la raison pour laquelle le serveur cible spécifique envoie une taille d'en-tête de réponse supérieure à la limite autorisée, telle que définie dans la section Limites.
  2. Si cela n'est pas souhaitable, modifiez votre application de serveur backend de sorte qu'elle envoie les en-têtes de réponse dont la taille est inférieure à la limite autorisée dans Apigee Edge.
  3. Vérifiez si les informations d'en-tête peuvent être envoyées dans le corps de la réponse.
  4. Si possible, envoyez toutes les informations volumineuses que vous prévoyez d'envoyer dans l'en-tête du corps de la réponse. Cela garantit que vous ne dépasserez pas la limite des en-têtes de réponse.

CwC

Option 2 : Utiliser la propriété CwC pour augmenter la limite de taille d'en-tête de réponse

Apigee fournit une propriété CwC qui lui permet d'augmenter la limite de taille des en-têtes de réponse. Pour en savoir plus, consultez Configurer les limites du processeur de messages.

Limites

Apigee s'attend à ce que l'application cliente et le serveur backend n'envoient pas de tailles d'en-tête supérieures à la limite autorisée telle qu'indiquée pour la taille d'en-tête des requêtes/réponses dans les limites d'Apigee Edge.

  1. Si vous êtes un utilisateur du cloud public, la limite maximale de taille des en-têtes de requête et de réponse est indiquée pour la taille de l'en-tête de requête/réponse dans Apigee Edge Limits.
  2. Si vous êtes un utilisateur du cloud privé , vous avez peut-être modifié la limite maximale par défaut pour la taille des en-têtes de requête et de réponse (même si ce n'est pas une pratique recommandée). Pour déterminer la taille maximale de l'en-tête de réponse, suivez les instructions de la section Vérifier la limite actuelle.

Comment vérifier la limite actuelle ?

Cette section explique comment vérifier que la propriété HTTPResponse.headers.limit a été mise à jour avec une nouvelle valeur sur les processeurs de messages.

  1. Sur la machine du processeur de messages, recherchez la propriété HTTPResponse.headers.limit dans le répertoire /opt/apigee/edge-message-processor/conf et vérifiez la valeur qui a été définie comme indiqué ci-dessous :
    grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. L'exemple de résultat de la commande ci-dessus est le suivant :
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
    
  3. Dans l'exemple de sortie ci-dessus, notez que la propriété HTTPResponse.headers.limit a été définie avec la valeur 25k dans http.properties.

    Cela indique que la taille maximale de la charge utile de réponse configurée dans Apigee pour le cloud privé est de 25 Ko.

Si vous avez encore besoin d'aide de l'assistance Apigee, consultez la section Vous devez recueillir des informations de diagnostic.

Vous devez collecter des informations de diagnostic

Rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge:

Si vous êtes un utilisateur de cloud public, fournissez les informations suivantes:

  • Le nom de l'organisation.
  • Nom de l'environnement
  • Nom du proxy d'API
  • Complétez la commande curl permettant de reproduire l'erreur 502.
  • Fichier de suivi des requêtes API
  • Résultat complet de la réponse du serveur cible/backend, ainsi que la taille des en-têtes

Si vous êtes un utilisateur du Private Cloud, fournissez les informations suivantes:

  • Message d'erreur complet observé pour les requêtes ayant échoué
  • Le nom de l'organisation.
  • Nom de l'environnement
  • Groupe de proxys d'API
  • Fichier de suivi des requêtes API ayant échoué
  • Complétez la commande curl permettant de reproduire l'erreur 502.
  • Résultat complet de la réponse du serveur cible/backend, ainsi que la taille des en-têtes
  • Journaux d'accès NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    :ORG, ENV et PORT# sont remplacés par des valeurs réelles.

  • Journaux système du processeur de messages /opt/apigee/var/log/edge-message-processor/logs/system.log