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.DuplicateHeader
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 un mensaje de error similar al que se muestra a continuación:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
Causas posibles
Este error ocurre si un encabezado HTTP específico que no puede tener duplicados en Apigee Edge aparece más de una vez con valores iguales o diferentes, como parte de la respuesta HTTP que envía el servidor de backend a Apigee Edge.
Según
RFC 7230, sección 3.2.2: Orden de campos, un remitente NO DEBE generar varios campos
de encabezado con el mismo nombre de campo en un mensaje, a menos que el valor de campo completo para ese
campo de encabezado esté definido como una lista. #(values)] o el campo del encabezado es una excepción conocida. Si Apigee Edge detecta que un mismo encabezado específico, que no puede tener duplicados, se envía más de una vez en la respuesta HTTP que envía el servidor de destino o backend,
responde con 502 Bad Gateway
y el código de error
protocol.http.DuplicateHeader
A continuación, se muestran las posibles causas de este error:
Causa | Descripción | Instrucciones de solución de problemas aplicables para |
---|---|---|
Encabezado duplicado en la respuesta | La respuesta del servidor de backend contiene encabezados duplicados. | 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.
- Asegúrate de que el filtro Proxy esté configurado en Todos.
- Traza el código de falla en función del valor Time.
Selecciona una celda que tenga el código de falla
protocol.http.DuplicateHeader
, como se muestra a continuación:A continuación, se muestra información sobre el código de falla
protocol.http.DuplicateHeader
:- Asegúrate de que el Código de estado sea
502
, como se muestra en el ejemplo anterior. - Haz clic en Ver registros y expande la fila de la solicitud con errores.
En la ventana Registros, observa los siguientes detalles:
- Código de estado:
502
- Fuente de la falla:
target
- Código de fallas:
protocol.http.DuplicateHeader
.
- Código de estado:
- La Fuente con errores es
target
, lo que indica que la respuesta del servidor de backend contenía encabezados duplicados.
Herramienta de seguimiento
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
o - Si puedes reproducir el problema, realiza la llamada a la API y reproduce el error
502 Bad Gateway
.
- Espera a que ocurra el error
Asegúrate de que la opción Show all Flow infos esté habilitada:
- 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.
Por lo general, encontrarás el error en un flujo después de la fase Solicitud enviada al servidor de destino, como se muestra a continuación:
Observa el valor del error del seguimiento.
El seguimiento de muestra anterior muestra el error como
Duplicate Header "Expires"
. Dado que Apigee genera el error después de que la solicitud se envió al servidor de backend, indica que el servidor de backend envió el encabezadoExpires
más de una vez.- Navega a la fase AX (datos registrados de Analytics) en el seguimiento y haz clic en ella.
Desplázate hacia abajo hasta la sección Detalles de la fase: Encabezados de respuesta y determina los valores de X-Apigee-fault-code y X-Apigee-fault-source como se muestra a continuación:
- Verás los valores de X-Apigee-fault-code y X-Apigee-fault-source como
protocol.http.DuplicateHeader
ytarget
, lo que indica que este error se produce porque el servidor de backend pasó encabezados duplicados para el encabezado de respuestaExpires
.Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Verifica si usas el encadenamiento de proxy, es decir, si el servidor o el extremo de destino invoca a otro proxy en Apigee.
Para determinar esto, regresa a la fase Solicitud enviada al servidor de destino. Haz clic en Mostrar rizos.
Se abrirá la ventana Curl for Request Sent to Target Server, desde la cual puedes determinar el alias del host del servidor de destino.
- Si el alias del host del servidor de destino apunta a un alias de host virtual, es un encadenamiento de proxy. En este caso, debes repetir todos los pasos anteriores para el proxy en cadena hasta determinar qué está causando el error
502 Bad Gateway
. - Si el alias del host del servidor de destino apunta a tu servidor de backend, esto indica que este envía los encabezados duplicados en la respuesta a Apigee.
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
con X-Apigee-fault-code que coincida con el valor deX-Apigee-fault-code , 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-fault-code y X-Apigee-fault-source:
Encabezados de respuesta Valor X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Causa: encabezado duplicado en la respuesta
Diagnóstico
- Determina el código de error y la fuente de errores del error observado con la supervisión de la API o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
- Si Fuente con errores tiene el valor
target
, esto indica que la respuesta enviada por el servidor de destino contiene encabezados duplicados. Puedes determinar el encabezado real que se envía más de una vez como parte de la respuesta mediante uno de los siguientes métodos:
Mensaje de error
Uso del mensaje de error:
Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta la
faultstring
. Elfaultstring
contiene el nombre del encabezado que se envió más de una vez.Ejemplo de mensaje de error:
"faultstring":"Duplicate Header \"Expires\""
- En el mensaje de error anterior, puedes ver que el encabezado
Expires
se envía más de una vez, como se ve enfaultstring
.
Solicitud real
Usa la solicitud real:
- Si no tienes acceso a la solicitud real realizada al servidor de destino, obtén el comando
curl
correspondiente de los pasos 10.a y 10.b de Usa la herramienta de seguimiento. Si tienes acceso a la solicitud real realizada a la aplicación del servidor de destino, realiza los siguientes pasos:
Realiza una llamada al servidor de destino.
Solicitud de muestra para el servidor de destino que se usa en este ejemplo:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
Verifica la lista de encabezados que se ven en la respuesta.
Respuesta de muestra del servidor de destino que se usa en este ejemplo:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
En la solicitud de ejemplo anterior, el encabezado
Expires
se envía más de una vez. Por lo tanto, esta solicitud falla con el error502 Bad Gateway
y el código de errorprotocol.http.DuplicateHeader
.Si el encabezado cuyo nombre aparece en
faultstring
aparece más de una vez en la respuesta del servidor de backend, entonces esa es la causa del error. En el caso anterior, el encabezadoExpires
se envía más de una vez.
Resolución
Corregir duplicación
Opción 1 (opción recomendada): Corrige el servidor de backend para que no incluya encabezados duplicados
- Analiza el motivo por el que el servidor de backend específico envía el encabezado duplicado
Expires
y verifica si está bien que los proxies de API lo acepten. En la mayoría de los casos, no será conveniente según la especificación HTTP RFC7230. - Si no lo deseas, modifica la aplicación de tu servidor de destino para que no envíe encabezados duplicados.
En el ejemplo anterior, se observa que el encabezado
Expires
se envía dos veces con el mismo valor, lo cual no es conveniente. Para solucionar el problema, asegúrate de que el servidor de destino pase el encabezadoExpires
solo una vez. - Si es conveniente y quieres permitir los encabezados duplicados, ve a Opción 2: Cómo usar la propiedad CwC.
CwC
Opción 2: Mediante la propiedad CwC
Apigee proporciona una propiedad HTTPHeader.<HeaderName>
de CwC ,que permite que las aplicaciones cliente y los servidores de destino envíen encabezados duplicados a los proxies de API en Apigee Edge.
Propiedad de CwC | Valores |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Por ejemplo, se puede configurar la siguiente propiedad en Message Processor para permitir duplicados y varios valores en el encabezado Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Si eres un usuario de Private Cloud, puedes configurar la propiedad para evitar que Apigee Edge genere un error
502 Bad Gateway
, incluso si la solicitud contiene encabezados duplicados mediante la guía práctica Configura Message Processor para usar encabezados duplicados. - Si eres un usuario de la nube pública, comunícate con la asistencia de Apigee Edge para configurar esta propiedad en tu organización.
Especificación
Apigee responde con la respuesta de error 502 Bad Gateway
, ya que se espera que el servidor de backend se comporte de acuerdo con las siguientes especificaciones de RFC:
Especificación |
---|
RFC 7230, sección 3.2.2: Orden de campo |
RFC 7230, sección 3.2: Campos de encabezado |
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 error502
. - 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