502 Bad Gateway – TooBigLine

<ph type="x-smartling-placeholder"></ph> Vous consultez la documentation Apigee Edge.
Accédez à la page Documentation sur Apigee X.
En savoir plus

Symptôme

L'application cliente obtient le code d'état HTTP 502 Bad Gateway avec un code d'erreur protocol.http.TooBigLine en réponse aux appels d'API.

Message d'erreur

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

HTTP/1.1 502 Bad Gateway

Le message d'erreur suivant peut également 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 (Ligne de réponse) envoyée par serveur cible/backend vers Apigee La périphérie dans la réponse HTTP est supérieure au maximum autorisé limite dans Apigee Edge.

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

Comprendre la ligne de réponse

Une réponse HTTP se compose généralement de trois parties:

  1. <ph type="x-smartling-placeholder"></ph> 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'une chaîne numérique code d'état et la synthèse 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 qui est envoyé représente la ligne de réponse décrite ci-dessus. Elle est suivie de en-têtes et corps/charge utile de la réponse.La capture d'écran suivante montre un exemple curl, les parties Request et Response (avec les éléments de réponse).

Comprendre la taille de la ligne de réponse

  1. Dans l'exemple présenté ci-dessus, la ligne start (première ligne) de la réponse contient également (appelée Ligne de réponse) 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. Puisqu'il s'agit d'un emplacement limite autorisée dans Apigee Edge, la réponse est renvoyée au client sans qu'aucune d'Apigee Edge.

  2. De même, si vous regardez faultstring dans Le message d'erreur ci-dessus, qui contient "response line size exceeding 2,048". Cela indique que la ligne de réponse (Response-Line) de la réponse HTTP envoyées par le serveur cible/backend dépassaient 2 048 octets.

Comprendre les grandes lignes de réponse

Conformément à la définition <ph type="x-smartling-placeholder"></ph> "Status-Line" (appelée Response-Line ici), les requêtes HTTP types et , la taille serait bien inférieure à la limite par défaut définie de 2 K dans Apigee Edge, donc nous ne pourrons peut-être pas atteint la limite. Vous pouvez toutefois dépasser 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 de réponse.
  2. Le serveur cible/backend rencontre des problèmes et envoie une longue ligne de réponse dans le message de réponse.

Pour en savoir plus, consultez <ph type="x-smartling-placeholder"></ph> Le message d'erreur "protocol.http.TooBigLine", "taille de la ligne de réponse supérieure à 2 048" s'affiche.

Voici les causes possibles de cette 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 (Response-Line) envoyée par le serveur cible/backend dans le cadre de La réponse HTTP à Apigee Edge est supérieure à la valeur limite autorisée dans Apigee Edge Utilisateurs Edge de cloud public et privé

Étapes de diagnostic courantes

Utilisez l'une des techniques ou l'un des outils suivants pour diagnostiquer ce problème:

Surveillance des API

<ph type="x-smartling-placeholder">

Pour diagnostiquer l'erreur à l'aide de l'API Monitoring, procédez comme suit:

  1. <ph type="x-smartling-placeholder"></ph> Connectez-vous à l'interface utilisateur d'Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
  2. Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.

  3. Accédez à Analyser > Surveillance des API > Examiner.
  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. Représentez le code d'erreur par rapport à l'heure.
  7. Sélectionnez une cellule avec le code d'erreur protocol.http.TooBigLine comme comme indiqué ci-dessous:

    ( Agrandir l'image)

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

    ( Agrandir l'image)

  9. Cliquez sur Afficher les journaux et développez la ligne correspondant à la requête ayant échoué.

  10. Dans la fenêtre Journaux, notez les détails suivants: <ph type="x-smartling-placeholder">
      </ph>
    • Code d'état:502
    • Source de l'erreur:target
    • Code d'erreur:protocol.http.TooBigLine.
  11. Si la Source de la défaillance a la valeur target et la Fault "Code", qui a la valeur protocol.http.TooBigLine, cela indique que la taille de la ligne de réponse de la réponse HTTP du serveur cible/ backend est supérieure à la limite maximale autorisée dans Apigee Edge.

Outil Trace

<ph type="x-smartling-placeholder">
  1. Activez la session de trace. et l'une des options suivantes: <ph type="x-smartling-placeholder">
      </ph>
    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. Parcourir les différentes phases de la trace et localiser l'origine de la défaillance s'est produit.
  4. L'erreur se trouve généralement dans le champ Error flowinfo uniquement après la phase Demande 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 en tant que dès qu'il reçoit la réponse du serveur backend en raison d'une taille de ligne de réponse au-delà de la limite autorisée.

  5. Le message d'erreur envoyé au client apparaît dans le champ Response Sent to Client, comme indiqué ci-dessous:

    ( Agrandir l'image)

  6. Notez les valeurs de l'erreur à partir de la trace: <ph type="x-smartling-placeholder">
      </ph>
    • 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 cliquez dessus pour afficher les détails de l'erreur.

    ( Agrandir l'image)

    Notez la valeur des éléments suivants:

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

NGINX

<ph type="x-smartling-placeholder">

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX:

  1. Si vous êtes un utilisateur du Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés concernant 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. Effectuez une recherche pour voir s'il existe des erreurs 502 pendant une durée spécifique (si le problème s'est produit dans le passé) ou si des requêtes échouent encore avec 502
  4. Si vous trouvez des erreurs 502 avec le code X-Apigee-fault-code correspondant à la valeur de protocol.http.TooBigLine, puis déterminez la valeur de X-Apigee-fault-source.

    L'exemple d'entrée ci-dessus du journal d'accès NGINX présente 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 d'erreur pour l'erreur observée à l'aide de l'API. Monitoring, l'outil Trace ou les journaux d'accès NGINX comme expliqué dans Étapes de diagnostic courantes.
  2. Si la source de la défaillance a la valeur target, cela indique que le 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. Pour confirmer que la taille de la ligne de réponse a dépassé la limite autorisée de 2 Ko, utilisez 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, consultez 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 ne doit pas dépasser 2 Ko.

    Demande réelle

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

    Si vous avez accès à la requête réelle adressée au serveur cible/backend , puis effectuez les étapes suivantes:

    1. Vérifier la taille de la ligne de réponse
    2. Si vous constatez que la taille de l'URI est supérieure à limite autorisée dans Apigee Edge, cela explique le 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 taille de la ligne de réponse HTTP/1.1 200 1111…<trimmed>...11111111 dépasse 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 pour connaître la taille de la ligne de réponse envoyée à Apigee Edge.

    Journaux de processeur de messages

    Pour valider l'utilisation des journaux du processeur de messages:

    <ph type="x-smartling-placeholder">

    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 du message de la requête ayant échoué à l'aide de l'API Monitoring, de l'outil Trace ou 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. Les lignes de system.log se présentent comme 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 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 code d'erreur protocol.http.TooBigline aux applications clientes.

Solution

<ph type="x-smartling-placeholder">

Corriger la taille

Option 1 [recommandée]: correction de l'application du serveur cible/backend pour qu'elle n'envoie pas Response-Lines dont la taille est supérieure à la limite autorisée

<ph type="x-smartling-placeholder">
  1. Analysez la raison pour laquelle le client spécifique envoie une ligne de réponse de plus grande taille. que la limite autorisée, telle que définie dans la section Limites.
  2. Si ce n'est pas souhaitable, modifiez votre application de serveur cible/backend envoie une ligne de réponse dont la taille est inférieure à la limite autorisée.
  3. Si c'est souhaitable et que vous voulez envoyer une ligne de réponse d'une taille supérieure à celle 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

<ph type="x-smartling-placeholder">

Apigee fournit un CwC qui permet d'augmenter la limite de taille de la ligne de réponse. Pour en savoir plus, consultez <ph type="x-smartling-placeholder"></ph> Définissez la limite de ligne de réponse sur le processeur de messages.

<ph type="x-smartling-placeholder">

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 dépasse la limite autorisée, telle qu'indiquée dans le nombre maximal de lignes de requêtes/réponses. dans les limites d'Apigee Edge.

  1. Si vous êtes un utilisateur de cloud public, la limite maximale pour les ressources La taille de la ligne de réponse est telle qu'indiquée dans le champ Request/Response-Line size (Taille de la ligne de requête/réponse) dans Limites d'Apigee Edge
  2. Si vous êtes un utilisateur du Private Cloud , il est possible que vous ayez modifié le nombre maximal par défaut pour la taille de la requête et de la ligne de réponse (même s'il ne s'agit pas d'une pratique recommandée). Vous pouvez déterminer la limite de taille maximale pour la ligne de réponse en suivant les instructions fournies dans l'article Vérifier la limite actuelle

Comment vérifier la limite actuelle ?

<ph type="x-smartling-placeholder">

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

  1. Sur le processeur de messages, recherchez la propriété HTTPResponse.line.limit dans la /opt/apigee/edge-message-processor/conf et vérifier consultez la valeur définie ci-dessous:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Voici un exemple de résultat de la commande ci-dessus:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. Dans l'exemple de résultat 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 limite de taille de ligne de réponse configurée dans Apigee pour les est de 2 Ko.

Si vous avez encore besoin de l'aide de l'assistance Apigee, accédez à Obligation de 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:

  • 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 en échec
  • Nom de l'organisation
  • Nom de l'environnement
  • Groupe de proxys d'API
  • Fichier de suivi des requêtes API en échec
  • Exécutez la commande curl utilisée pour 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 les valeurs réelles.

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