502 Bad Gateway - DuplicateHeader

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Symptom

Клиентское приложение получает код статуса HTTP 502 Bad Gateway с кодом ошибки protocol.http.DuplicateHeader в качестве ответа на вызовы API.

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 502 Bad Gateway

Кроме того, вы можете увидеть сообщение об ошибке, похожее на приведенное ниже:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Возможные причины

Эта ошибка возникает, если определенный заголовок HTTP, который не должен дублироваться в Apigee Edge, появляется более одного раза с одинаковыми или разными значениями в ответе HTTP, отправленном внутренним сервером в Apigee Edge.

Согласно RFC 7230, раздел 3.2.2: Порядок полей, отправитель НЕ ДОЛЖЕН создавать несколько полей заголовка с одним и тем же именем поля в сообщении, если только все значение поля заголовка не определено как список, разделенный запятыми, [т.е. #(values)] или поле заголовка является известным исключением. Если Apigee Edge обнаруживает, что определенный заголовок, который не должен дублироваться, отправляется более одного раза в HTTP-ответе , отправленном целевым или бэкенд-сервером, то он отвечает кодом статуса 502 Bad Gateway и кодом ошибки protocol.http.DuplicateHeader.

Вот возможные причины этой ошибки:

Причина Описание Инструкции по устранению неполадок, применимые к
Дублирующийся заголовок в ответе Ответ от внутреннего сервера содержит повторяющиеся заголовки. Пользователи общедоступного и частного облака Edge

Распространенные этапы диагностики

Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:

Мониторинг API

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
  2. Перейдите к организации, в которой хотите изучить проблему.

  3. Перейдите на страницу Анализ > Мониторинг API > Исследование.
  4. Выберите период времени, в течение которого вы наблюдали ошибки.
  5. Убедитесь, что для фильтра Прокси задано значение Все.
  6. Постройте график Код ошибки по оси Y и Время по оси X.
  7. Выберите ячейку с кодом ошибки protocol.http.DuplicateHeader, как показано ниже.

    Посмотреть увеличенное изображение

  8. Информация о коде ошибки protocol.http.DuplicateHeader будет показана, как на изображении ниже.

    Посмотреть увеличенное изображение

  9. Убедитесь, что в поле Код статуса указано значение 502, как показано в примере выше.
  10. Нажмите Посмотреть журналы и разверните строку с неудачным запросом.
  11. В окне "Журналы" обратите внимание на следующие сведения:

    • Код статуса: 502.
    • Источник ошибки: target
    • Код ошибки: protocol.http.DuplicateHeader.
  12. Источник ошибки – target, что означает, что ответ от внутреннего сервера содержал повторяющиеся заголовки.

Инструмент "Трассировка"

Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:

  1. Включите трассировку сеанса и либо
    1. Дождитесь ошибки 502 Bad Gateway или
    2. Если вам удастся воспроизвести проблему, выполните вызов API и воспроизведите ошибку 502 Bad Gateway.
  2. Убедитесь, что параметр Показывать всю информацию о процессе включен:

  3. Выберите один из неудачных запросов и изучите трассировку.
  4. Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
  5. Обычно ошибка возникает в потоке после этапа Запрос отправлен на целевой сервер, как показано ниже.

    Посмотреть увеличенное изображение

  6. Запишите значение ошибки из трассировки.

    В приведенном выше примере трассировки ошибка обозначена как Duplicate Header "Expires". Поскольку ошибка возникает в Apigee после отправки запроса на серверную часть, это означает, что серверная часть отправила заголовок Expires более одного раза.

  7. Найдите в трассировке этап AX (запись данных аналитики) и нажмите на него.
  8. Прокрутите страницу вниз до раздела Phase Details - Response Headers (Сведения об этапе – заголовки ответов) и определите значения X-Apigee-fault-code (Код ошибки Apigee) и X-Apigee-fault-source (Источник ошибки Apigee), как показано ниже:

    Посмотреть увеличенное изображение

  9. Значения X-Apigee-fault-code и X-Apigee-fault-source будут protocol.http.DuplicateHeader и target соответственно. Это означает, что ошибка возникла из-за того, что сервер передал повторяющиеся заголовки для заголовка ответа Expires.
    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Проверьте, используете ли вы цепочку прокси, то есть вызывает ли целевой сервер или целевая конечная точка другой прокси в Apigee.

    1. Чтобы определить это, вернитесь к этапу Запрос отправлен на целевой сервер. Нажмите Показать Curl.

    2. Откроется окно Curl for Request Sent to Target Server (Curl для запроса, отправленного на целевой сервер), в котором можно определить псевдоним хоста целевого сервера.

    3. Если псевдоним хоста целевого сервера указывает на псевдоним виртуального хоста, то это цепочка прокси-серверов. В этом случае вам нужно повторить все описанные выше шаги для цепочки прокси-серверов, пока вы не определите, что именно вызывает ошибку 502 Bad Gateway.
    4. Если псевдоним хоста целевого сервера указывает на ваш внутренний сервер, это означает, что именно он отправляет дублирующиеся заголовки в ответе Apigee.

nginx

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP 502.
  2. Проверьте журналы доступа NGINX:

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

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 502 за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 502.
  4. Если вы обнаружите ошибки 502 с кодом X-Apigee-fault-code, соответствующим значению protocol.http.DuplicateHeader, определите значение X-Apigee-fault-source.

    Пример ошибки 502 из журнала доступа NGINX

    В приведенной выше записи из журнала доступа NGINX для атрибутов X-Apigee-fault-code и X-Apigee-fault-source заданы следующие значения:

    Заголовки ответов Значение
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Причина: в ответе дублируется заголовок

диагностика;

  1. Определите код ошибки и источник ошибки, используя мониторинг API или журналы доступа NGINX, как описано в разделе Распространенные действия по диагностике.
  2. Если в поле Fault Source (Источник ошибки) указано значение target, это означает, что ответ, отправленный целевым сервером, содержит повторяющиеся заголовки.
  3. Определить фактический заголовок, который отправляется несколько раз в составе ответа, можно одним из следующих способов:

    Сообщение об ошибке

    Как использовать сообщение об ошибке

    1. Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, ознакомьтесь с разделом faultstring. В faultstring указано название заголовка, который был отправлен более одного раза.

      Пример сообщения об ошибке

      "faultstring":"Duplicate Header \"Expires\""
    2. В приведенном выше сообщении об ошибке видно, что заголовок Expires отправлен более одного раза, как указано в faultstring.

    Фактический запрос

    Используя реальный запрос:

    1. Если у вас нет доступа к фактическому запросу, отправленному на целевой сервер, получите соответствующую команду curl, выполнив шаги 10а и 10б из раздела Как использовать инструмент трассировки.
    2. Если у вас есть доступ к фактическому запросу, отправленному целевому серверному приложению, выполните следующие действия:

      1. Выполните вызов целевого сервера.

        Пример запроса к целевому серверу, используемому в этом примере:

        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. Проверьте список заголовков в ответе.

        Пример ответа целевого сервера, используемого в этом примере:

        * ...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

        В приведенном выше примере запроса заголовок Expires отправляется более одного раза. Поэтому запрос завершается с ошибкой 502 Bad Gateway и кодом ошибки protocol.http.DuplicateHeader.

      3. Если заголовок, название которого указано в faultstring, встречается в ответе внутреннего сервера более одного раза, это и является причиной ошибки. В приведенном выше примере заголовок Expires отправляется несколько раз.

Разрешение

Как устранить дублирование

Вариант 1 (рекомендуется). Исправьте серверную часть, чтобы не включать повторяющиеся заголовки

  1. Проанализируйте причину, по которой определенный сервер отправляет дублирующийся заголовок Expires, и проверьте, допустимо ли это для прокси API. В большинстве случаев это нежелательно согласно спецификации HTTP RFC7230.
  2. Если это нежелательно, измените приложение целевого сервера, чтобы оно не отправляло дублирующиеся заголовки. В приведенном выше примере заголовок Expires отправляется дважды с одним и тем же значением, что нежелательно. Чтобы устранить проблему, убедитесь, что целевой сервер передает заголовок Expires только один раз.
  3. Если вы хотите разрешить дублирование заголовков, перейдите к разделу Вариант 2. Использование свойства CwC.

CwC

Вариант 2. Использование ресурса "Конверсии в магазинах"

Apigee предоставляет свойство CwC HTTPHeader.<HeaderName> ,которое позволяет клиентским приложениям и целевым серверам отправлять дублирующиеся заголовки прокси API в Apigee Edge.

Ресурс CwC Значения
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Например, следующее свойство можно задать для обработчиков сообщений, чтобы разрешить дубликаты и несколько значений для заголовка Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Если вы используете частное облако, вы можете настроить свойство, чтобы Apigee Edge не выдавал ошибку 502 Bad Gateway, даже если запрос содержит повторяющиеся заголовки. Инструкции приведены в практическом руководстве Настройка процессоров сообщений для использования повторяющихся заголовков.
  2. Если вы используете общедоступное облако, обратитесь в службу поддержки Apigee Edge, чтобы настроить это свойство для вашей организации.

Спецификация

Apigee возвращает ответ об ошибке 502 Bad Gateway, поскольку ожидает, что внутренний сервер будет работать в соответствии со следующими спецификациями RFC:

Спецификация
RFC 7230, раздел 3.2.2: порядок полей
RFC 7230, раздел 3.2: поля заголовка

Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите к разделу Сбор диагностической информации.

Необходимо собрать диагностическую информацию

Соберите указанную ниже диагностическую информацию и обратитесь в службу поддержки Apigee Edge.

Если вы пользователь общедоступного облака, предоставьте следующую информацию:

  • Название организации
  • Название среды
  • Название прокси API
  • Команда curl, использованная для воспроизведения ошибки 502
  • Файл трассировки для запросов к API

Если вы используете частное облако, предоставьте следующую информацию:

  • Полное сообщение об ошибке, которое появляется при неудачных запросах.
  • Название среды
  • Пакет прокси-сервера API
  • Файл трассировки для запросов к API
  • Журналы доступа NGINX:

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

    Где: ORG, ENV и PORT# заменяются фактическими значениями.

  • Системные журналы обработчика сообщений /opt/apigee/var/log/edge-message-processor/logs/system.log