Вы просматриваете документацию 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:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Убедитесь, что для фильтра прокси установлено значение «Все» .
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом ошибки
protocol.http.DuplicateHeader
, как показано ниже:Информация о коде неисправности
protocol.http.DuplicateHeader
http.DuplateHeader отображается, как показано ниже:- Убедитесь, что код состояния —
502
как показано в приведенном выше примере. - Нажмите «Просмотреть журналы» и разверните строку с невыполненным запросом.
В окне «Журналы» обратите внимание на следующие детали:
- Код состояния:
502
- Источник неисправности:
target
- Код ошибки:
protocol.http.DuplicateHeader
.
- Код состояния:
- Источником ошибки является
target
, что указывает на то, что ответ внутреннего сервера содержит повторяющиеся заголовки.
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента трассировки:
- Включите сеанс трассировки и либо
- Дождитесь появления ошибки
502 Bad Gateway
или - Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите ошибку
502 Bad Gateway
- Дождитесь появления ошибки
Убедитесь, что параметр «Показать всю информацию о потоке» включен:
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаружите ошибку в потоке после фазы запроса, отправленного на целевой сервер , как показано ниже:
Обратите внимание на значение ошибки из трассировки.
В приведенном выше примере трассировки ошибка отображается как
Duplicate Header "Expires"
. Поскольку ошибка возникает Apigee после отправки запроса на внутренний сервер, это указывает на то, что внутренний сервер отправил заголовокExpires
более одного раза.- Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
Прокрутите вниз до раздела «Сведения о фазе — заголовки ответов» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
- Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
protocol.http.DuplicateHeader
иtarget
, что указывает на то, что эта ошибка вызвана тем, что внутренний сервер передал повторяющиеся заголовки для заголовка ответа. Срок действияExpires
.Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.DuplicateHeader
X-Apigee-источник-ошибки target
Проверьте, используете ли вы цепочку прокси ; то есть, если целевой сервер или целевая конечная точка вызывает другой прокси-сервер в Apigee.
Чтобы определить это, вернитесь к этапу «Запрос отправлен на целевой сервер». Нажмите «Показать завиток» .
Откроется окно Curl for Request Sent to Target Server, в котором вы можете определить псевдоним хоста целевого сервера.
- Если псевдоним хоста целевого сервера указывает на псевдоним виртуального хоста, то это цепочка прокси. В этом случае вам необходимо повторить все вышеперечисленные шаги для связанного прокси, пока не определите, что на самом деле вызывает ошибку
502 Bad Gateway
. - Если псевдоним хоста целевого сервера указывает на ваш внутренний сервер, это означает, что ваш внутренний сервер отправляет повторяющиеся заголовки в ответе Apigee.
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа 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 Access имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки ответов Ценить X-Apigee-код неисправности protocol.http.DuplicateHeader
X-Apigee-источник-ошибки target
Причина: повторяющийся заголовок в ответе.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если источник сбоя имеет значение
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 .
КвК
Вариант №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 .
Если вы являетесь пользователем 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