Вы просматриваете документацию по Apigee Edge .
См. документацию по Apigee X.
Симптом
Клиентское приложение получает код состояния 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
.
Код ошибки: протокол.http.ProxyTunnelCreationFailed
Apigee Edge возвращает protocol.http.ProxyTunnelCreationFailed
с кодом ошибки. , таймауты и т.д.
Код состояния в faultstring
ответа от Apigee Edge обычно указывает на возможную причину высокого уровня, которая привела к этой ошибке.
Шаблон строки ошибки:
Proxy refused to create tunnel with response status STATUS_CODE
Возможные причины некоторых кодов состояния, наблюдаемых в строке ошибки:
В следующей таблице описаны возможные причины в зависимости от кода состояния, указанного в faultstring
:
строка ошибки | Описание |
---|---|
Прокси отказался создавать туннель со статусом ответа 403 | Это может произойти, возможно, из-за ограничений брандмауэра или ACL, настроенных на внутреннем сервере, которые предотвращают создание туннеля. |
Прокси отказался создавать туннель со статусом ответа 503 | Это может произойти из-за проблем с DNS, ограничений брандмауэра, недоступности внутреннего сервера, что препятствует созданию туннеля. |
Прокси отказался создавать туннель со статусом ответа 504 | Это может произойти, если есть тайм-ауты при создании туннеля. |
В зависимости от кода состояния, наблюдаемого в faultstring
, необходимо использовать соответствующие методы для устранения проблемы. В этом пособии объясняется, как устранить проблему, если вы видите код состояния 403
в faultstring
для кода ошибки protocol.http.ProxyTunnelCreationFailed
.
Возможные причины
Эта ошибка (код состояния 403
) возникает, если на внутреннем сервере настроены какие-либо ограничения брандмауэра или ACL (списка управления доступом), которые препятствуют созданию туннеля между Apigee Edge и внутренним сервером прокси-сервером.
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Прокси отказался создавать туннель со статусом ответа 403 | Прокси-сервер отказывается создавать туннель, поскольку он получает имя хоста Прокси-сервера вместо имени хоста Бэкенд-сервера в заголовке Host . | Только для пользователей Edge Private Cloud |
Общие этапы диагностики
Используйте один из следующих инструментов/методов для диагностики этой ошибки:
Инструмент трассировки
Чтобы диагностировать ошибку с помощью инструмента Trace:
- Включите сеанс трассировки и выполните одно из следующих действий:
- Дождитесь появления ошибки или
- Если вы можете воспроизвести проблему, сделайте вызов API, чтобы воспроизвести проблему
503 Service Unavailable
withProxy refused to create tunnel with response status 403
.
Убедитесь, что включен параметр Показать все FlowInfos :
- Выберите один из неудачных запросов и просмотрите трассировку.
- Перемещайтесь по различным фазам трассировки и определяйте, где произошел сбой.
Обычно вы увидите ошибку после фазы Target Request Flow Started , как показано ниже:
Обратите внимание на следующую информацию:
ошибка:
Proxy refused to create tunnel with response status 403
- Перейдите к этапу AX (Записанные аналитические данные) в трассировке и щелкните его.
Прокрутите вниз до раздела «Заголовки ответа сведений о фазе» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:
Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как
protocol.http.ProxyTunnelCreationFailed
иtarget
соответственно, указывая на то, что эта ошибка вызвана сбоем создания туннеля прокси, так как ожидаемый заголовок хоста не получен.Заголовки ответа Ценить X-Apigee-код неисправности protocol.http.ProxyTunnelCreationFailed
X-Apigee-источник неисправности 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, совпадающим со значениемprotocol.http.ProxyTunnelCreationFailed
, определите значение источника ошибки X-Apigee.Пример ошибки 503 из журнала доступа NGINX:
Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source:
Заголовки ответа Ценить X-Apigee-код неисправности protocol.http.ProxyTunnelCreationFailed
X-Apigee-источник неисправности target
Причина: Прокси отказался создавать туннель со статусом ответа 403.
Диагноз
- Определите код ошибки и источник ошибки для
503 Service Unavailable
с помощью Trace Tool или журналов доступа NGINX, как описано в разделе Общие шаги диагностики . - Просмотрите сообщение об ошибке и определите код состояния , указанный в
faultstring
ошибки для сбоя при создании туннеля. - В этом сценарии код состояния —
403
, что означает «Запрещено» . - Это означает, что для создания туннеля недостаточно прав или привилегий. Обычно это может произойти, если существуют какие-либо ограничения брандмауэра или ACL (списка управления доступом), препятствующие созданию туннеля.
- Просмотрите все ограничения брандмауэра и/или ACL, настроенные на вашем внутреннем сервере, которые могут помешать созданию туннеля.
- В зависимости от типа брандмауэра и/или ограничений ACL вам необходимо устранить проблему соответствующим образом.
Давайте рассмотрим пример ограничения брандмауэра, чтобы объяснить, как устранить и решить эту проблему:
Сценарий: ограничение брандмауэра на внутреннем сервере предполагает, что заголовок узла всегда должен содержать имя узла внутреннего сервера.
Вы можете использовать один из следующих способов определения заголовка хоста, переданного Apigee Edge:
След
Чтобы определить заголовок хоста с помощью трассировки:
- Убедитесь, что
faultstring
содержитProxy refused to create tunnel with response status 403
используя трассировку, как описано в разделе Общие этапы диагностики . - Перейдите к фазе Запущен поток целевых запросов и просмотрите заголовки запросов .
- Проверьте значение имени хоста, указанное в заголовке Host в разделе Request Headers .
- Если заголовок 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
на прокси-сервере для запросов, поступающих от компонента обработчика сообщений 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 и подробно изучите содержимое пакета и, в частности, заголовок узла , передаваемый на прокси-сервер обработчиком сообщений.
- В приведенном выше примере показан заголовок узла
httpin.org
, который является именем хоста прокси-сервера. Таким образом, когда прокси-сервер пытается создать туннель с внутренним сервером, передав указанный выше заголовок узлаhttpin.org
, происходит сбой с ошибкойProxy refused to create tunnel with response status 403
.
- Убедитесь, что
Разрешение
Сценарий: ограничение брандмауэра на прокси-сервере предполагает, что заголовок хоста всегда должен содержать имя хоста внутреннего сервера.
Если вы установили, что эта ошибка вызвана тем, что брандмауэр на внутреннем сервере настроен таким образом, что он ожидает, что заголовок хоста всегда должен содержать имя хоста внутреннего сервера, в то время как обработчик сообщений отправляет имя хоста прокси-сервера , выполните следующие шаги для устранения проблема:
Задайте для свойства
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