<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.TooBigBody
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":"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 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 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 dépasse la limite autorisée dans Apigee. | Utilisateurs Edge de cloud public et privé |
La taille de la charge utile de la réponse dépasse la limite autorisée après décompression | Taille de la charge utile envoyée dans un format compressé par le serveur cible/backend dans le cadre d'un la réponse à Apigee dépasse la limite autorisée lors de la décompression par Apigee. | 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:
- <ph type="x-smartling-placeholder"></ph> Connectez-vous à l'interface utilisateur d'Apigee Edge en tant qu'utilisateur disposant d'un rôle approprié.
Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.
- Accédez à Analyser > Surveillance des API > Examiner.
- Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
- Vous pouvez sélectionner le filtre Proxy pour affiner le code d'erreur.
- Représentez le code d'erreur par rapport à l'heure.
Sélectionnez une cellule avec le code d'erreur
protocol.http.TooBigBody
comme comme indiqué ci-dessous:Vous verrez les informations sur le code d'erreur
protocol.http.TooBigBody
comme indiqué ci-dessous:Cliquez sur Afficher les journaux et développez la ligne correspondant à la requête ayant échoué.
- Dans la fenêtre "Journaux", notez les informations suivantes:
<ph type="x-smartling-placeholder">
- </ph>
- Code d'état:
502
- Source de l'erreur:
target
- Code d'erreur:
protocol.http.TooBigBody
.
- Code d'état:
- Si la Source d'erreur a la valeur
target
et le Code d'erreur a la valeurprotocol.http.TooBigBody
, cela indique que le serveur du serveur cible/ backend a une taille de charge utile supérieure à la autorisée dans Apigee Edge.
Trace
<ph type="x-smartling-placeholder">Pour diagnostiquer l'erreur à l'aide de l'outil Trace:
- Activez la session de trace, puis effectuez l'une des opérations suivantes:
<ph type="x-smartling-placeholder">
- </ph>
- Attendez que l'erreur
502 Bad Gateway
se produise. - Si vous pouvez reproduire le problème, effectuez l'appel d'API et reproduisez les actions
502 Bad Gateway
erreur.
- Attendez que l'erreur
- Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
- Parcourez les différentes phases de la trace et localisez l'origine de l'échec.
Accédez à la phase Error (Erreur) juste après la réponse reçue de la cible. serveur 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 que il reçoit la réponse du serveur backend, car la taille de la charge utile dépasse la limite autorisée limite.
- erreur:
L'échec se produit lors de la phase Response Sent to Client (Réponse envoyée au client), comme illustré ci-dessous:
- Notez les valeurs de l'erreur à partir de la trace. L'exemple de trace ci-dessus montre:
<ph type="x-smartling-placeholder">
- </ph>
- erreur:
502 Bad Gateway
- Contenu de l'erreur:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- erreur:
Accédez à la phase Response Received from target server (Réponse reçue du serveur cible) comme indiqué ci-dessous pour les 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
- Longueur du contenu (dans la section En-têtes de réponse): ~11 Mo
Compressé
Scénario 2: Charge utile de requête 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 Response Headers
notez la valeur. Dans cet exemple, la valeur est
gzip
- Réponse reçue du serveur cible:
Notez le corps sous la section Contenu de la réponse:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
<ph type="x-smartling-placeholder">Accédez à la phase AX (Données analytiques enregistrées) dans la trace et cliquez dessus. pour afficher les détails associés.
- Faites défiler Phase Details (Détails de la phase) vers le bas jusqu'à la section Variables Read (Lecture des variables), puis déterminez la
des valeurs de
target.received.content.length
, ce qui indique: <ph type="x-smartling-placeholder">- </ph>
- La taille réelle de la charge utile de la réponse lorsqu'elle est envoyée dans un format non compressé et
- La taille de la charge utile de réponse après décompression par Apigee, lorsque la charge utile est envoyées au format compressé. Elle est toujours identique à la valeur de l'attribut autorisé (10 Mo) dans ce scénario.
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: Charge utile de requête 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 Le tableau suivant explique pourquoi l'erreur
502
est renvoyée par Apigee sous les deux scénarios basés sur 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 lors de la décompression
<ph type="x-smartling-placeholder">
NGINX
<ph type="x-smartling-placeholder">Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX:
- Si vous êtes un utilisateur du Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer
les informations clés sur les erreurs HTTP
502
. Vérifiez les journaux d'accès NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Où:ORG, ENV et PORT# sont remplacés par des valeurs réelles.
- Effectuez une recherche pour voir s'il existe des erreurs
502
pendant une période spécifique (si si le problème s'est produit dans le passé) ou si des requêtes échouent encore502
- Si vous trouvez des erreurs
502
avec la correspondance X-Apigee-fault-code la valeur deprotocol.http.TooBigBody
, puis déterminez la valeur de la X-Apigee-fault-source.Exemple d'erreur 502 dans le 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
- 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 de la surveillance des API, de l'outil Trace ou des journaux d'accès NGINX comme expliqué dans Étapes de diagnostic courantes pour le scénario 1.
- Si la source de l'erreur a la valeur
target
, cela indique que la réponse la taille de la charge utile envoyée par le serveur cible/backend à Apigee est supérieure à limite autorisée dans Apigee Edge. - 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 > une limite de 10 Mo autorisée, c'est la cause de l'erreur.
- Si la taille de la charge utile est d'une taille maximale de 10 Mo autorisée, il est possible que la réponse est transmise dans un format compressé. Accéder à <ph type="x-smartling-placeholder"></ph> Cause: la taille de la charge utile de la réponse dépasse la limite autorisée après décompression.
- Vérifier que la taille de la charge utile de la réponse est bien > la limite autorisée de 10 Mo en cochant la case
la réponse réelle en procédant comme suit:
<ph type="x-smartling-placeholder">
- </ph>
- Si vous n'avez pas accès à la requête réelle adressée au serveur cible/backend, puis accédez à Resolution (Résolution).
- Si vous avez accès à la requête réelle adressée au serveur cible/backend,
procédez comme suit:
<ph type="x-smartling-placeholder">
- </ph>
- Si vous êtes un utilisateur de cloud public/cloud privé, envoyez une requête directement à le serveur backend à partir du serveur backend lui-même ou de toute autre machine à partir de laquelle vous sont autorisés à envoyer la requête au serveur backend.
- Si vous êtes un utilisateur du Private Cloud, vous pouvez également envoyer une requête au de l'un des processeurs de messages.
- Vérifiez la taille de la charge utile transmise dans la réponse en vérifiant le En-tête Content-Length.
- Si vous constatez que la taille de la charge utile est supérieure à limite autorisée dans Apigee Edge, c'est la cause du problème 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,
Content-Length: 11534336 (which is ~11 MB)
est à l'origine de cette erreur, car il dépasse la valeur limite autorisée dans Apigee Edge.
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 si l'en-tête de réponse
Content-Encoding
est défini sur gzip,
Apigee décompresse la réponse.
charge utile. Pendant le processus de décompression, si Apigee trouve que la taille de la charge utile est supérieure
supérieure à la limite autorisée dans Apigee Edge.
décompression et répond immédiatement
avec 502 Bad Gateway
et le code d'erreur protocol.http.TooBigBody
.
Diagnostic
- Déterminez le code d'erreur,la source d'erreur et la taille de la charge utile de la réponse pour l'erreur observée à l'aide des journaux de surveillance des API, de l'outil Trace ou de NGINX Access, comme expliqué dans Étapes de diagnostic courantes pour le scénario 2.
- Si la source de la défaillance a la valeur
target
, cela indique que le la taille de la charge utile envoyée par l'application cible/backend à Apigee est supérieure à limite autorisée dans Apigee Edge. - 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 > une limite de 10 Mo autorisée, c'est la cause de l'erreur.
- Si la taille de la charge utile est d'environ 10 Mo, il est possible que la charge utile de la réponse soit transmis au format compressé. Dans ce cas, vérifiez la taille non compressée du fichier la charge utile de réponse.
- Vous pouvez vérifier si la réponse de la cible/du backend a été envoyée dans un format compressé et
la taille non compressée était supérieure à la limite autorisée à l'aide de l'un des éléments suivants :
méthodes:
Trace
À l'aide de l'outil Trace:
- Si vous avez capturé une trace pour la requête en échec, reportez-vous aux étapes détaillées dans
Trace et
<ph type="x-smartling-placeholder">
- </ph>
- Déterminez la valeur de target.received.content.length.
- Vérifiez si la requête du client contient les
Encodage du contenu: en-tête
gzip
- Si la valeur de target.received.content.length atteint environ 10 Mo autorisés.
et l'en-tête de réponse Content-Encoding:
gzip
, nous obtenons la cause de cette erreur.
Demande réelle
Utilisation d'une requête réelle:
- Si vous n'avez pas accès à la requête réelle adressée au serveur cible/backend, puis accédez à Resolution (Résolution).
- Si vous avez accès à la requête réelle adressée au serveur cible/backend,
procédez comme suit:
<ph type="x-smartling-placeholder">
- </ph>
- Vérifiez la taille de la charge utile transmise dans la réponse avec le
En-tête
Content-Encoding
envoyé dans la réponse. - Si vous constatez que l'en-tête de réponse
Content-Encoding
est défini surgzip
et la taille non compressée de la charge utile est supérieure à limite autorisée dans Apigee Edge, cela explique 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 fichiertestzippedfile.gz
dans la réponse est inférieure à la limite, mais la taille du fichier non compressétestzippedfile
était ~ 15 Mo.
- Vérifiez la taille de la charge utile transmise dans la réponse avec le
En-tête
Journaux de processeur de messages
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
déterminer les informations clés concernant les erreurs HTTP
502
. Vérifier les journaux du processeur de messages
/opt/apigee/var/log/edge-message-processor/logs/system.log
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 avec502
Vous pouvez utiliser les chaînes de recherche suivantes:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Vous verrez des lignes provenant de
system.log
semblables à celles ci-dessous. (TotalRead
etchunkCount
peuvent varier selon 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)
Au cours du processus de décompression, dès que le processeur de messages détermine le Le nombre total d'octets lus est > 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 soit supérieure à 10 Mo et qu'Apigee génère l'erreur lorsque la taille commence à dépasser la limite de 10 Mo avec le code d'erreur comme
<ph type="x-smartling-placeholder">protocol.http.TooBigBody
- Si vous avez capturé une trace pour la requête en échec, reportez-vous aux étapes détaillées dans
Trace et
<ph type="x-smartling-placeholder">
Solution
Corriger la taille
Option 1 [recommandée]: Corriger l'application du serveur cible pour qu'elle n'envoie pas une taille de charge utile qui dépasse la limite Apigee
<ph type="x-smartling-placeholder">- Analyser la raison pour laquelle le serveur cible spécifique envoie la réponse / taille de la charge utile dépasse la limite autorisée, telle que définie dans Limites.
- Si ce n'est pas souhaitable, modifiez votre application de serveur cible afin qu'elle envoie réponse / taille de la charge utile inférieure à la limite autorisée.
- Si c'est souhaitable et que vous voulez envoyer une réponse/une charge utile plus que la limite autorisée passez aux options suivantes.
Format d'URL signé
Option 2 [recommandée]: Utilisez le format d'URL signée dans un élément JavaCall d'Apigee
<ph type="x-smartling-placeholder">Pour les charges utiles supérieures à 10 Mo, Apigee recommande d'utiliser un format d'URL signée au sein d'une Apigee JavaAccroche, illustré par le <ph type="x-smartling-placeholder"></ph> Exemple d'accroche Edge: 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.
<ph type="x-smartling-placeholder">CwC
Option 4: Utiliser la propriété CwC pour augmenter la limite de la mémoire tampon
<ph type="x-smartling-placeholder">N'utilisez cette option que si vous ne pouvez utiliser aucune des options recommandées, car il peut y avoir des problèmes de performances si la taille par défaut est augmentée.
Apigee propose <ph type="x-smartling-placeholder"></ph> CwC, qui permet d'augmenter la taille de la charge utile de requête et de réponse limite. Pour en savoir plus, consultez <ph type="x-smartling-placeholder"></ph> Définissez la limite de taille des messages sur le routeur ou 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 tailles de charge utile supérieures à
la limite autorisée, telle qu'indiquée pour
Request/response size
dans
Limites d'Apigee Edge
- Si vous êtes un utilisateur de cloud public, la limite maximale de requêtes et de réponses
la taille de la charge utile est celle indiquée pour
Request/response size
dans Limites d'Apigee Edge - Si vous êtes un utilisateur du Private Cloud , il est possible que vous ayez modifié le nombre maximal par défaut limite de taille de la charge utile des requêtes et des réponses (même s'il ne s'agit pas d'une pratique recommandée). Vous pouvez déterminer la taille maximale de la charge utile de requête en suivant les instructions dans 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.body.buffer.limit
a été mis à jour avec une nouvelle valeur dans le message
Processeurs.
Sur le 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 définie, comme indiqué ci-dessous:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
Voici un exemple de résultat de la commande ci-dessus:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
Dans l'exemple de résultat ci-dessus, notez que la propriété
HTTPResponse.body.buffer.limit
a été défini avec la valeur10m
danshttp.properties
Cela indique que la limite de taille de la charge utile de requête configurée dans Apigee pour Private Cloud correspond à 10 Mo.
Si vous avez encore besoin de l'aide de l'assistance Apigee, consultez doit 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
- Sortie complète de la réponse de la cible/du serveur backend, ainsi que de 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 en échec
- Nom de l'organisation
- Nom de l'environnement
- Groupe de proxys d'API
- Fichier de suivi des requêtes API en échec
- Commande curl complète utilisée pour reproduire l'erreur
502
- Sortie complète de la réponse de la cible/du serveur backend, ainsi que de la taille de la charge utile
Journaux d'accès NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Où: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