Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
Клиентское приложение получает HTTP-статус 503 Service Unavailable с кодом ошибки protocol.http.ProxyTunnelCreationFailed в ответ на вызовы API.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 503 Service Unavailable
Кроме того, вы можете увидеть следующее сообщение об ошибке:
{
"fault":{
"faultstring":"Proxy refused to create tunnel with response status 403",
"detail":{
"errorcode":"protocol.http.ProxyTunnelCreationFailed"
}
}
}Прямой прокси и туннелирование
Apigee Edge позволяет вашим API-прокси взаимодействовать с вашим бэкэнд-сервером через прокси-сервер, как описано в разделе «Настройка прямого прокси» . Прокси-сервер открывает защищенное (HTTPS) или незащищенное (HTTP) соединение с бэкэнд-сервером в зависимости от типа прокси ( указывается свойством HTTPClient.proxy.type ) и передает данные в обоих направлениях. Это называется туннелированием .
По умолчанию Apigee Edge использует туннелирование для всего трафика. Чтобы отключить туннелирование, необходимо установить свойство HTTPClient.use.tunneling в значение false .
Код ошибки: protocol.http.ProxyTunnelCreationFailed
Apigee Edge возвращает код ошибки protocol.http.ProxyTunnelCreationFailed , если прокси-сервер не может создать туннель между Apigee Edge и бэкэнд-сервером из-за каких-либо проблем, таких как брандмауэр, ограничения ACL (список контроля доступа), проблемы с DNS, недоступность бэкэнд-сервера, тайм-ауты и т. д.
Код состояния в faultstring ответа от Apigee Edge обычно указывает на возможную причину высокого уровня, приведшую к этой ошибке.
Шаблон строки ошибки:
Proxy refused to create tunnel with response status STATUS_CODE
Возможные причины появления некоторых кодов состояния в строке ошибки:
В следующей таблице описаны возможные причины в зависимости от кода состояния, указанного в faultstring :
| Faultstring | Описание |
|---|---|
Прокси-сервер отказался создать туннель, код ответа 403 | Это может произойти из-за ограничений брандмауэра или списков контроля доступа (ACL), настроенных на бэкэнд-сервере, которые препятствуют созданию туннеля. |
Прокси-сервер отказался создать туннель с кодом ошибки 503 | Это может произойти из-за проблем с DNS, ограничений брандмауэра, недоступности бэкэнд-сервера, препятствующей созданию туннеля. |
| Прокси-сервер отказался создать туннель с кодом ошибки 504. | Это может произойти из-за превышения времени ожидания при создании туннеля. |
В зависимости от кода состояния, обнаруженного в faultstring , необходимо использовать соответствующие методы для устранения проблемы. В этом руководстве объясняется, как устранить проблему, если в faultstring для кода ошибки protocol.http.ProxyTunnelCreationFailed обнаружен код состояния 403 .
Возможные причины
Эта ошибка (код состояния 403 ) возникает, если на бэкэнд-сервере настроены какие-либо ограничения брандмауэра или ACL (списки контроля доступа), которые препятствуют созданию туннеля между Apigee Edge и бэкэнд-сервером прокси-сервером.
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
|---|---|---|
| Прокси-сервер отказался создать туннель, код ответа 403. | Прокси-сервер отказывается создавать туннель, поскольку получает в заголовке Host имя хоста прокси-сервера вместо имени хоста бэкэнд-сервера. | Только для пользователей Edge Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки воспользуйтесь одним из следующих инструментов/методов:
инструмент трассировки
Для диагностики ошибки с помощью инструмента трассировки:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Дождитесь возникновения ошибки, или
- Если вы можете воспроизвести проблему, выполните вызов API для воспроизведения ошибки
503 Service UnavailableProxy refused to create tunnel with response status 403.
Убедитесь, что параметр «Показывать все FlowInfos» включен:

- Выберите один из запросов, завершившихся неудачей, и изучите трассировку.
- Проследите за различными этапами трассировки и определите место возникновения сбоя.
Как правило, ошибка появляется после этапа "Начался поток целевого запроса" , как показано ниже:

Обратите внимание на следующую информацию:
Ошибка:
Proxy refused to create tunnel with response status 403- Перейдите к этапу AX (Analytics Data Recorded) в трассировке и щелкните по нему.
Прокрутите вниз до раздела «Заголовки ответа с подробными сведениями о фазе» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
( Посмотреть увеличенное изображение )

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

Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
protocol.http.ProxyTunnelCreationFailedиtargetсоответственно, это указывает на то, что данная ошибка вызвана сбоем при создании прокси-туннеля, поскольку не был получен ожидаемый заголовок хоста.Заголовки ответа Ценить X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
NGINX
Для диагностики ошибки с помощью журналов доступа NGINX:
- Если вы используете частное облако , то можете использовать журналы доступа NGINX для получения ключевой информации об ошибках HTTP
503 Service Unavailable. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ORG . PORT# _access_logГде: ORG , ORG и PORT# заменяются фактическими значениями.
- Проверьте, были ли какие-либо ошибки
503с кодом ошибкиprotocol.http.ProxyTunnelCreationFailedза определенный период времени (если проблема возникала ранее) или есть ли запросы, которые по-прежнему завершаются с ошибкой503. Если вы обнаружите ошибки
503с кодом X-Apigee-fault-code, соответствующим значениюprotocol.http.ProxyTunnelCreationFailed, определите значение X-Apigee-fault-source.Пример ошибки 503 из журнала доступа NGINX:

Приведенная выше запись из журнала доступа NGINX содержит следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки ответа Ценить X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
Причина: Прокси-сервер отказался создать туннель с кодом ответа 403.
Диагноз
- Определите код ошибки и источник ошибки
503 Service Unavailableс помощью инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» . - Просмотрите сообщение об ошибке и определите код состояния, указанный в строке
faultstring, указывающий на сбой при создании туннеля. - В этом случае код состояния равен
403, что означает «Запрещено» . - Это означает, что для создания туннеля недостаточно прав или привилегий. Обычно это происходит, если существуют ограничения брандмауэра или ACL (список контроля доступа), препятствующие созданию туннеля.
- Проверьте все ограничения брандмауэра и/или ACL, настроенные на вашем бэкэнд-сервере, которые могут препятствовать созданию туннеля.
- В зависимости от типа брандмауэра и/или ограничений ACL, вам необходимо соответствующим образом устранить проблему.
Рассмотрим в качестве примера ограничение брандмауэра, чтобы объяснить, как устранять и решать эту проблему:
Сценарий: Ограничение брандмауэра на бэкэнд-сервере предполагает, что заголовок Host всегда должен содержать имя хоста бэкэнд-сервера.
Для определения заголовка хоста, передаваемого Apigee Edge, можно использовать один из следующих способов:
След
Чтобы определить заголовок хоста с помощью трассировки:
- Убедитесь, что строка
faultstringсодержитProxy refused to create tunnel with response status 403используя трассировку, как описано в разделе "Общие шаги диагностики" . - Перейдите к этапу «Начало выполнения целевого запроса» и просмотрите заголовки запроса.
- Проверьте значение имени хоста, указанного в заголовке Host в разделе Request Headers .
- Если заголовок Host содержит имя хоста прокси-сервера , то это и является причиной данной ошибки.
- Это происходит потому, что брандмауэр на бэкэнд-сервере настроен на прием запросов только в том случае, если заголовок Host содержит имя бэкэнд-сервера .
- Таким образом, когда прокси-сервер пытается создать туннель с бэкэнд-сервером, это завершается ошибкой.
Proxy refused to create tunnel with response status 403.Пример трассировки, показывающий заголовок Host с именем прокси-хоста.
( Посмотреть увеличенное изображение )

В приведенном выше примере трассировки видно, что заголовок Host содержит имя прокси-сервера
www.proxyserver.com .Поскольку на бэкэнд-сервере настроено ограничение брандмауэра, согласно которому в заголовке Host должно содержаться только имя хоста бэкэнд-сервера, возникает ошибкаProxy refused to create tunnel with response status 403.
tcpdump
Чтобы определить заголовок хоста с помощью tcpdump
Для захвата дампа
tcpdumpна прокси-сервере для запросов, поступающих от компонента обработки сообщений Apigee Edge, используйте следующую команду:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Для получения дополнительной информации об использовании команды
tcpdumpсм. раздел tcpdump .- Проанализируйте данные
tcpdumpс помощью инструмента Wireshark или аналогичного инструмента. Вот пример анализа tcpdump с помощью Wireshark:
( Посмотреть увеличенное изображение )

- Пакеты 13 , 14 и 15 показывают, что обработчик сообщений устанавливает соединение с прокси-сервером посредством трехстороннего TCP-рукопожатия.
- В пакете 16 обработчик сообщений установил соединение с прокси-сервером
httpbin.org(показано в приведенном выше примере). Выберите пакет 16 и внимательно изучите его содержимое, в частности заголовок Host , передаваемый обработчиком сообщений на прокси-сервер.

- В приведенном выше примере показан заголовок Host Header
httpin.org, который является именем хоста прокси-сервера. Поэтому, когда прокси-сервер пытается создать туннель с бэкэнд-сервером, передавая указанный выше заголовок Host Headerhttpin.org, он терпит неудачу с ошибкойProxy refused to create tunnel with response status 403.
- Убедитесь, что строка
Разрешение
Сценарий: Согласно ограничению брандмауэра, прокси-сервер ожидает, что заголовок Host всегда будет содержать имя хоста бэкэнд-сервера.
Если вы установили, что эта ошибка вызвана тем, что брандмауэр на бэкэнд-сервере настроен таким образом, что ожидает, что заголовок Host всегда будет содержать имя хоста бэкэнд- сервера, в то время как обработчик сообщений отправляет имя хоста прокси-сервера , выполните следующие шаги для решения проблемы:
Установите свойство
use.proxy.host.header.with.target.uriв значение true для параметра TargetEndpoint, как показано в следующем примере:Пример конфигурации TargetEndpoint:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="use.proxy.host.header.with.target.uri">true</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>Убедитесь, что остальные параметры, связанные с прокси-сервером пересылки , настроены в обработчике сообщений следующим образом:
- Проверьте файл
/opt/apigee/customer/application/message-processor.propertiesна каждом из обработчиков сообщений. Убедитесь, что следующие параметры установлены в соответствии с вашим сценарием использования или требованиями:
Примерные значения для свойств:
conf_http_HTTPClient.use.proxy=true conf/http.properties+HTTPClient.proxy.type=HTTP conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME conf/http.properties+HTTPClient.proxy.port=PORT_# conf/http.properties+HTTPClient.proxy.user=USERNAME conf/http.properties+HTTPClient.proxy.password=PASSWORD
- Проверьте файл
Необходимо собрать диагностическую информацию.
Если проблема сохраняется даже после выполнения вышеуказанных инструкций, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке, полученное для неудачных запросов.
- Название среды
- пакет 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