Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Symptom
Клиентское приложение получает код статуса 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 и внутренним сервером из-за проблем с брандмауэром, ограничениями списка контроля доступа, проблемами с DNS, недоступностью внутреннего сервера, истечением времени ожидания и т. д.
Код статуса в faultstring ответа Apigee Edge обычно указывает на возможную причину высокого уровня, которая привела к этой ошибке.
Шаблон строки ошибки
Proxy refused to create tunnel with response status STATUS_CODE
Возможные причины некоторых кодов статуса, указанных в строке ошибки
В таблице ниже перечислены возможные причины в зависимости от кода статуса, указанного в faultstring:
| Faultstring | Описание |
|---|---|
Прокси-сервер отказался создать туннель. Статус ответа: 403. |
Это может произойти из-за ограничений брандмауэра или списка контроля доступа, настроенных на внутреннем сервере, которые препятствуют созданию туннеля. |
Прокси-сервер отказался создать туннель. Статус ответа: 503. |
Это может произойти из-за проблем с DNS, ограничений брандмауэра или недоступности внутреннего сервера, из-за чего не удается создать туннель. |
| Прокси-сервер отказался создать туннель с кодом ответа 504 |
Это может произойти, если во время создания туннеля истекло время ожидания. |
В зависимости от кода статуса, указанного в faultstring, вам нужно использовать подходящие методы устранения неполадок. В этом руководстве рассказывается, как устранить проблему, если в faultstring для кода ошибки protocol.http.ProxyTunnelCreationFailed вы видите код статуса 403 .
Возможные причины
Эта ошибка (код статуса 403) возникает, если на внутреннем сервере настроены ограничения брандмауэра или ACL (списка контроля доступа), которые не позволяют прокси-серверу создать туннель между Apigee Edge и внутренним сервером.
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Прокси-сервер отказался создать туннель с кодом ответа 403 | Прокси-сервер отказывается создать туннель, поскольку в заголовке Host указано имя хоста прокси-сервера, а не имя хоста внутреннего сервера. |
Только для пользователей Edge Private Cloud |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Инструмент "Трассировка"
Чтобы диагностировать ошибку с помощью инструмента трассировки, выполните следующие действия:
- Включите сеанс трассировки и:
- Дождитесь появления ошибки или:
- Если вам удалось воспроизвести проблему, выполните вызов API, чтобы воспроизвести ее снова,
Proxy refused to create tunnel with response status 403.503 Service Unavailable
Убедитесь, что включен параметр Показывать все FlowInfo:
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка появляется после этапа Target Request Flow Started, как показано ниже.
Обратите внимание на следующее:
Ошибка:
Proxy refused to create tunnel with response status 403- Перейдите к фазе 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.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 вам нужно устранить проблему.
Чтобы объяснить, как устранить проблему, связанную с ограничениями межсетевого экрана, рассмотрим следующий пример:
Сценарий: ограничение межсетевого экрана на внутреннем сервере требует, чтобы заголовок Host всегда содержал имя хоста внутреннего сервера
Чтобы определить заголовок хоста, переданный Apigee Edge, можно использовать один из следующих способов:
Трассировка
Чтобы определить заголовок хоста с помощью Trace:
- Убедитесь, что
faultstringсодержитProxy refused to create tunnel with response status 403, используя трассировку, как описано в разделе Общие шаги диагностики. - Перейдите к этапу Целевой запрос запущен и проверьте заголовки запроса.
- Проверьте значение имени хоста, указанного в заголовке хоста в разделе Заголовки запроса.
- Если заголовок Host содержит имя хоста прокси-сервера, это и является причиной ошибки.
- Это происходит потому, что брандмауэр на внутреннем сервере настроен так, чтобы принимать запросы, только если заголовок хоста содержит имя внутреннего сервера.
- Поэтому, когда прокси-сервер пытается создать туннель с внутренним сервером, он завершается с ошибкой
Proxy refused to create tunnel with response status 403.Пример трассировки, в которой заголовок хоста содержит имя хоста прокси-сервера
( посмотреть изображение в полном размере)
В приведенном выше примере трассировки показано, что заголовок хоста содержит имя хоста прокси-сервера
www.proxyserver.com.. Поскольку на внутреннем сервере настроено ограничение межсетевого экрана, согласно которому в заголовке хоста должно быть только имя хоста внутреннего сервера, вы получаете ошибкуProxy refused to create tunnel with response status 403.
tcpdump
Как определить заголовок хоста с помощью tcpdump
Захватите
tcpdumpна прокси-сервере для запросов, поступающих от компонента Message Processor 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 Message Processor подключился к хосту прокси-сервера
httpbin.org(как показано в примере выше). Выберите пакет 16 и подробно изучите его содержимое, в частности заголовок хоста, который процессор сообщений передает прокси-серверу.
- В приведенном выше примере Host Header
httpin.org– это имя хоста прокси-сервера. Поэтому, когда прокси-сервер пытается создать туннель с внутренним сервером, передавая указанный выше заголовок хостаhttpin.org, происходит сбой с ошибкойProxy refused to create tunnel with response status 403.
- Убедитесь, что
Разрешение
Сценарий: брандмауэр на прокси-сервере требует, чтобы заголовок Host всегда содержал имя хоста внутреннего сервера
Если вы выяснили, что ошибка возникает из-за того, что брандмауэр на бэкенд-сервере настроен таким образом, что заголовок хоста всегда должен содержать имя хоста бэкенд-сервера, а Message Processor отправляет имя хоста прокси-сервера, выполните следующие действия, чтобы устранить проблему:
Задайте для свойства
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>Убедитесь, что другие свойства, связанные с прямым прокси-сервером, настроены в Message Processor следующим образом:
- Проверьте файл
/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