Вы просматриваете документацию по 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:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.

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

Информация о коде ошибки
protocol.http.DuplicateHeaderбудет показана, как на изображении ниже.Посмотреть увеличенное изображение

- Убедитесь, что в поле Код статуса указано значение
502, как показано в примере выше. - Нажмите Посмотреть журналы и разверните строку с неудачным запросом.
В окне "Журналы" обратите внимание на следующие сведения:
- Код статуса:
502. - Источник ошибки:
target - Код ошибки:
protocol.http.DuplicateHeader.
- Код статуса:
- Источник ошибки –
target, что означает, что ответ от внутреннего сервера содержал повторяющиеся заголовки.
Инструмент "Трассировка"
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите трассировку сеанса и либо
- Дождитесь ошибки
502 Bad Gatewayили - Если вам удастся воспроизвести проблему, выполните вызов API и воспроизведите ошибку
502 Bad Gateway.
- Дождитесь ошибки
Убедитесь, что параметр Показывать всю информацию о процессе включен:

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

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

- Значения X-Apigee-fault-code и X-Apigee-fault-source будут
protocol.http.DuplicateHeaderиtargetсоответственно. Это означает, что ошибка возникла из-за того, что сервер передал повторяющиеся заголовки для заголовка ответаExpires.Заголовки ответов Значение X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target Проверьте, используете ли вы цепочку прокси, то есть вызывает ли целевой сервер или целевая конечная точка другой прокси в Apigee.
Чтобы определить это, вернитесь к этапу Запрос отправлен на целевой сервер. Нажмите Показать Curl.
Откроется окно Curl for Request Sent to Target Server (Curl для запроса, отправленного на целевой сервер), в котором можно определить псевдоним хоста целевого сервера.
- Если псевдоним хоста целевого сервера указывает на псевдоним виртуального хоста, то это цепочка прокси-серверов. В этом случае вам нужно повторить все описанные выше шаги для цепочки прокси-серверов, пока вы не определите, что именно вызывает ошибку
502 Bad Gateway. - Если псевдоним хоста целевого сервера указывает на ваш внутренний сервер, это означает, что именно он отправляет дублирующиеся заголовки в ответе Apigee.
nginx
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP
502. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникали ли ошибки
502за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой502. Если вы обнаружите ошибки
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.DuplicateHeaderX-Apigee-fault-source target
Причина: в ответе дублируется заголовок
диагностика;
- Определите код ошибки и источник ошибки, используя мониторинг API или журналы доступа NGINX, как описано в разделе Распространенные действия по диагностике.
- Если в поле Fault Source (Источник ошибки) указано значение
target, это означает, что ответ, отправленный целевым сервером, содержит повторяющиеся заголовки. Определить фактический заголовок, который отправляется несколько раз в составе ответа, можно одним из следующих способов:
Сообщение об ошибке
Как использовать сообщение об ошибке
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, ознакомьтесь с разделом
faultstring. Вfaultstringуказано название заголовка, который был отправлен более одного раза.Пример сообщения об ошибке
"faultstring":"Duplicate Header \"Expires\""
- В приведенном выше сообщении об ошибке видно, что заголовок
Expiresотправлен более одного раза, как указано вfaultstring.
Фактический запрос
Используя реальный запрос:
- Если у вас нет доступа к фактическому запросу, отправленному на целевой сервер, получите соответствующую команду
curl, выполнив шаги 10а и 10б из раздела Как использовать инструмент трассировки. Если у вас есть доступ к фактическому запросу, отправленному целевому серверному приложению, выполните следующие действия:
Выполните вызов целевого сервера.
Пример запроса к целевому серверу, используемому в этом примере:
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
Проверьте список заголовков в ответе.
Пример ответа целевого сервера, используемого в этом примере:
* ...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.Если заголовок, название которого указано в
faultstring, встречается в ответе внутреннего сервера более одного раза, это и является причиной ошибки. В приведенном выше примере заголовокExpiresотправляется несколько раз.
Разрешение
Как устранить дублирование
Вариант 1 (рекомендуется). Исправьте серверную часть, чтобы не включать повторяющиеся заголовки
- Проанализируйте причину, по которой определенный сервер отправляет дублирующийся заголовок
Expires, и проверьте, допустимо ли это для прокси API. В большинстве случаев это нежелательно согласно спецификации HTTP RFC7230. - Если это нежелательно, измените приложение целевого сервера, чтобы оно не отправляло дублирующиеся заголовки.
В приведенном выше примере заголовок
Expiresотправляется дважды с одним и тем же значением, что нежелательно. Чтобы устранить проблему, убедитесь, что целевой сервер передает заголовокExpiresтолько один раз. - Если вы хотите разрешить дублирование заголовков, перейдите к разделу Вариант 2. Использование свойства CwC.
CwC
Вариант 2. Использование ресурса "Конверсии в магазинах"
Apigee предоставляет свойство CwC HTTPHeader.<HeaderName> ,которое позволяет клиентским приложениям и целевым серверам отправлять дублирующиеся заголовки прокси API в Apigee Edge.
| Ресурс CwC | Значения |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Например, следующее свойство можно задать для обработчиков сообщений, чтобы разрешить дубликаты и несколько значений для заголовка Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- Если вы используете частное облако, вы можете настроить свойство, чтобы Apigee Edge не выдавал ошибку
502 Bad Gateway, даже если запрос содержит повторяющиеся заголовки. Инструкции приведены в практическом руководстве Настройка процессоров сообщений для использования повторяющихся заголовков. - Если вы используете общедоступное облако, обратитесь в службу поддержки 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