502 Bad Gateway - TooBigLine

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.TooBigLine 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 el siguiente mensaje de error:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Causas posibles

Este error se produce si el tamaño de la línea de respuesta que envía el servidor de destino o backend a Apigee Edge como parte de la respuesta HTTP es mayor que el límite máximo en Apigee Edge.

Antes de analizar las posibles causas de este error, veamos qué significa la línea de respuesta y cómo verificar su tamaño.

Comprensión de la línea de respuesta

Una respuesta HTTP típica consta de tres partes:

  1. Línea de estado (denominada Línea de respuesta en Apigee)
  2. ( Conjunto de encabezados HTTP)
  3. [ Cuerpo ]

La línea de respuesta consta de tres partes: versión del protocolo seguida de un código de estado numérico y su frase textual asociada, como se muestra a continuación:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Cuando la aplicación del servidor de destino/backend envía una respuesta HTTP, la primera línea que se envía representa la Línea de respuesta como se describió antes. A continuación, los encabezados y el cuerpo o la carga útil de la respuesta.En la siguiente captura de pantalla de ejemplo, se muestra una solicitud curl típica, las partes Request y Response (junto con la línea de respuesta).

Información sobre el tamaño de la línea de respuesta

  1. En el ejemplo que se analizó anteriormente, la línea de inicio (primera línea) de la respuesta, que también se conoce como línea de respuesta, es la siguiente:

    HTTP/1.1 200 OK
    

    Esta línea de respuesta tiene un tamaño de ~15 bytes, ya que contiene 15 ASCII characters. Dado que está dentro del límite permitido en Apigee Edge, la respuesta se envía al cliente sin errores por parte de Apigee Edge.

  2. De manera similar, si observas faultstring en el mensaje de error que se muestra arriba, entonces, ese elemento contiene "response line size exceeding 2,048". Esto indica que la Línea de respuesta en la respuesta HTTP enviada por el servidor de destino o backend superó los 2,048 bytes.

Comprensión de una línea de respuesta amplia

Según la definición de la línea de estado (denominada línea de respuesta aquí) y las solicitudes y respuestas HTTP típicas, el tamaño sería mucho menor que el límite predeterminado definido de 2,000 en Apigee Edge, por lo que es posible que no alcancemos el límite. Sin embargo, aquí hay algunas situaciones posibles en las que puedes exceder este límite:

  1. El servidor de destino/backend no es un sistema HTTP. Podría responder con una respuesta que no es de HTTP.
  2. El servidor de destino o backend tiene problemas y envía una línea de respuesta larga como parte de la respuesta HTTP.

Obtén más información en Cómo obtener el protocolo de errores.http.TooBigLine, "Tamaño de la línea de respuesta superior a 2,048.

Estas son las posibles causas del error:

Causa Descripción Instrucciones de solución de problemas aplicables para
El tamaño de la línea de respuesta es mayor que el límite permitido El tamaño de la línea de respuesta que envía el servidor de destino/backend como parte de la respuesta HTTP a Apigee Edge es mayor que el límite permitido en Apigee Edge 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. Puedes seleccionar el filtro Proxy para acotar el código de falla.
  6. Traza el código de falla en función del valor Time.
  7. Selecciona una celda que tenga el código de falla protocol.http.TooBigLine, como se muestra a continuación:

    ( ver imagen más grande)

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

    ( ver imagen más grande)

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

  10. 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.TooBigLine.
  11. Si Fault Source tiene el valor target y Fault Code tiene el valor protocol.http.TooBigLine, eso indica que la respuesta HTTP del servidor de destino o backend tiene un tamaño de línea de respuesta mayor que el límite máximo permitido en Apigee Edge.

Herramienta de seguimiento

  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. Selecciona una de las solicitudes con errores y examina el seguimiento.
  3. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  4. 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:

    Observa los valores del error del seguimiento:

    • error: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Esto indica que Apigee Edge (componente de procesador de mensajes) genera el error en cuanto recibe la respuesta del servidor de backend debido a que el tamaño de la línea de respuesta supera el límite permitido.

  5. Verás el mensaje de error enviado al cliente en la fase Respuesta enviada al cliente, como se muestra a continuación:

    ( ver imagen más grande)

  6. Observa los valores del error del seguimiento:
    • Error: 502 Bad Gateway.
    • Contenido del error: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. También puedes navegar a la fase AX (datos registrados de Analytics) del seguimiento y hacer clic en ella para ver los detalles del error.

    ( ver imagen más grande)

    Ten en cuenta el valor de lo siguiente:

    Encabezados de la solicitud Valor
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Contenido del error : Cuerpo {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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 los errores HTTP 502.
  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 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 código X-Apigee-fault-code que coincide con el valor deX-Apigee-fault-code , determina el valor de X-Apigee-fault-code

    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.TooBigLine
    X-Apigee-fault-source target

Causa: El tamaño de la línea de respuesta supera el límite permitido.

Diagnóstico

  1. Determina el código de error 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 Fuente con errores tiene el valor target, esto indica que el tamaño de la línea de respuesta que envió la aplicación del servidor de destino/backend a Apigee es mayor que el límite permitido en Apigee Edge.
  3. Puedes validar que el tamaño de la línea de respuesta superó el límite permitido de 2 KB mediante uno de los siguientes métodos:

    Mensaje de error

    Para validar mediante el mensaje de error, haz lo siguiente:

    Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta la faultstring.

    Ejemplo de mensaje de error:

    "faultstring":"response line size exceeding 2,048"
    

    El valor faultstring anterior indica que el tamaño de la línea de respuesta superó el límite permitido de 2 KB.

    Solicitud real

    Para validar el uso de la solicitud real, sigue estos pasos:

    Si tienes acceso a la solicitud real realizada a la aplicación del servidor de destino o backend, realiza los siguientes pasos:

    1. Verifica el tamaño de la línea de respuesta
    2. Si descubres que el tamaño del URI supera el límite permitido en Apigee Edge, entonces esa es la causa del problema.

      Respuesta de muestra del servidor de destino/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
      

      En el caso anterior, la línea de respuesta HTTP/1.1 200 1111…<trimmed>...11111111 es superior a 2 KB, es decir, contiene más de 2 K caracteres ASCII.

      Si usas otro cliente, puedes revisar los registros del cliente y tratar de averiguar el tamaño de la línea de respuesta que se envía a Apigee Edge.

    Registros de Message Processor

    Para validar el uso de los registros de Message Processor, haz lo siguiente:

    Si eres un usuario de Private Cloud, puedes usar los registros de Message Processor para validar si el tamaño de la línea de respuesta superó el límite permitido en Apigee Edge.

    1. Determina el ID del mensaje de la solicitud con errores mediante 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. Busca el ID del mensaje en el registro de Message Processor:

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

    3. Encontrarás líneas de system.log similares a las siguientes:

      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)
      

      El texto message = response line size exceeding 2,048 en el mensaje de error anterior indica que el tamaño de la línea de respuesta es superior a 2 KB. Por lo tanto, Apigee Edge genera la excepción y muestra un código de estado 502 con el código de falla protocol.http.TooBigline a las aplicaciones cliente.

Resolución

Corregir tamaño

Opción 1 (recomendada]: Corrige la aplicación de servidor de destino/backend para que no envíe líneas de respuesta de tamaño superior al límite permitido

  1. Analiza el motivo por el que el cliente específico envía una línea de respuesta de tamaño superior al límite permitido, según se define en Límites.
  2. Si no lo deseas, modifica tu aplicación de servidor de destino o backend para que envíe una línea de respuesta de tamaño inferior al límite permitido.
  3. Si es conveniente y quieres enviar una línea de respuesta de un tamaño superior al límite permitido, ve a las siguientes opciones.

CwC

Opción 2: Usa la propiedad CwC para aumentar el límite de línea de respuesta

Apigee proporciona una propiedad CwC que le permite aumentar el límite de tamaño de la línea de respuesta. Para obtener más información, consulta Cómo establecer el límite de línea de respuesta en Message Processor.

Límites

Apigee espera que la aplicación cliente y el servidor de backend no envíen solicitudes ni líneas de respuesta cuyos tamaños sean mayores que el límite permitido, como se documenta en Límite de línea de solicitudes/respuestas en Límites de Apigee Edge.

  1. Si eres un usuario de la nube pública, el límite máximo de tamaño de solicitud y línea de respuesta es el que se documenta para Tamaño de solicitud/línea de respuesta en Límites de Apigee Edge.
  2. Si eres un usuario de la nube privada, es posible que hayas modificado el límite máximo predeterminado del tamaño de solicitud y de la línea de respuesta (aunque no sea una práctica recomendada). Para determinar el límite de tamaño máximo de la línea de respuesta, sigue las instrucciones que se indican en Cómo verificar el límite actual.

¿Cómo puedo verificar el límite actual?

En esta sección, se explica cómo verificar que la propiedad HTTPResponse.line.limit se haya actualizado con un valor nuevo en Message Processor.

  1. En la máquina del procesador de mensajes, busca la propiedad HTTPResponse.line.limit en el directorio /opt/apigee/edge-message-processor/conf y verifica qué valor se configuró como se muestra a continuación:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. El resultado de muestra del comando anterior es el siguiente:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. En el resultado de ejemplo anterior, observa que la propiedad HTTPResponse.line.limit se configuró con el valor 2k en http.properties.

    Esto indica que el límite del tamaño de la línea de respuesta configurado en Apigee para la nube privada es de 2 KB.

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 de la organización
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de seguimiento de las solicitudes a la API fallidas
  • Completa el comando curl que se usa para reproducir el error 502.
  • 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