502 Bad Gateway – ResponseWithBody

<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 reçoit le code d'état HTTP 502 Bad Gateway avec l'erreur coder protocol.http.ResponseWithBody 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

L'un des messages d'erreur suivants peut également s'afficher:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

Causes possibles

Cette erreur se produit si la réponse HTTP du serveur backend à Apigee Edge est 204 No Content ou 205 Reset Content, mais elle contient la réponse corps et/ou un ou plusieurs des en-têtes suivants:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

Conformément aux spécifications <ph type="x-smartling-placeholder"></ph> RFC 7231, section 6.3.5: 204 No Content <ph type="x-smartling-placeholder"></ph> RFC 7231, section 6.3.6: 205Reset Content, aucun contenu supplémentaire doit être envoyé par le serveur d'origine dans le corps de la charge utile de la réponse avec le code d'état 204 No Content ou 205 Reset Content. En-têtes de réponse comme Content-Length, Content-Encoding ou Transfer-Encoding indiquent la taille, le type ou le format de la charge utile de la réponse.

Par conséquent, Apigee Edge renvoie un code d'état 502 Bad Gateway avec le code d'erreur protocol.http.ResponseWithBody au client sous le code suivant : circonstances:

Code d'état du serveur backend
La réponse du serveur backend contient 204 Aucun contenu 205 Réinitialiser le contenu
Corps de la réponse ERREUR ERREUR

En-tête Content-Length

(définie sur une valeur non nulle)

ERREUR ERREUR

Content-Encoding

(définie sur <ph type="x-smartling-placeholder"></ph> encodage pris en charge dans Apigee Edge)

ERREUR AUCUNE ERREUR
Transfer-Encoding ERREUR ERREUR
<ph type="x-smartling-placeholder">

Voici les causes possibles de cette erreur:

Cause Description Instructions de dépannage applicables
Corps de la réponse ou en-têtes avec réponse 204 du serveur backend Le serveur backend envoie une requête 204 No Content ou 205 Reset Content avec un corps de réponse et/ou un ou plusieurs en-têtes Content-Type ; Content-Encoding ou Transfer-Encoding. 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. Représentez le code d'erreur par rapport à l'heure. <ph type="x-smartling-placeholder">
  6. Sélectionnez une cellule avec le code d'erreur protocol.http.ResponseWithBody comme comme indiqué ci-dessous:

    ( Agrandir l'image)

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

    ( Agrandir l'image)

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

    ( Agrandir l'image)

  9. 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.ResponseWithBody.
  10. Si la Source de la défaillance a la valeur target et la Fault "Code", dont la valeur est protocol.http.ResponseWithBody, celle-ci indique que l'erreur s'est produite, car le serveur backend a envoyé une code d'état 204 No Content ou 205 Reset Content avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans la section Causes possibles.

Outil Trace

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

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

  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. Assurez-vous que l'option Show all FlowInfos (Afficher toutes les infos FlowInfos) est activée:

  3. Sélectionnez l'une des requêtes ayant échoué et examinez la trace.
  4. Parcourir les différentes phases de la trace et localiser l'origine de la défaillance s'est produit.
  5. 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:

    Scénario 1

    Scénario 1: le serveur backend répond avec le code d'état 204 No Content contenant le corps de la réponse et/ou l'un des en-têtes répertoriés dans Causes possibles.

    Notez les valeurs suivantes à partir de la trace:

    • erreur:Received 204 Response with message body
    • error.class::com.apigee.rest.framework.BadGateway

    Scénario 2

    Scénario 2: le serveur backend répond avec un code d'état 204 No Content contenant le corps de la réponse et/ou l'un des éléments répertoriés dans la section Causes possibles.

    Notez les valeurs suivantes à partir de la trace:

    • erreur:Received 205 Response with message body
    • error.class::com.apigee.rest.framework.BadGateway
  6. Accédez à la phase AX (Données analytiques enregistrées) dans la trace. et cliquez dessus.
  7. Faites défiler la page jusqu'à la section Phase Details (Détails de la phase), Error Headers (En-têtes d'erreur) et Déterminer les valeurs de X-Apigee-fault-code et X-Apigee-fault-source comme indiqué ci-dessous:

    ( Agrandir l'image)

  8. Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source are protocol.http.ResponseWithBody et target respectivement. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé une le code d'état 204 No Content ou 205 Reset Content avec le paramètre corps de réponse et/ou l'un des en-têtes mentionnés dans la section Causes possibles.
    Erreur Valeur
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

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 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. Effectuez une recherche pour voir s'il existe des erreurs 502 avec un code d'erreur protocol.http.ResponseWithBody 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.ResponseWithBody, puis déterminez la valeur de 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 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.ResponseWithBody
    X-Apigee-fault-source target
  5. Notez que les valeurs de X-Apigee-fault-code et X-Apigee-fault-source sont protocol.http.ResponseWithBody et target respectivement. Cela indique que l'erreur s'est produite, car le serveur backend a envoyé une le code d'état 204 No Content ou 205 Reset Content avec le paramètre corps de réponse et/ou l'un des en-têtes mentionnés dans la section Causes possibles.

Cause: corps de la réponse ou en-têtes avec réponse 204 du serveur backend

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 le code d'erreur est protocol.http.ResponseWithBody et La valeur Source de la défaillance est target, ce qui indique que le backend Le serveur a répondu avec l'état 204 No Content ou 205 Reset Content. avec le corps de la réponse et/ou l'un des en-têtes mentionnés dans Causes possibles.
  3. Pour vérifier que le serveur backend a bien envoyé un corps de réponse avec charge utile et/ou un ou plusieurs des en-têtes mentionnés dans la section Causes possibles, vous pouvez procédez comme suit:

    1. Si vous êtes un utilisateur de cloud public et que vous pouvez envoyer la même requête API au votre serveur backend directement depuis n'importe lequel de vos systèmes.

      <ph type="x-smartling-placeholder">
    2. Si vous êtes un utilisateur du Private Cloud, vous pouvez envoyer la même requête API au serveur backend directement depuis l'un des processeurs de messages associés au l'organisation et l'environnement où la défaillance est observée.
    3. Examinez la réponse reçue du serveur backend et vérifiez qu'elle contient un et/ou un ou plusieurs des en-têtes mentionnés ci-dessus. Si c’est le cas, alors c’est la cause de cette erreur.

      Exemple 1

      Exemple n° 1: Réponse 204 du serveur backend avec en-tête Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Dans cet exemple, le serveur backend a répondu par le code d'état 204 No Content et Content-Encoding: gzip

      Exemple 2

      Exemple n° 2: Réponse 204 du serveur backend avec en-tête Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Dans cet exemple, le serveur backend a répondu par le code d'état 204 No Content et Content-Length: 48

      Exemple 3

      Exemple n° 3: Réponse 205 du serveur backend avec corps de réponse

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      Dans cet exemple, le serveur backend a répondu par Code d'état 205 Reset Content avec corps de réponse This is a sample Response.

    4. Dans tous les exemples ci-dessus, le serveur backend a envoyé 204 No Content ou Code d'état 205 Reset Content avec le corps de la réponse et/ou l'un des en-têtes mentionnées dans la section Causes possibles.
    5. Par conséquent, Apigee Edge a envoyé le code d'état 502 Bad Gateway avec un code d'erreur. protocol.http.ResponseWithBody

Solution

Assurez-vous que le serveur backend respecte toujours les spécifications <ph type="x-smartling-placeholder"></ph> RFC 7231, section 6.3.6: 205Reset Content, lors de l'envoi de 204 No Content ou 205 Reset Content à Apigee Edge. Autrement dit, le serveur backend NE DOIT PAS envoyer les éléments suivants dans un 204 No Content ou Réponse 205 Reset Content:

  1. Corps de la charge utile de réponse
  2. Et l'un des en-têtes suivants: <ph type="x-smartling-placeholder">
      </ph>
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Spécification

Apigee Edge répond avec le code d'état 502 Bad Gateway et le code d'erreur protocol.http.ResponseWithBody si le serveur backend envoie une 204 No Content ou 205 Reset Content, mais n'est pas conforme aux spécifications RFC suivantes:

Spécification
<ph type="x-smartling-placeholder"></ph> RFC 7231, section 6.3.5: 204 Aucun contenu
<ph type="x-smartling-placeholder"></ph> RFC 7231, section 6.3.6: 205 Réinitialisez le contenu

Points clés à noter

La solution recommandée consiste à corriger le serveur backend pour qu'il envoie 204 No Content et le code d'état 205 Reset Content sans corps de réponse ni aucun des en-têtes : Content-Length, Content-Encoding et Transfer-Encoding et respectent les spécifications RFC 7231, section 6.3.5: 204 Aucun contenu et . RFC 7231, section 6.3.6: 205 Reset Content.

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
  • Exécutez la commande curl 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'environnement
  • Groupe de proxys d'API
  • Fichier de suivi des requêtes API
  • 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