502 Bad Gateway - ResponseWithBody

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Síntoma

La aplicación cliente obtiene un código de estado HTTP de 502 Bad Gateway con el código de error protocol.http.ResponseWithBody como respuesta a las llamadas a la API.

Mensaje de error

La aplicación cliente obtiene el siguiente código de respuesta:

HTTP/1.1 502 Bad Gateway

Además, es posible que veas uno de los siguientes mensajes de error:

{
   "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"
      }
   }
}

Causas posibles

Este error ocurre si la respuesta HTTP del servidor de backend a Apigee Edge es 204 No Content o 205 Reset Content, pero contiene el cuerpo de la respuesta o uno o más de los siguientes encabezados:

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

De acuerdo con las especificaciones RFC 7231, sección 6.3.5: 204 Sin contenido y RFC 7231, sección 6.3.6: Restablecer contenido 205, se espera que el servidor de origen no envíe contenido adicional como parte del cuerpo de la carga útil de respuesta con código de estado 204 No Content o 205 Reset Content. Los encabezados de respuesta, como Content-Length, Content-Encoding o Transfer-Encoding, indican el tamaño, el tipo o el formato de la carga útil de la respuesta.

Por lo tanto, Apigee Edge muestra un código de estado 502 Bad Gateway con el código de error protocol.http.ResponseWithBody al cliente en las siguientes circunstancias:

Código de estado del servidor de backend
La respuesta del servidor de backend contiene 204 No Content 205 Restablecer contenido
Cuerpo de la respuesta ERROR ERROR

Encabezado Content-Length

(establecido en un valor distinto de cero)

ERROR ERROR

Content-Encoding

(configurado en la codificación compatible en Apigee Edge)

ERROR SIN ERROR
Transfer-Encoding ERROR ERROR

A continuación, se muestran las posibles causas de este error:

Causa Descripción Instrucciones de solución de problemas aplicables para
Cuerpo de la respuesta o encabezados con respuesta 204 del servidor de backend El servidor de backend envía una respuesta 204 No Content o 205 Reset Content con un cuerpo de respuesta o uno o más encabezados Content-Type, Content-Encoding o Transfer-Encoding. Usuarios de la nube pública y privada de Edge

Pasos comunes de diagnóstico

Usa una de las siguientes herramientas o técnicas para diagnosticar este error:

Supervisión de API

Para diagnosticar el error con la supervisión de la API, sigue estos pasos:

  1. Accede a la IU de Apigee Edge como un usuario con el rol adecuado.
  2. Cambia a la organización en la que quieres investigar el problema.

  3. Navega a la página Analyze > API Monitoring > Investigate.
  4. Selecciona el período específico en el que observaste los errores.
  5. Traza el código de falla en función del valor Time.
  6. Selecciona una celda que tenga el código de falla protocol.http.ResponseWithBody, como se muestra a continuación:

    ( ver imagen más grande)

  7. Verás la información sobre el código de falla protocol.http.ResponseWithBody como se muestra a continuación:

    ( ver imagen más grande)

  8. Haz clic en Ver registros y expande la fila de la solicitud con errores.

    ( ver imagen más grande)

  9. En la ventana Registros, ten en cuenta los siguientes detalles:
    • Código de estado: 502
    • Fuente de la falla: target
    • Código de fallas: protocol.http.ResponseWithBody.
  10. Si Fuente de errores tiene el valor target y Código de fallas tiene el valor protocol.http.ResponseWithBody, eso indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en la sección Posibles causas.

Herramienta de seguimiento

Para diagnosticar el error con la herramienta Trace, sigue estos pasos:

  1. Habilita la sesión de seguimiento y realiza una de estas acciones:
    1. Espera a que ocurra el error 502 Bad Gateway.
    2. Si puedes reproducir el problema, realiza la llamada a la API y reproduce el error 502 Bad Gateway.
  2. Asegúrate de que la opción Show all FlowInfos esté habilitada:

  3. Selecciona una de las solicitudes con errores y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Por lo general, encontrarás el error en flowinfo Error justo después de la fase Request sent to target server, como se muestra a continuación:

    Situación 1

    Situación 1: El servidor de backend responde con el código de estado 204 No Content que contiene el cuerpo de la respuesta o uno de los encabezados enumerados en Causas posibles.

    Observa los valores de lo siguiente en el seguimiento:

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

    Situación 2

    Situación 2: El servidor de backend responde con el código de estado 204 No Content que contiene el cuerpo de la respuesta o uno de los encabezados enumerados en Causas posibles.

    Observa los valores de lo siguiente en el seguimiento:

    • error: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway.
  6. Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
  7. Desplázate hacia abajo hasta la sección Detalles de la fase, Encabezados de error y determina los valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:

    ( ver imagen más grande)

  8. Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source are protocol.http.ResponseWithBody y target, respectivamente. Esto indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.
    Error Valor
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

Para diagnosticar el error con los registros de acceso de NGINX, sigue estos pasos:

  1. Si eres un usuario de la nube privada, puedes usar los registros de acceso de NGINX para determinar la información clave de 502 Bad Gateway de HTTP.
  2. Verifica los registros de acceso de NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dónde: Se reemplazan ORG, ENV y PORT# por valores reales.

  3. Busca para ver si hay errores 502 con el código de error protocol.http.ResponseWithBody durante un período específico (si el problema ocurrió en el pasado) o si hay alguna solicitud que aún falla con 502.
  4. Si encuentras algún error 502 con el X-Apigee-fault-code que coincide con el valor de protocol.http.ResponseWithBody, determina el valor de X-Apigee-fault-source.

    Ejemplo de error 502 del registro de acceso de NGINX:

    La entrada de ejemplo anterior del registro de acceso de NGINX tiene los siguientes valores para X-Apigee-fault-code y X-Apigee-fault-source:

    Encabezados de respuesta Valor
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. Ten en cuenta que los valores de X-Apigee-fault-code y X-Apigee-fault-source son protocol.http.ResponseWithBody y target, respectivamente. Esto indica que el error se produjo porque el servidor de backend envió un código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.

Causa: Cuerpo de la respuesta o encabezados con respuesta 204 del servidor de backend

Diagnóstico

  1. Determina el código con fallas y la fuente de errores del error observado con la supervisión de la API, la herramienta de Trace o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
  2. Si Fault Code es protocol.http.ResponseWithBody y Fault Source tiene el valor target, esto indica que el servidor de backend respondió con un código de estado 204 No Content o 205 Reset Content con el cuerpo de respuesta o uno de los encabezados mencionados en Posibles causas.
  3. Para validar si el servidor de backend realmente envió un cuerpo de carga útil de respuesta o uno o más de los encabezados mencionados en Causas posibles, puedes realizar los siguientes pasos:

    1. Si eres un usuario de la nube pública y puedes realizar la misma solicitud a la API al servidor de backend directamente desde cualquiera de tus sistemas.

    2. Si eres un usuario de la nube privada, puedes realizar la misma solicitud a la API al servidor de backend directamente desde uno de los procesadores de mensajes asociados con la organización y el entorno específicos en los que se observa el error.
    3. Revisa la respuesta recibida del servidor de backend y verifica que contenga un cuerpo de carga útil de respuesta o uno o más de los encabezados mencionados anteriormente. Si es así, esa es la causa del error.

      Ejemplo 1

      Muestra n.o 1: Respuesta del servidor de backend 204 con encabezado de codificación de contenido

      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
      

      En esta muestra, el servidor de backend respondió con el código de estado 204 No Content y Content-Encoding: gzip.

      Muestra n.o 2

      Muestra n.o 2: Respuesta del servidor de backend 204 con el encabezado 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
      

      En esta muestra, el servidor de backend respondió con el código de estado 204 No Content y Content-Length: 48.

      Ejemplo 3

      Muestra n.o 3: Respuesta del servidor de backend 205 con cuerpo de la respuesta

      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
      

      En esta muestra, el servidor de backend respondió con el código de estado 205 Reset Content con el cuerpo de respuesta This is a sample Response..

    4. En todos los ejemplos anteriores, el servidor de backend envió el código de estado 204 No Content o 205 Reset Content con el cuerpo de la respuesta o uno de los encabezados mencionados en Causas posibles.
    5. Por lo tanto, Apigee Edge envió el código de estado 502 Bad Gateway con el código de error protocol.http.ResponseWithBody.

Resolución

Asegúrate de que el servidor de backend siempre cumpla con la especificación RFC 7231, sección 6.3.6: 205 Reset Content, cuando envíes la respuesta 204 No Content o 205 Reset Content a Apigee Edge. Es decir, el servidor de backend NO DEBE enviar lo siguiente como parte de una respuesta 204 No Content o 205 Reset Content:

  1. Cuerpo de la carga útil de la respuesta
  2. Cualquiera de los siguientes encabezados:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Especificación

Apigee Edge responde con el código de estado 502 Bad Gateway y el código de error protocol.http.ResponseWithBody si el servidor de backend envía una respuesta 204 No Content o 205 Reset Content, pero no cumple con las siguientes especificaciones de RFC:

Especificación
RFC 7231, sección 6.3.5: 204, sin contenido
RFC 7231, sección 6.3.6: 205 Restablecimiento de contenido

Puntos clave para tener en cuenta

La solución recomendada es corregir el servidor de backend para enviar los códigos de estado 204 No Content y 205 Reset Content sin cuerpo de respuesta y ninguno de los encabezados, Content-Length, Content-Encoding y Transfer-Encoding, y cumplir con las especificaciones RFC 7231, sección 6.3.5: 204, sin contenido y RFC 7231, sección 6.3.6: Restablecer contenido 205.

Si aún necesitas asistencia de la asistencia de Apigee, consulta Debes recopilar información de diagnóstico.

Se debe recopilar información de diagnóstico

Recopila la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:

Si eres un usuario de la nube pública, proporciona la siguiente información:

  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Completa el comando curl que se usa para reproducir el error 502.
  • Archivo de seguimiento para las solicitudes a la API

Si eres un usuario de la nube privada, proporciona la siguiente información:

  • Mensaje de error completo observado para las solicitudes con errores
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento para las solicitudes a la API
  • Registros de acceso de NGINX/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dónde: Se reemplazan ORG, ENV y PORT# por valores reales.

  • Registros del sistema del procesador de mensajes /opt/apigee/var/log/edge-message-processor/logs/system.log