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.TooBigBody
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":"Body buffer overflow", "detail":{ "errorcode":"protocol.http.TooBigBody" } } }
Causas posibles
Este error ocurre si el tamaño de la carga útil que envió el servidor de destino o backend a Apigee Edge como parte de la respuesta HTTP supera el límite permitido en Apigee Edge.
Estas son las posibles causas del error:
Causa | Descripción | Instrucciones de solución de problemas aplicables para |
---|---|---|
El tamaño de la carga útil de la respuesta es mayor que el límite permitido | El tamaño de la carga útil que envía el servidor de destino/backend como parte de la respuesta HTTP a Apigee supera el límite permitido en Apigee. | Usuarios de la nube pública y privada de Edge |
El tamaño de la carga útil de la respuesta supera el límite permitido después de la descompresión | El tamaño de la carga útil que envía el servidor de destino o backend como parte de la respuesta HTTP a Apigee en formato comprimido supera el límite permitido cuando lo descomprime Apigee. | 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:
- Accede a la IU de Apigee Edge como un usuario con el rol adecuado.
Cambia a la organización en la que quieres investigar el problema.
- Navega a la página Analyze > API Monitoring > Investigate.
- Selecciona el período específico en el que observaste los errores.
- Puedes seleccionar el filtro Proxy para acotar el código de falla.
- Traza el código de falla en función del valor Time.
Selecciona una celda que tenga el código de falla
protocol.http.TooBigBody
, como se muestra a continuación:Verás la información sobre el código de falla
protocol.http.TooBigBody
como se muestra a continuación:Haz clic en Ver registros y expande la fila de la solicitud con errores.
- 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.TooBigBody
.
- Código de estado:
- Si Fault Source tiene el valor
target
y Fault Code tiene el valorprotocol.http.TooBigBody
, eso indica que la respuesta HTTP del servidor de destino o backend tiene un tamaño de carga útil de respuesta mayor que el límite permitido en Apigee Edge.
Trace
Para diagnosticar el error con la herramienta Trace, sigue estos pasos:
- Habilita la sesión de seguimiento y realiza una de estas acciones:
- Espera a que ocurra el error
502 Bad Gateway
. - Si puedes reproducir el problema, realiza la llamada a la API y reproduce el error
502 Bad Gateway
.
- Espera a que ocurra el error
- Selecciona una de las solicitudes con errores y examina el seguimiento.
- Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
Navega a la fase Error justo después de la fase ResponseReceived from target server, como se muestra a continuación:
Observa los valores del error del seguimiento:
- error:
Body buffer overflow
- 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 carga útil excede el límite permitido.
- error:
Verás el error en la fase Response Sent to Client (Respuesta enviada al cliente), como se muestra a continuación:
- Anota los valores del error del seguimiento. En el seguimiento de ejemplo anterior, se muestra lo siguiente:
- error:
502 Bad Gateway
- Contenido del error:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- error:
Dirígete a la fase Respuesta recibida del servidor de destino como se muestra a continuación para diferentes situaciones:
Sin comprimir
Situación 1: Carga útil de respuesta enviada sin comprimir
Observa los valores del error del seguimiento:
- Respuesta recibida del servidor de destino:
200 OK
- Content-Length (de la sección Response Headers): ~11 MB
Comprimido
Situación 2: La carga útil de la solicitud se envió en formato comprimido
Observa los valores del error del seguimiento:
- Respuesta recibida del servidor de destino:
200 OK
- Content-Encoding: Si ves este encabezado en la sección Encabezados de respuesta, anota el valor. Por ejemplo, en este ejemplo, el valor es
gzip
.
- Respuesta recibida del servidor de destino:
Observa el Cuerpo debajo de la sección Contenido de la respuesta:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella para ver los detalles relacionados.
- Desplázate hacia abajo en Detalles de la fase hasta la sección Lectura de variables y determina los valores de
target.received.content.length
, que indican lo siguiente:- El tamaño real de la carga útil de la respuesta cuando se envía en formato sin comprimir y
- El tamaño de la carga útil de respuesta después de la descompresión por parte de Apigee, cuando la carga útil se envía en formato comprimido. Siempre será el mismo que el valor del límite permitido (10 MB) en este caso.
Sin comprimir
Situación 1: Carga útil de respuesta enviada sin comprimir
Ten en cuenta el valor de target.received.content.length:
Encabezados de la solicitud Valor target.received.content.length ~11 MB Comprimido
Situación 2: La carga útil de la solicitud se envió en formato comprimido
Ten en cuenta el valor de target.received.content.length:
Encabezados de la solicitud Valor target.received.content.length ~10 MB En la siguiente tabla, se explica por qué Apigee muestra el error
502
en las dos situaciones según el valor de target.received.content.length:Situación Valor de target.received.content.length Motivo de la falla Carga útil de respuesta en formato sin comprimir ~11 MB Tamaño > límite permitido de 10 MB Carga útil de respuesta en formato comprimido ~10 MB Se superó el límite de tamaño tras la descompresión
NGINX
Para diagnosticar el error con los registros de acceso de NGINX, sigue estos pasos:
- 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
. 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.
- 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 con502
. - Si encuentras algún error
502
en el que X-Apigee-fault-code coincida con el valor deprotocol.http.TooBigBody
, determina el valor de X-Apigee-fault-codeEjemplo 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-fall-code y X-Apigee-fault-source:
Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source target
Causa: El tamaño de la carga útil de la respuesta supera el límite permitido.
Diagnóstico
- Determina el código de falla, la fuente de la falla y el tamaño de la carga útil de la respuesta del error observado con la supervisión de la API, la herramienta Trace o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico de la situación n.o 1.
- Si la fuente de errores tiene el valor
target
, esto indica que el tamaño de la carga útil de la respuesta que envía el servidor de destino/backend a Apigee es mayor que el límite permitido en Apigee Edge. - Verifica el Tamaño de la carga útil de la respuesta según lo determinado en el paso 1.
- Si el tamaño de la carga útil supera el límite permitido de 10 MB, esa es la causa del error.
- Si el límite permitido de tamaño de la carga útil es de alrededor de 10 MB, es posible que la carga útil de respuesta se pase en formato comprimido. Ve a Causa: El tamaño de la carga útil de la respuesta supera el límite permitido después de la descompresión.
- Para validar que el tamaño de la carga útil de la respuesta sea superior al límite permitido de 10 MB, verifica la respuesta real mediante los siguientes pasos:
- Si no tienes acceso a la solicitud real realizada al servidor de destino o backend, ve a Resolución.
- Si tienes acceso a la solicitud real realizada al servidor de destino o backend, realiza los siguientes pasos:
- Si eres un usuario de nube pública o nube privada, realiza una solicitud directamente al servidor de backend desde el servidor de backend o desde cualquier otra máquina desde la que puedas realizar la solicitud al servidor de backend.
- Si eres un usuario de la nube privada, también puedes realizar la solicitud al servidor de backend desde uno de los procesadores de mensajes.
- Verifica el tamaño de la carga útil que se pasó en la respuesta en el encabezado Content-Length.
- Si descubres que el tamaño de la carga útil supera el límite permitido en Apigee Edge, entonces esa es la causa del problema.
Respuesta de muestra del servidor de 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>
En el ejemplo anterior, puedes ver que
Content-Length: 11534336 (which is ~11 MB)
, que es la causa de este error, ya que supera el límite permitido en Apigee Edge.
Resolución
Consulta Resolución.
Causa: El tamaño de la carga útil de la respuesta supera el límite permitido después de la descompresión.
Si la carga útil de respuesta se envía en formato comprimido y el encabezado de respuesta
Content-Encoding
se establece en gzip,
Apigee descomprime la carga útil
de respuesta. Durante el proceso de descompresión, si Apigee descubre que el tamaño de la carga útil es mayor que el límite permitido en Apigee Edge, detiene la descompresión adicional y responde de inmediato con 502 Bad Gateway
y el código de error protocol.http.TooBigBody
.
Diagnóstico
- Determina el código con fallas, la fuente de errores y el tamaño de la carga útil de respuesta del error observado con la supervisión de la API, la herramienta de seguimiento o los registros de NGINX Access, como se explica en Pasos comunes del diagnóstico en la situación 2.
- Si Fuente de errores tiene el valor
target
, esto indica que el tamaño de la carga útil de la respuesta que envió la aplicación de destino o backend a Apigee es mayor que el límite permitido en Apigee Edge. - Verifica el Tamaño de la carga útil de la respuesta según lo determinado en el paso 1.
- Si el tamaño de la carga útil supera el límite permitido de 10 MB, esa es la causa del error.
- Si el límite permitido de tamaño de la carga útil es de aproximadamente 10 MB, es posible que la carga útil de respuesta se pase en formato comprimido. En este caso, comprueba el tamaño sin comprimir de la carga útil de respuesta comprimida.
- Puedes validar si la respuesta del destino o backend se envió en formato comprimido y el tamaño sin comprimir era mayor que el límite permitido mediante uno de los siguientes métodos:
Trace
Con la herramienta Trace:
- Si capturaste un seguimiento para la solicitud con errores, consulta los pasos que se detallan en Seguimiento y
- Determinar el valor de target.received.content.length
- Verifica si la solicitud del cliente contenía el encabezado Content-Encoding:
gzip
.
- Si el valor de target.received.content.length está alrededor del límite permitido de 10 MB y el encabezado de respuesta Content-Encoding:
gzip
, esa es la causa de este error.
Solicitud real
Usa solicitudes reales:
- Si no tienes acceso a la solicitud real realizada al servidor de destino o backend, ve a Resolución.
- Si tienes acceso a la solicitud real realizada al servidor de destino o backend, realiza los siguientes pasos:
- Verifica el tamaño de la carga útil que se pasó en la respuesta junto con el encabezado
Content-Encoding
enviado en la respuesta. - Si descubres que el encabezado de respuesta
Content-Encoding
está configurado comogzip
y el tamaño de la carga útil sin comprimir supera el límite permitido en Apigee Edge, esa es la causa del error.Respuesta de muestra recibida del servidor de 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>
En el caso anterior, se envía el encabezado
Content-Encoding: gzip
, y el tamaño del archivotestzippedfile.gz
en la respuesta es menor que el límite. Sin embargo, el tamaño del archivo sin comprimirtestzippedfile
era de aproximadamente 15 MB.
- Verifica el tamaño de la carga útil que se pasó en la respuesta junto con el encabezado
Registros de Message Processor
Usa registros de Message Processor:
- Si eres un usuario de la nube privada, puedes usar los registros de Message Processor para determinar la información clave de los errores HTTP
502
. Verifica los registros de Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log
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 con502
. Puedes usar las siguientes strings de búsqueda:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Encontrarás líneas de
system.log
similares a las que se muestran a continuación (TotalRead
ychunkCount
pueden variar en tu caso):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)
Durante el proceso de descompresión, tan pronto como Message Processor determina que el total de bytes de lectura es superior a 10 MB, se detiene y se imprime la siguiente línea:
Message is too large. TotalRead 10489856 chunkCount 2571
Implica que el tamaño de carga útil de la respuesta es superior a 10 MB y Apigee arroja el error cuando el tamaño comienza a superar el límite de 10 MB con el código de falla como
protocol.http.TooBigBody
.
- Si capturaste un seguimiento para la solicitud con errores, consulta los pasos que se detallan en Seguimiento y
Resolución
Corregir tamaño
Opción 1 (recomendada]: Corrige la aplicación del servidor de destino para que no envíe un tamaño de carga útil que exceda el límite de Apigee
- Analiza el motivo por el que el servidor de destino específico envía una respuesta o un tamaño de carga útil que supere el límite permitido en Límites.
- Si no lo deseas, modifica la aplicación del servidor de destino para que envíe un tamaño de respuesta / carga útil inferior al límite permitido.
- Si es conveniente y quieres enviar una respuesta o carga útil que supere el límite permitido, ve a las siguientes opciones.
Patrón de URL firmada
Opción 2 (recomendada]: Usa el patrón de URLs firmadas dentro de un JavaReferencia de Apigee
Para cargas útiles de más de 10 MB, Apigee recomienda usar un patrón de URL firmada dentro de un JavaReferencia de Apigee, como se ilustra en el ejemplo Edge Prompt: Signed URL Generator de GitHub.
Transmisión
Opción 3: Usa la transmisión
Si el proxy de tu API necesita manejar solicitudes o respuestas muy grandes, puedes habilitar la transmisión en Apigee.
CwC
Opción 4: Usa la propiedad CwC para aumentar el límite del búfer
Esta opción solo debe usarse cuando no puedes usar ninguna de las opciones recomendadas, ya que podría haber problemas de rendimiento si se aumenta el tamaño predeterminado.
Apigee proporciona una propiedad CwC que permite aumentar el límite de tamaño de la carga útil de solicitudes y respuestas. Para obtener más información, consulta Cómo establecer el límite de tamaño del mensaje en el router o el procesador de mensajes.
Límites
Apigee espera que la aplicación cliente y el servidor de backend no envíen tamaños de carga útil mayores que el límite permitido, como se documenta para
Request/response size
en
Límites de Apigee Edge.
- Si eres un usuario de la nube pública, el límite máximo de tamaño de la carga útil de solicitudes y respuestas es el que se documenta para
Request/response size
en Límites de Apigee Edge. - Si eres un usuario de la nube privada, es posible que hayas modificado el límite máximo predeterminado para el tamaño de la carga útil de solicitudes y respuestas (aunque no sea una práctica recomendada). Para determinar el límite máximo de tamaño de la carga útil de la solicitud, 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.body.buffer.limit
se haya actualizado con un valor nuevo en Message Processor.
En la máquina del procesador de mensajes, busca la propiedad
HTTPResponse.body.buffer.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.body.buffer.limit" /opt/apigee/edge-message-processor/conf
El resultado de muestra del comando anterior es el siguiente:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
En el resultado de ejemplo anterior, observa que la propiedad
HTTPResponse.body.buffer.limit
se configuró con el valor10m
enhttp.properties
.Esto indica que el límite del tamaño de la carga útil de la solicitud configurada en Apigee para la nube privada es de 10 MB.
Si aún necesitas asistencia de la asistencia de Apigee, ve a Se debe 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
- Resultado completo de la respuesta desde el servidor de destino/backend junto con el tamaño de la carga útil
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
- Resultado completo de la respuesta desde el servidor de destino/backend junto con el tamaño de la carga útil
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