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

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

- Вы увидите значения 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 для запроса, отправленного на целевой сервер", в котором можно определить псевдоним хоста целевого сервера.
- Если псевдоним хоста целевого сервера указывает на псевдоним виртуального хоста, то это цепочка прокси-серверов. В этом случае необходимо повторить все описанные выше шаги для цепочки прокси-серверов, пока не будет определена истинная причина ошибки
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.a и 10.b использования инструмента трассировки . Если у вас есть доступ к фактическому запросу, отправленному целевому серверному приложению, выполните следующие шаги:
Выполнить вызов целевого сервера.
Пример запроса к целевому серверу, использованному в этом примере:
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. Использование свойства CwC.
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