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

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

Симптом

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

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

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

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

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

API-мониторинг

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

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

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

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

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

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

  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. Прокрутите вниз до раздела «Сведения о фазе — заголовки ответов» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

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

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

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

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

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

НГИНКС

Чтобы диагностировать ошибку с помощью журналов доступа 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 Access имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.DuplicateHeader
    X-Apigee-источник-ошибки target

Причина: повторяющийся заголовок в ответе.

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если источник сбоя имеет значение 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 .

КвК

Вариант №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 .

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

  • Название организации
  • Имя среды
  • Имя 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