502 Bad Gateway - TooBigLine

Estás viendo la documentación de Apigee Edge.
Ve a 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, puedes observar 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 enviado por el servidor de destino o backend a Apigee El perímetro como parte de la respuesta HTTP es mayor que el máximo permitido. límite en Apigee Edge.

Antes de analizar las posibles causas de este error, veamos cuál es la línea de respuesta y cómo comprobar su tamaño.

Comprensión de la línea de respuesta

Una respuesta HTTP típica consta de tres partes:

  1. Estado-Línea (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 valor numérico código de estado y la 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 o backend envía una respuesta HTTP, la primera línea enviado representa la línea de respuesta, como se describió anteriormente. Le sigue el encabezados y el cuerpo/carga útil de la respuesta.En la siguiente captura de pantalla de ejemplo, se muestra curl, las partes Request y Response (junto con las línea de respuesta).

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

  1. En el ejemplo anterior, la línea start (primera línea) en la respuesta también llamada 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 este se encuentra dentro del límite permitido en Apigee Edge, la respuesta se devuelve al cliente sin ninguna errores de Apigee Edge.

  2. Del mismo modo, si observas faultstring en El mensaje de error que se muestra arriba contiene "response line size exceeding 2,048". Esto indica que la línea de respuesta de la respuesta HTTP que envió el servidor de destino o backend supera los 2,048 bytes.

Comprensión de la línea de respuesta extensa

Según la definición de Estado-Línea (aquí aquí denominada Línea de respuesta) y solicitudes HTTP típicas el tamaño sería mucho menor que el límite predeterminado definido de 2 K en Apigee Edge, por lo que es posible que no alcanzar el límite. Sin embargo, estas son algunas situaciones posibles en las que podrías exceder este límite:

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

Obtén más información sobre este tema en Se obtiene el error protocolo.http.TooBigLine, “tamaño de la línea de respuesta que supera 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 supera el límite permitido El tamaño de la línea de respuesta que envía el servidor de destino o backend como parte del La respuesta HTTP a Apigee Edge es mayor que la límite permitido en Apigee Edge Usuarios perimetrales de nubes públicas y privadas

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 API, haz lo siguiente:

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

  3. Navega a Analyze > Supervisión de API > Investigar.
  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 Código de error en Tiempo.
  7. Selecciona una celda que tenga el código de error protocol.http.TooBigLine como 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, observa los siguientes detalles:
    • Código de estado: 502
    • Fuente del error: target
    • Código de error: protocol.http.TooBigLine.
  11. Si la Fault Source tiene el valor target y la Fault Code tiene el valor protocol.http.TooBigLine, lo que indica la respuesta HTTP del servidor de destino/ 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:
    1. Espera a que se produzca el error 502 Bad Gateway. o
    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 fallidas y examina el seguimiento.
  3. Navega por las diferentes fases del seguimiento y localiza dónde se produjo la falla para determinar si se produjo un error.
  4. Por lo general, encontrarás el error en flowinfo Error después de la fase Solicitud enviada al servidor de destino, como se muestra a continuación:

    Toma nota de 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) arroja el error como en cuanto recibe la respuesta del servidor de backend debido al tamaño de la línea de respuesta que superen el límite permitido.

  5. En el campo Response Sent to Client, como se muestra a continuación:

    ( ver imagen más grande)

  6. Toma nota de 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 de Analytics registrados) en el seguimiento. y haz clic en él 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, haz lo siguiente:

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

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

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

  3. Realiza una búsqueda para ver si hay algún error 502 durante una duración específica (si el problema ocurrió en el pasado) o si todavía hay solicitudes que fallan 502
  4. Si encuentras algún error 502 con el código X-Apigee-fault-code coincide con el valor de protocol.http.TooBigLine y, luego, determina el valor de X-Apigee-fault-source.

    La entrada de muestra 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 es superior al límite permitido

Diagnóstico

  1. Determina el código de error y la fuente de errores del error observado con la API. Monitoring, la herramienta de seguimiento o los registros de acceso de NGINX como se explica en Pasos comunes del diagnóstico.
  2. Si la Fuente del error tiene el valor target, esto indica que El tamaño de la línea de respuesta que envía la aplicación del servidor de destino o 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 haya superado el límite permitido de 2 KB con una de los siguientes métodos:

    Mensaje de error

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

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

    Ejemplo de mensaje de error:

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

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

    Solicitud real

    Para validar con la solicitud real, haz lo siguiente:

    Si tienes acceso a la solicitud real que se realizó al servidor de destino o backend y realiza los siguientes pasos:

    1. Verifica el tamaño de la línea de respuesta
    2. Si observas que el tamaño del URI es mayor que el límite permitido en Apigee Edge, esa es la causa del el 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, el HTTP/1.1 200 1111…<trimmed>...11111111 de la línea de respuesta es mayor que 2 KB, es decir, contiene más de 2,000 caracteres ASCII.

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

    Registros del procesador de mensajes

    Para realizar la validación con los registros de Message Processor, haz lo siguiente:

    Si eres un usuario de la nube privada, puedes usar los registros del procesador de mensajes para lo siguiente: valide si el tamaño de la línea de respuesta superó el límite permitido en Apigee Edge.

    1. Determinar el ID del mensaje de la solicitud con errores usando la supervisión de API, la herramienta Trace o NGINX, como se explica en Pasos de diagnóstico comunes.
    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 ejemplo anterior indica que el tamaño de la línea de respuesta supera los 2 KB. Por lo tanto, Apigee Edge arroja la excepción y muestra un código de estado 502 con el código de falla protocol.http.TooBigline a las aplicaciones cliente.

Solución

Corregir tamaño

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

  1. Analiza el motivo por el cual el cliente específico envía más una línea de respuesta de tamaño. que el límite permitido, según se define en Límites.
  2. Si no es la deseada, modifica tu aplicación de servidor de destino o backend para que envía una línea de respuesta de un tamaño inferior al límite permitido.
  3. Si es deseable y desea enviar una línea de respuesta de un tamaño mayor que el límite permitido, ve a las siguientes opciones.

CwC

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

Apigee proporciona un CwC que le permite aumentar el límite de tamaño de la línea de respuesta. Para obtener más información, consulta Establece 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 superiores al límite permitido que se documenta para Límite de líneas de solicitud/respuesta en Límites de Apigee Edge.

  1. Si eres usuario de la nube pública, el límite máximo de solicitudes y El tamaño de la línea de respuesta es el que se documenta para Tamaño de la línea de respuesta/solicitud en Límites de Apigee Edge.
  2. Si eres un usuario de la nube privada, es posible que hayas modificado el valor máximo predeterminado límite para el tamaño de la solicitud y la línea de respuesta (aunque no es una práctica recomendada). Para determinar el límite máximo de tamaño de la línea de respuesta, siga las instrucciones 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 tenga con un nuevo valor en Message Processors.

  1. En la máquina del procesador de mensajes, busca la propiedad. HTTPResponse.line.limit en directorio /opt/apigee/edge-message-processor/conf y verifica en ve 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 estableció con el valor 2k en http.properties.

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

Si aún necesitas ayuda del equipo de asistencia de Apigee, ve a Se debe recopilar información de diagnóstico.

Se debe recopilar información de diagnóstico

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

Si eres 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 de 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 fallidas
  • Nombre de la organización
  • Nombre del entorno
  • Paquete de proxy de API
  • Archivo de registro de las solicitudes a la API con errores
  • 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: ORG, ENV y PORT# se reemplazan por valores reales.

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