502 Bad Gateway - DuplicateHeader

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:

  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. Asegúrate de que el filtro Proxy esté configurado en Todos.
  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.DuplicateHeader, como se muestra a continuación:

    (aumentar el tamaño de la imagen)

  8. A continuación, se muestra información sobre el código de falla protocol.http.DuplicateHeader:

    (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, observa los siguientes detalles:

    • Código de estado: 502
    • Fuente de la falla: target
    • Código de fallas: protocol.http.DuplicateHeader.
  12. 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:

  1. Habilita la sesión de seguimiento y realiza una de estas acciones:
    1. Espera a que ocurra 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. Asegúrate de que la opción Show all Flow infos esté habilitada:

  3. Selecciona una de las solicitudes con errores y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió 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. 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 encabezado Expires más de una vez.

  7. Navega a la fase AX (datos registrados de Analytics) 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 proxy, es decir, si el servidor o el extremo de destino invoca a otro proxy en Apigee.

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

    2. Se abrirá la ventana Curl for Request Sent to Target Server, desde la cual puedes determinar el alias del host del servidor de destino.

    3. 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.
    4. 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:

  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 X-Apigee-fault-code que coincida con el valor deX-Apigee-fault-code , determina el valor de X-Apigee-fault-code

    Ejemplo 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

  1. 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.
  2. Si Fuente con errores tiene el valor target, esto 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 mediante uno de los siguientes métodos:

    Mensaje de error

    Uso del mensaje de error:

    1. Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta la 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 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 de los pasos 10.a y 10.b de Usa la herramienta de seguimiento.
    2. Si tienes acceso a la solicitud real realizada a la aplicación del servidor de destino, realiza los siguientes pasos:

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

      3. 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 encabezado Expires 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

  1. 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.
  2. 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 encabezado Expires solo una vez.
  3. 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
  1. 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.
  2. 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 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 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