502 Bad Gateway – TooBigLine

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.TooBigLine .

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 line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Causes possibles

Cette erreur se produit si la taille Response-Line envoyée par le serveur cible/backend à Apigee Edge dans le cadre de la réponse HTTP est supérieure à la limite maximale autorisée dans Apigee Edge.

Avant d'examiner les causes possibles de cette erreur, voyons ce que signifie la ligne de réponse et comment vérifier sa taille.

Comprendre la ligne de réponse

Une réponse HTTP type se compose de trois parties:

  1. Ligne d'état (appelée ligne de réponse dans Apigee)
  2. ( Ensemble d'en-têtes HTTP )
  3. [ Corps ]

La ligne de réponse se compose de trois parties: la version du protocole, suivie d'un code d'état numérique et de la phrase textuelle associée, comme indiqué ci-dessous:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Lorsqu'une réponse HTTP est envoyée par l'application du serveur cible/backend, la première ligne envoyée représente la ligne de réponse, comme décrit ci-dessus. Viennent ensuite les en-têtes et le corps/la charge utile de la réponse.La capture d'écran suivante montre une requête curl type, la partie Request (Requête) et la partie Response (Réponse) (avec la ligne de réponse).

Comprendre la taille de la ligne de réponse

  1. Dans l'exemple décrit ci-dessus, la ligne start (première ligne) de la réponse, également appelée Response-Line, se présente comme suit:

    HTTP/1.1 200 OK
    

    La taille de cette ligne de réponse est ~15 bytes, car elle contient 15 ASCII characters. Étant donné que cela se situe dans la limite autorisée dans Apigee Edge, la réponse est renvoyée au client sans aucune erreur par Apigee Edge.

  2. De même, si vous examinez le faultstring dans le message d'erreur ci-dessus, il contient "response line size exceeding 2,048". Cela indique que la ligne de réponse Response-Line de la réponse HTTP envoyée par le serveur cible/backend a dépassé 2 048 octets.

Comprendre les grandes lignes de réponse

Conformément à la définition de Status-Line (appelée Response-Line ici), ainsi qu'aux requêtes et réponses HTTP classiques, la taille serait nettement inférieure à la limite par défaut définie de 2 K dans Apigee Edge. Il est donc possible que nous n'atteignions pas cette limite. Il se peut toutefois que vous dépassiez cette limite dans les cas suivants:

  1. Le serveur cible/backend n'est pas un système HTTP. Il pourrait répondre avec une réponse non-HTTP.
  2. Le serveur cible/backend rencontre des problèmes et envoie une longue ligne de réponse dans la réponse HTTP.

Pour en savoir plus à ce sujet, consultez la page Get error Protocol.http.TooBigLine, "response line size dépassant 2 048".

Voici les causes possibles de l'erreur:

Cause Description Instructions de dépannage applicables
La taille de la ligne de réponse est supérieure à la limite autorisée La taille de la ligne de réponse envoyée par le serveur cible/backend dans le cadre de la réponse HTTP à Apigee Edge est supérieure à 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.TooBigLine, comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  8. Vous verrez les informations sur le code d'erreur protocol.http.TooBigLine 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é.

  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.TooBigLine.
  11. Si la source d'erreur a la valeur target et que le code d'erreur a la valeur protocol.http.TooBigLine, cela indique que la taille de la réponse HTTP du serveur cible ou du serveur backend dépasse la limite maximale 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. ou
    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. L'erreur se produit généralement dans l'erreur flowinfo juste après la phase Request sent to target server (Requête envoyée au serveur cible), comme indiqué ci-dessous:

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

    • erreur:response line exceeding 2,048
    • 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 de ligne de réponse dépassant la limite autorisée.

  5. Le message d'erreur envoyé au client s'affiche lors de la phase Response Sent to Client (Réponse envoyée au client), comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  6. Notez les valeurs de l'erreur à partir de la trace :
    • Erreur:502 Bad Gateway.
    • Contenu de l'erreur:{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Vous pouvez également accéder à la phase AX (Données analytiques enregistrées) dans la trace et cliquer dessus pour afficher les détails de l'erreur.

    ( Afficher l'image plus grande)

    Notez la valeur de ce qui suit:

    En-têtes de requête Valeur
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Contenu de l'erreur : corps {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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 essentielles sur les erreurs HTTP 502.
  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 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 .

    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-source :

    En-têtes de réponse Valeur
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

Cause: la taille de la ligne de réponse est supérieure à la limite autorisée

Diagnostic

  1. Déterminez le code d'erreur et la source de l'erreur 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 valeur Fault Source est définie sur target, cela indique que la taille de la ligne de réponse envoyée par l'application du serveur cible/backend à Apigee est supérieure à la limite autorisée dans Apigee Edge.
  3. Vous pouvez vérifier que la taille de la ligne de réponse a dépassé la limite autorisée de 2 Ko en utilisant 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.

    Exemple de message d'erreur:

    "faultstring":"response line size exceeding 2,048"
    

    La valeur faultstring ci-dessus indique que la taille de la ligne de réponse dépasse la limite autorisée de 2 Ko.

    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 à l'application du serveur cible/backend, procédez comme suit:

    1. Vérifier la taille de la ligne de réponse
    2. Si vous constatez que la taille de l'URI dépasse la limite autorisée dans Apigee Edge, c'est la cause du problème.

      Exemple de réponse du serveur cible/backend:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      Dans le cas ci-dessus, la ligne de réponse HTTP/1.1 200 1111…<trimmed>...11111111 est supérieure à 2 Ko, c'est-à-dire qu'elle contient plus de 2 000 caractères ASCII.

      Si vous utilisez un autre client, vous pouvez consulter les journaux du client et essayer de connaître la taille de la ligne de réponse envoyée à Apigee Edge.

    Journaux du processeur de messages

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

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

    1. Déterminez l'ID de message de la requête ayant échoué à 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. Recherchez l'ID du message dans le journal du processeur de messages:

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

    3. Vous trouverez des lignes de system.log semblables à ce qui suit:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      Le texte message = response line size exceeding 2,048 dans le message d'erreur ci-dessus indique que la taille de la ligne de réponse est supérieure à 2 Ko. Par conséquent, Apigee Edge génère l'exception et renvoie un code d'état 502 avec le code d'erreur protocol.http.TooBigline aux applications clientes.

Résolution

Corriger la taille

Option 1 [recommandée]: corriger l'application du serveur cible/backend de sorte qu'elle n'envoie pas de lignes de réponse dont la taille dépasse la limite autorisée

  1. Analysez la raison pour laquelle le client spécifique envoie une ligne de réponse de taille 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 cible/backend afin qu'elle envoie une ligne de réponse de taille inférieure à la limite autorisée.
  3. Si vous souhaitez envoyer une ligne de réponse d'une taille supérieure à la limite autorisée, passez aux options suivantes.

CwC

Option 2: Utiliser la propriété CwC pour augmenter la limite de la ligne de réponse

Apigee fournit une propriété CwC qui lui permet d'augmenter la limite de taille de la ligne de réponse. Pour en savoir plus, consultez Définir la limite de ligne de réponse sur le processeur de messages.

Limites

Apigee s'attend à ce que l'application cliente et le serveur backend n'envoient pas de lignes de requête/réponse dont la taille est supérieure à la limite autorisée telle que documentée pour le nombre maximal de lignes de requête/réponse dans Limites périphériques Apigee.

  1. Si vous êtes un utilisateur du cloud public, la limite maximale de taille des lignes de requête et de réponse est indiquée pour la taille de la ligne de requête/de réponse dans les limites d'Apigee.
  2. Si vous êtes un utilisateur du cloud privé , vous avez peut-être modifié la limite maximale par défaut pour la taille des requêtes et des lignes de réponse (même si ce n'est pas une pratique recommandée). Pour déterminer la taille maximale de la ligne 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.line.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.line.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.line.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.line.limit=2k
    
  3. Dans l'exemple de sortie ci-dessus, notez que la propriété HTTPResponse.line.limit a été définie avec la valeur 2k dans http.properties.

    Cela indique que la taille maximale de la ligne de réponse configurée dans Apigee pour le cloud privé est de 2 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
  • Commande curl complète utilisée pour reproduire l'erreur 502
  • Fichier de suivi des requêtes API

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.
  • 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