502 Bad Gateway - DuplicateHeader

Estás viendo la documentación de Apigee Edge.
Ir a la documentación de Apigee X.
info

Síntoma

La aplicación cliente obtiene un código de estado HTTP 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 observes 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 se produce si un encabezado HTTP específico que no puede tener duplicados en Apigee Edge aparece más de una vez con los mismos valores o con valores diferentes como parte de la respuesta HTTP que envía el servidor de backend a Apigee Edge.

Según la RFC 7230, sección 3.2.2: Orden de los campos, un emisor 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 se defina como una lista separada por comas, [es decir, #(values)] o que el campo de encabezado sea una excepción conocida. Si Apigee Edge descubre que un 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 de backend, responde con 502 Bad Gateway y el código de error protocol.http.DuplicateHeader

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

  1. Accede a la IU de Apigee Edge como usuario con una función adecuada.
  2. Cambia a la organización en la que deseas investigar el problema.

  3. Navega a la página Analizar > Supervisión de API > Investigar.
  4. Selecciona el período específico en el que observaste los errores.
  5. Asegúrate de que el filtro Proxy esté configurado como Todos.
  6. Traza el Código de falla en función del Tiempo.
  7. Selecciona una celda que tenga el código de falla protocol.http.DuplicateHeader como se muestra a continuación:

    (aumentar el tamaño de la imagen)

  8. La información sobre el código de falla protocol.http.DuplicateHeader se muestra como se indica a continuación:

    (aumentar el tamaño de la imagen)

  9. Asegúrate de que el Código de estado sea 502 como se muestra en el ejemplo anterior.
  10. Haz clic en Ver registros y expande la fila de la solicitud con errores.
  11. En la ventana Registros, ten en cuenta los siguientes detalles:

    • Código de estado: 502
    • Fuente de falla: target
    • Código de falla: protocol.http.DuplicateHeader.
  12. La Fuente de falla es target, lo que indica que la respuesta del servidor de backend contenía encabezados duplicados.

Herramienta de Trace

Para diagnosticar el error con la herramienta de Trace, haz lo siguiente:

  1. Habilita la sesión de seguimiento y realiza una de las siguientes acciones:
    1. Espera a que se produzca el error 502 Bad Gateway.
    2. Si puedes reproducir el problema, realiza la llamada a la API y reproduce el 502 Bad Gateway error
  2. Asegúrate de que la opción Mostrar toda la información del flujo esté habilitada:

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

    (aumentar el tamaño de la imagen)

  6. Anota el valor del error del seguimiento.

    El seguimiento de muestra anterior muestra el error como Duplicate Header "Expires". Dado que el error es generado por Apigee después de que se envió la solicitud al servidor de backend, indica que el servidor de backend envió el encabezado Expires más de una vez.

  7. Navega a la fase AX (datos de estadísticas registrados) en el seguimiento y haz clic en ella.
  8. 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:

    (aumentar el tamaño de la imagen)

  9. Verás los valores de X-Apigee-fault-code y X-Apigee-fault-source como protocol.http.DuplicateHeader y target, lo que indica que este error se produce porque el servidor de backend pasó encabezados duplicados para el encabezado de respuesta Expires.
    Encabezados de respuesta Valor
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Verifica si usas el encadenamiento de proxies, es decir, si el servidor o el extremo de destino invoca otro proxy en Apigee.

    1. Para determinar esto, vuelve a la fase Solicitud enviada al servidor de destino. Haz clic en Mostrar Curl.

    2. Se abrirá la ventana Curl para la solicitud enviada al servidor de destino desde la que puedes determinar el alias de host del servidor de destino.

    3. Si el alias de host del servidor de destino apunta a un alias de host virtual, se trata de un encadenamiento de proxies. En este caso, debes repetir todos los pasos anteriores para el proxy encadenado hasta que determines qué está causando el error 502 Bad Gateway.
    4. Si el alias de host del servidor de destino apunta a tu servidor de backend, indica que tu servidor de backend envía los encabezados duplicados en la respuesta a Apigee.

NGINX

Para diagnosticar el error con los registros de acceso de NGINX, haz lo siguiente:

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

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

    Donde: ORG, ENV y PORT# se reemplazan por valores reales.

  3. Busca si hay errores 502 durante un período específico (si el problema ocurrió en el pasado) o si aún hay solicitudes que fallan con 502.
  4. Si encuentras errores 502 con el X-Apigee-fault-code que coincida con el valor de protocol.http.DuplicateHeader, entonces determina el valor de la X-Apigee-fault-source.

    Ejemplo de error 502 del registro de acceso de NGINX:

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

Causa: Encabezado duplicado en la respuesta

Diagnóstico

  1. Determina el Código de falla y la Fuente de falla del error observado con la Supervisión de API o los registros de acceso de NGINX, como se explica en Pasos comunes de diagnóstico.
  2. Si la Fuente de falla tiene el valor target, indica que la respuesta enviada por el servidor de destino contiene encabezados duplicados.
  3. Puedes determinar el encabezado real que se envía más de una vez como parte de la respuesta con uno de los siguientes métodos:

    Mensaje de error

    Usa el mensaje de error:

    1. Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta el faultstring. El faultstring contiene el nombre del encabezado que se envió más de una vez.

      Ejemplo de mensaje de error:

      "faultstring":"Duplicate Header \"Expires\""
    2. En el mensaje de error anterior, puedes ver que el encabezado Expires se envía más de una vez como se ve en el faultstring.

    Solicitud real

    Usa la solicitud real:

    1. Si no tienes acceso a la solicitud real realizada al servidor de destino, obtén el comando curl correspondiente en el paso 10.a y el paso 10.b de Usa la herramienta de Trace.
    2. Si tienes acceso a la solicitud real realizada a la aplicación del servidor de destino, sigue estos pasos:

      1. Realiza una llamada al servidor de destino.

        Ejemplo de solicitud 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
        
      2. Verifica la lista de encabezados que se ven en la respuesta.

        Ejemplo de respuesta 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 502 Bad Gateway error y el código de error: protocol.http.DuplicateHeader.

      3. Si el encabezado cuyo nombre aparece en el faultstring aparece más de una vez en la respuesta del servidor de backend, esa es la causa de este error. En el caso anterior, el encabezado Expires se envía más de una vez.

Solución

Cómo corregir la duplicación

Opción 1 [opción recomendada]: Corrige el servidor de backend para que no incluya encabezados duplicados

  1. Analiza el motivo por el que el servidor de backend específico envía el encabezado duplicado Expires y verifica si es correcto que los proxies de API lo acepten. En la mayoría de los casos, no será deseable según la especificación HTTP RFC7230.
  2. Si no es deseable, modifica la aplicación del servidor de destino para que no envíe encabezados duplicados. En el ejemplo analizado anteriormente, se observa que el encabezado Expires se envía dos veces con el mismo valor, lo que no es deseable. Para corregir el problema, asegúrate de que el servidor de destino pase el Expires encabezado solo una vez.
  3. Si es deseable y quieres permitir los encabezados duplicados, ve a la Opción 2: Usa la propiedad CwC.

CwC

Opción 2: Usa la propiedad CwC

Apigee proporciona una propiedad CwC HTTPHeader.<HeaderName> ,que permite que las aplicaciones cliente y los servidores de destino envíen encabezados duplicados a los proxies de API en Apigee Edge.

Propiedad CwC Valores
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Por ejemplo, la siguiente propiedad se puede configurar en los procesadores de mensajes para permitir duplicados y valores múltiples para el encabezado Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Si eres usuario de la nube privada, puedes configurar la propiedad para evitar que Apigee Edge genere un error 502 Bad Gateway, incluso si la solicitud contiene encabezados duplicados con la guía práctica para configurar procesadores de mensajes para usar encabezados duplicados.
  2. Si eres usuario de la nube pública, comunícate con Asistencia de Apigee Edge para configurar esta propiedad para tu organización.

Especificación

Apigee responde con la respuesta de error 502 Bad Gateway, ya que espera que el servidor de backend se comporte según las siguientes especificaciones de RFC:

Especificación
RFC 7230, sección 3.2.2: Orden de los campos
RFC 7230, sección 3.2: Campos de encabezado

Si aún necesitas asistencia de Asistencia de Apigee, consulta 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 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
  • Comando curl completo que se usó para reproducir el error 502
  • Archivo de seguimiento de las solicitudes a la API

Si eres 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 de las solicitudes a la API
  • Registros de acceso de NGINX:

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

    Donde: ORG, ENV y PORT# se reemplazan por valores reales.

  • Registros del sistema del Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log