502 Bad Gateway – TooBigBody

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

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":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

Causes possibles

Cette erreur se produit si la taille de la charge utile envoyée 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 l'erreur:

Cause Description Instructions de dépannage applicables
La taille de la charge utile de la réponse est supérieure à la limite autorisée La taille de la charge utile envoyée par le serveur cible/backend dans la réponse HTTP à Apigee est supérieure à la limite autorisée dans Apigee. Utilisateurs Edge Public and Private Cloud
La taille de la charge utile de la réponse dépasse la limite autorisée après décompression La taille de la charge utile envoyée au format compressé par le serveur cible/backend dans la réponse HTTP à Apigee est supérieure à la limite autorisée lorsqu'elle est décompressée par Apigee. 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.TooBigBody, comme indiqué ci-dessous:

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

  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 informations suivantes :
    • Code d'état:502
    • Source de l'erreur: target
    • Code d'erreur:protocol.http.TooBigBody.
  11. Si la source d'erreur a la valeur target et le code d'erreur a la valeur protocol.http.TooBigBody, cela indique que la taille de la charge utile de réponse de la réponse HTTP de la cible/ du serveur backend est supérieure à la limite autorisée dans Apigee Edge.

Trace

Pour diagnostiquer l'erreur à l'aide de l'outil Trace:

  1. Activez la session de trace, puis effectuez l'une des opérations suivantes :
    • Attendez que l'erreur 502 Bad Gateway se produise.
    • 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. Accédez à la phase Error (Erreur) juste après la phase Response received from target server (Réponse reçue du serveur cible), comme indiqué ci-dessous:

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

    • erreur:Body buffer overflow
    • 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, car la taille de la charge utile dépasse la limite autorisée.

  5. L'échec devrait se produire dans la phase Response sent to Client (Réponse envoyée au client), comme illustré ci-dessous:

  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":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. Accédez à la phase Réponse reçue du serveur cible comme indiqué ci-dessous pour différents scénarios:

    Non compressé

    Scénario 1: Charge utile de réponse envoyée sous forme non compressée

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

    • Réponse reçue du serveur cible: 200 OK
    • Content-Length (de la section Response Headers): ~11 Mo

    Compressé

    Scénario 2: Demande de charge utile envoyée sous forme compressée

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

    • Réponse reçue du serveur cible: 200 OK
    • Content-Encoding: si vous voyez cet en-tête dans la section Response Headers (En-têtes de réponse), notez la valeur. Dans cet exemple, la valeur est gzip.
  8. Notez le champ Body (Corps) dans la section Response Content (Contenu de la réponse) :

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. Accédez à la phase AX (Données analytiques enregistrées) dans la trace, puis cliquez dessus pour afficher les informations associées.

  10. Faites défiler la page vers le bas de Phase Details (Détails de la phase) jusqu'à la section Variables Read (Lecture des variables) et déterminez les valeurs de target.received.content.length, qui indique :
    • La taille réelle de la charge utile de la réponse lorsqu'elle est envoyée dans un format non compressé et
    • Taille de la charge utile de réponse en cas de décompression par Apigee, lorsque la charge utile est envoyée dans un format compressé. Dans ce scénario, elle sera toujours identique à la valeur de la limite autorisée (10 Mo).

    Non compressé

    Scénario 1: Charge utile de réponse envoyée sous forme non compressée

    Notez la valeur de target.received.content.length:

    En-têtes de requête Valeur
    target.received.content.length Environ 11 Mo

    Compressé

    Scénario 2: Demande de charge utile envoyée sous forme compressée

    Notez la valeur de target.received.content.length:

    En-têtes de requête Valeur
    target.received.content.length Environ 10 Mo
  11. Le tableau suivant explique pourquoi l'erreur 502 est renvoyée par Apigee dans les deux scénarios en fonction de la valeur de target.received.content.length:

    Scénario Valeur de target.received.content.length Motif de l'échec
    Charge utile de réponse au format non compressé Environ 11 Mo Taille > limite autorisée de 10 Mo
    Charge utile de réponse au format compressé Environ 10 Mo

    Taille maximale dépassée en cas de décompression

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 déjà 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 protocol.http.TooBigBody, 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-source :

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

Cause: la taille de la charge utile de 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 avec le scénario 1.
  2. Si la source d'erreur a la valeur target, cela indique que la taille de la charge utile de réponse envoyée par le serveur cible/backend à Apigee est supérieure à la limite autorisée dans Apigee Edge.
  3. Vérifiez la taille de la charge utile de la réponse déterminée à l'étape 1.
  4. Vérifiez que la taille de la charge utile de la réponse est bien supérieure à la limite autorisée de 10 Mo en vérifiant la réponse réelle en procédant comme suit :
    1. Si vous n'avez pas accès à la requête réelle envoyée au serveur cible/backend, accédez à Résolution.
    2. 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 de cloud privé, vous pouvez également envoyer la requête au serveur backend à partir de l'un des processeurs de messages.
      3. Vérifiez la taille de la charge utile transmise dans la réponse en vérifiant l'en-tête Content-Length.
      4. Si vous constatez que la taille de la charge utile dépasse la limite autorisée dans Apigee Edge, c'est la cause du problème.

    Exemple de réponse du serveur backend:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    Dans l'exemple ci-dessus, vous pouvez constater que Content-Length: 11534336 (which is ~11 MB) est la cause de cette erreur, car il dépasse la limite autorisée dans Apigee Edge.

Résolution

Consultez la section Résolution.

Cause: la taille de la charge utile de la réponse dépasse la limite autorisée après décompression

Si la charge utile de la réponse est envoyée au format compressé et que l'en-tête de réponse Content-Encoding est défini sur gzip, Apigee décompresse la charge utile de la réponse. Au cours du processus de décompression, si Apigee détermine que la taille de la charge utile est supérieure à la limite autorisée dans Apigee Edge, il arrête une nouvelle décompression et répond immédiatement avec 502 Bad Gateway et le code d'erreur protocol.http.TooBigBody.

Diagnostic

  1. Déterminez le code d'erreur, la source de l'erreur et la taille de la charge utile de la réponse pour l'erreur observée à l'aide des journaux d'accès de l'API Monitoring, de Trace Tool ou de NGINX, comme expliqué dans la section Étapes de diagnostic courantes avec le scénario 2.
  2. Si la source d'erreur a la valeur target, cela indique que la taille de la charge utile de réponse envoyée par l'application cible/backend à Apigee est supérieure à la limite autorisée dans Apigee Edge.
  3. Vérifiez la taille de la charge utile de la réponse déterminée à l'étape 1.
    • Si la taille de la charge utile dépasse la limite autorisée de 10 Mo, l'erreur est due.
    • Si la taille de la charge utile est d'environ 10 Mo, il est possible que la charge utile de la réponse soit transmise dans un format compressé. Dans ce cas, vérifiez la taille non compressée de la charge utile de réponse compressée.
  4. Vous pouvez vérifier si la réponse de la cible/du backend a été envoyée dans un format compressé et si la taille non compressée était supérieure à la limite autorisée à l'aide de l'une des méthodes suivantes:

    Trace

    Utiliser l'outil Trace:

    1. Si vous avez capturé une trace de la requête ayant échoué, reportez-vous à la procédure détaillée dans Trace et
      1. Déterminer la valeur de target.received.content.length
      2. Vérifiez si la requête du client contient l'en-tête Content-Encoding: gzip .
    2. Si la valeur de target.received.content.length se situe autour de la limite autorisée de 10 Mo et de l'en-tête de réponse target.received.content.length , c'est la cause de cette erreur.

    Demande réelle

    Utilisation d'une requête réelle :

    1. Si vous n'avez pas accès à la requête réelle envoyée au serveur cible/backend, accédez à Résolution.
    2. Si vous avez accès à la requête réelle envoyée au serveur cible/backend, procédez comme suit :
      1. Vérifiez la taille de la charge utile transmise dans la réponse ainsi que l'en-tête Content-Encoding envoyé dans la réponse.
      2. Si vous constatez que l'en-tête de réponse Content-Encoding est défini sur gzip et que la taille non compressée de la charge utile est supérieure à la limite autorisée dans Apigee Edge, c'est la cause de cette erreur.

        Exemple de réponse reçue du serveur backend:

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * 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 /testzippedfile.gz 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-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        Dans le cas ci-dessus, l'en-tête Content-Encoding: gzip est envoyé et la taille du fichier testzippedfile.gz dans la réponse est inférieure à la limite. Toutefois, la taille du fichier non compressé testzippedfile était d'environ 15 Mo.

    Journaux du processeur de messages

    Utilisation des journaux du processeur de messages:

    1. Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux du processeur de messages pour déterminer les informations clés sur les erreurs HTTP 502.
    2. Vérifier les journaux du processeur de messages

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

    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. Vous pouvez utiliser les chaînes de recherche suivantes:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Vous verrez des lignes de system.log semblables à celles ci-dessous (TotalRead et chunkCount peuvent varier dans votre cas) :
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. Au cours du processus de décompression, dès que le processeur de messages détermine que le nombre total d'octets lus est supérieur à 10 Mo, il s'arrête et affiche la ligne suivante:

      Message is too large. TotalRead 10489856 chunkCount 2571

      Cela implique que la taille de la charge utile de la réponse (Response Payload Size) est supérieure à 10 Mo et Apigee génère l'erreur lorsque la taille commence à dépasser la limite de 10 Mo avec le code d'erreur protocol.http.TooBigBody.

Résolution

Corriger la taille

Option 1 [recommandée]: corrigez l'application du serveur cible de sorte qu'elle n'envoie pas la charge utile dépassant la limite Apigee

  1. Analysez la raison pour laquelle le serveur cible spécifique envoie une réponse ou une taille de charge utile supérieure à 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 de sorte qu'elle envoie des réponses / tailles de charge utile inférieures à la limite autorisée.
  3. Si vous souhaitez envoyer une réponse ou une charge utile au-delà de la limite autorisée, passez aux options suivantes.

Format d'URL signé

Option 2 [recommandée]: utiliser un format d'URL signées dans un élément Apigee JavaCallout

Pour les charges utiles supérieures à 10 Mo, Apigee recommande d'utiliser un modèle d'URL signées dans Apigee JavaCallout, illustré par l'exemple Edge Callout: Signed URL Generator sur GitHub.

Streaming

Option 3: Utiliser le streaming

Si votre proxy d'API doit gérer des requêtes et/ou des réponses très volumineuses, vous pouvez activer le streaming dans Apigee.

CwC

Option 4: Utiliser la propriété CwC pour augmenter la limite de la mémoire tampon

Cette option ne doit être utilisée que lorsque vous ne pouvez utiliser aucune des options recommandées, car des problèmes de performances peuvent se produire si la taille par défaut est augmentée.

Apigee fournit une propriété CwC qui lui permet d'augmenter la taille maximale de la charge utile des requêtes et des réponses. Pour en savoir plus, consultez Définir la limite de taille des messages sur le routeur ou le processeur de messages.

Limites

Apigee s'attend à ce que l'application cliente et le serveur backend n'envoient pas de tailles de charge utile supérieures à la limite autorisée, comme indiqué pour Request/response size dans Limites Apigee Edge.

  1. Si vous êtes un utilisateur de cloud public, la limite maximale de taille de la charge utile de requête et de réponse est indiquée pour Request/response size dans Limites d'Apigee Edge.
  2. Si vous êtes un utilisateur du cloud privé , vous avez peut-être modifié la limite maximale par défaut de la taille des charges utiles 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 la charge utile de requête, 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.body.buffer.limit a été mise à jour avec une nouvelle valeur sur les processeurs de messages.

  1. Sur la machine de processeur de messages, recherchez la propriété HTTPResponse.body.buffer.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.body.buffer.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.body.buffer.limit=10m
    
  3. Dans l'exemple de sortie ci-dessus, notez que la propriété HTTPResponse.body.buffer.limit a été définie avec la valeur 10m dans http.properties.

    Cela indique que la taille maximale de la charge utile de requête configurée dans Apigee pour le cloud privé est de 10 Mo.

Si vous avez encore besoin de l'aide de l'assistance Apigee, consultez 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
  • Résultat complet de la réponse du serveur cible/backend, ainsi que la taille de la charge utile

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é
  • Commande curl complète utilisée pour reproduire l'erreur 502
  • Résultat complet de la réponse du serveur cible/backend, ainsi que la taille de la charge utile
  • 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