502 Плохой шлюз — DuplicateHeader

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

Симптом

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

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

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

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: Порядок полей , отправитель НЕ ДОЛЖЕН генерировать несколько полей заголовка с одинаковым именем в сообщении, если только полное значение этого поля заголовка не определено как список, разделенный запятыми (например, #(значения)), или если поле заголовка не является известным исключением. Если Apigee Edge обнаружит, что определенный заголовок, для которого не допускается наличие дубликатов, отправляется более одного раза в HTTP-ответе, отправленном целевым/бэкэнд-сервером, он ответит кодом 502 Bad Gateway и кодом ошибки protocol.http.DuplicateHeader

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

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

Общие этапы диагностики

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

Мониторинг API

Для диагностики ошибки с помощью мониторинга API:

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

  3. Перейдите на страницу Анализ > Мониторинг API > Исследование .
  4. Выберите конкретный временной промежуток, в течение которого вы наблюдали ошибки.
  5. Убедитесь, что для фильтра прокси установлено значение «Все» .
  6. Постройте график зависимости кода ошибки от времени .
  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 (Analytics Data Recorded) в трассировке и щелкните по нему.
  8. Прокрутите вниз до раздела «Подробности этапа — Заголовки ответа» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

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

  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 для запроса, отправленного на целевой сервер", в котором можно определить псевдоним хоста целевого сервера.

    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.a и 10.b использования инструмента трассировки .
    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. Использование свойства CwC.

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