502 Bad Gateway - DuplicateHeader

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.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 enviada por el servidor de backend a Apigee Edge.

Según RFC 7230, sección 3.2.2: Orden de campo, un remitente NO DEBE generar varios encabezados campos con el mismo nombre de campo en un mensaje, a menos que el valor completo del campo campo de encabezado se define como una lista separada por comas, [es decir, #(values)] o el campo de encabezado es un excepción conocida. Si Apigee Edge encuentra un mismo encabezado específico, eso no está permitido tienen duplicados, se envía más de una vez en la respuesta HTTP que envía el servidor de destino o backend, Luego, este responde con 502 Bad Gateway y un 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 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. Asegúrate de que el filtro Proxy esté configurado en Todos.
  6. Traza Código de error en 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 muestra 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, observa los siguientes detalles:

    • Código de estado: 502
    • Fuente del error: target
    • Código de error: protocol.http.DuplicateHeader.
  12. La Fuente del error 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 haz lo siguiente:
    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 Show all Flow Infos esté habilitada:

  3. Selecciona una de las solicitudes fallidas y examina el seguimiento.
  4. Navega por las diferentes fases del seguimiento y localiza dónde ocurrió la falla.
  5. Generalmente, encontrarás el error en un flujo después de la solicitud enviada al destino servidor, como se muestra a continuación:

    (aumentar el tamaño de la imagen)

  6. Anota el valor del error del seguimiento.

    En el seguimiento de ejemplo anterior, se muestra el error como Duplicate Header "Expires". Desde Apigee genera el error 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 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 la respuesta y determina el 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 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 backend pasó los 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. Comprueba si estás usando encadenamiento de proxy; es decir, si el servidor o extremo de destino invoca a otro proxy en Apigee.

    1. Para determinarlo, regresa a la fase del servidor Solicitud enviada al destino. Haz clic en Show Curl.

    2. Se abrirá la ventana Curl para la solicitud enviada al servidor de destino, donde podrás 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 proxy el encadenamiento. En este caso, debes repetir todos los pasos anteriores para el proxy en cadena hasta que determinas qué está causando realmente el error 502 Bad Gateway.
    4. Si el alias del host del servidor de destino apunta a tu servidor backend, indica que Su servidor de backend está enviando 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 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.DuplicateHeader y, luego, y determinar el valor de 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 respuesta

Diagnóstico

  1. Determina el código de error y la fuente de errores del error observado con la API. Registros de acceso de Monitoring o NGINX, como se explica en Pasos del diagnóstico comunes.
  2. Si la Fuente del error tiene el valor target, esto indica que la respuesta que envió el servidor de destino contienen 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

    Si aparece el mensaje de error:

    1. Si tienes acceso al mensaje de error completo que recibiste de Apigee Edge, consulta a 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 se envió el encabezado Expires. 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 que se hizo al servidor de destino, obtén el comando curl correspondiente de Usa la herramienta Trace en el paso 10.a y Paso 10.b.
    2. Si tienes acceso a la solicitud real realizada a la aplicación del servidor de destino, Luego, sigue estos 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 muestran 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 recibe más de una vez. Por lo tanto, esta solicitud falla con 502 Bad Gateway. y el código de error: protocol.http.DuplicateHeader.

      3. Si aparece el encabezado cuyo nombre aparece en faultstring más de una vez en la respuesta del servidor backend, esa es la causa de . 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 un encabezado duplicado. Expires y verifica si está bien que los proxies de API lo acepten. En 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 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 que el servidor de destino pase el encabezado Expires solo una vez.
  3. Si deseas permitir los encabezados duplicados, dirígete a 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 para enviar encabezados duplicados a 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 para el encabezado Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Si eres un usuario de la nube privada, puedes configurar la propiedad para evitar que Apigee Edge no muestre un error 502 Bad Gateway, incluso si la solicitud contiene encabezados duplicados Guía práctica sobre cómo configurar los procesadores de mensajes para usar encabezados duplicados
  2. Si eres usuario de la nube pública, comunícate con el equipo de asistencia de Apigee Edge para configurar propiedad de tu organización.

Especificación

Apigee responde con la respuesta de error 502 Bad Gateway, ya que espera que el servidor de backend se comportaría 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 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 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

    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