503 Служба недоступна. Не удалось создать прокси-туннель с ошибкой 403.

Вы просматриваете документацию по 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

403 - Forbidden

Это может произойти, возможно, из-за ограничений брандмауэра или ACL, настроенных на внутреннем сервере, которые предотвращают создание туннеля.

Прокси отказался создавать туннель со статусом ответа 503

503 - Service Unavailable

Это может произойти из-за проблем с DNS, ограничений брандмауэра, недоступности внутреннего сервера, что препятствует созданию туннеля.

Прокси отказался создавать туннель со статусом ответа 504

504 - Gateway Timeout

Это может произойти, если есть тайм-ауты при создании туннеля.

В зависимости от кода состояния, наблюдаемого в faultstring , необходимо использовать соответствующие методы для устранения проблемы. В этом пособии объясняется, как устранить проблему, если вы видите код состояния 403 в faultstring для кода ошибки protocol.http.ProxyTunnelCreationFailed .

Возможные причины

Эта ошибка (код состояния 403 ) возникает, если на внутреннем сервере настроены какие-либо ограничения брандмауэра или ACL (списка управления доступом), которые препятствуют созданию туннеля между Apigee Edge и внутренним сервером прокси-сервером.

Причина Описание Инструкции по устранению неполадок применимы для
Прокси отказался создавать туннель со статусом ответа 403 Прокси-сервер отказывается создавать туннель, поскольку он получает имя хоста Прокси-сервера вместо имени хоста Бэкенд-сервера в заголовке Host . Только для пользователей Edge Private Cloud

Общие этапы диагностики

Используйте один из следующих инструментов/методов для диагностики этой ошибки:

Инструмент трассировки

Чтобы диагностировать ошибку с помощью инструмента Trace:

  1. Включите сеанс трассировки и выполните одно из следующих действий:
    • Дождитесь появления ошибки или
    • Если вы можете воспроизвести проблему, сделайте вызов API, чтобы воспроизвести проблему 503 Service Unavailable with Proxy refused to create tunnel with response status 403 .
  2. Убедитесь, что включен параметр Показать все FlowInfos :

  3. Выберите один из неудачных запросов и просмотрите трассировку.
  4. Перемещайтесь по различным фазам трассировки и определяйте, где произошел сбой.
  5. Обычно вы увидите ошибку после фазы Target Request Flow Started , как показано ниже:

    Обратите внимание на следующую информацию:

    ошибка: Proxy refused to create tunnel with response status 403

  6. Перейдите к этапу AX (Записанные аналитические данные) в трассировке и щелкните его.
  7. Прокрутите вниз до раздела «Заголовки ответа сведений о фазе» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

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

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

  8. Вы увидите значения X-Apigee-fault-code и X-Apigee-fault-source как protocol.http.ProxyTunnelCreationFailed и target соответственно, указывая на то, что эта ошибка вызвана сбоем создания туннеля прокси, так как ожидаемый заголовок хоста не получен.

    Заголовки ответа Ценить
    X-Apigee-код неисправности protocol.http.ProxyTunnelCreationFailed
    X-Apigee-источник неисправности target

Nginx

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации об ошибках HTTP 503 Service Unavailable .
  2. Проверьте журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ORG . PORT# _access_log

    Где: ORG , ORG и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы увидеть, есть ли ошибки 503 с кодом ошибки protocol.http.ProxyTunnelCreationFailed в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы с ошибкой 503 .
  4. Если вы обнаружите какие-либо ошибки 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.

Диагноз

  1. Определите код ошибки и источник ошибки для 503 Service Unavailable с помощью Trace Tool или журналов доступа NGINX, как описано в разделе Общие шаги диагностики .
  2. Просмотрите сообщение об ошибке и определите код состояния , указанный в faultstring ошибки для сбоя при создании туннеля.
  3. В этом сценарии код состояния — 403 , что означает «Запрещено» .
  4. Это означает, что для создания туннеля недостаточно прав или привилегий. Обычно это может произойти, если существуют какие-либо ограничения брандмауэра или ACL (списка управления доступом), препятствующие созданию туннеля.
  5. Просмотрите все ограничения брандмауэра и/или ACL, настроенные на вашем внутреннем сервере, которые могут помешать созданию туннеля.
  6. В зависимости от типа брандмауэра и/или ограничений ACL вам необходимо устранить проблему соответствующим образом.
  7. Давайте рассмотрим пример ограничения брандмауэра, чтобы объяснить, как устранить и решить эту проблему:

    Сценарий: ограничение брандмауэра на внутреннем сервере предполагает, что заголовок узла всегда должен содержать имя узла внутреннего сервера.

    Вы можете использовать один из следующих способов определения заголовка хоста, переданного Apigee Edge:

    След

    Чтобы определить заголовок хоста с помощью трассировки:

    1. Убедитесь, что faultstring содержит Proxy refused to create tunnel with response status 403 используя трассировку, как описано в разделе Общие этапы диагностики .
    2. Перейдите к фазе Запущен поток целевых запросов и просмотрите заголовки запросов .
    3. Проверьте значение имени хоста, указанное в заголовке Host в разделе Request Headers .
    4. Если заголовок Host содержит имя прокси-сервера , это является причиной этой ошибки.
    5. Это связано с тем, что брандмауэр настроен на внутреннем сервере для приема запросов, только если заголовок узла содержит имя внутреннего сервера .
    6. Поэтому, когда прокси-сервер пытается создать туннель с внутренним сервером, он терпит неудачу с ошибкой

      Proxy refused to create tunnel with response status 403 .

      Пример трассировки, показывающий, что заголовок узла имеет имя прокси-узла

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

      В примере трассировки, показанном выше, показано, что заголовок узла содержит имя прокси-узла www.proxyserver.com . Поскольку на внутреннем сервере настроено ограничение брандмауэра, которое ожидает, что в заголовке узла будет содержаться только имя узла внутреннего сервера, вы получите сообщение об ошибке Proxy refused to create tunnel with response status 403 .

    tcpdump

    Чтобы определить заголовок хоста с помощью tcpdump

    1. Захватите tcpdump на прокси-сервере для запросов, поступающих от компонента обработчика сообщений Apigee Edge, с помощью следующей команды:

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      Дополнительные сведения об использовании команды tcpdump см. в разделе tcpdump .

    2. Проанализируйте данные tcpdump с помощью инструмента Wireshark или аналогичного инструмента.
    3. Вот пример анализа tcpdump с помощью Wireshark:

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

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

    7. В приведенном выше примере показан заголовок узла httpin.org , который является именем хоста прокси-сервера. Таким образом, когда прокси-сервер пытается создать туннель с внутренним сервером, передав указанный выше заголовок узла httpin.org , происходит сбой с ошибкой Proxy refused to create tunnel with response status 403 .

Разрешение

Сценарий: ограничение брандмауэра на прокси-сервере предполагает, что заголовок хоста всегда должен содержать имя хоста внутреннего сервера.

Если вы установили, что эта ошибка вызвана тем, что брандмауэр на внутреннем сервере настроен таким образом, что он ожидает, что заголовок хоста всегда должен содержать имя хоста внутреннего сервера, в то время как обработчик сообщений отправляет имя хоста прокси-сервера , выполните следующие шаги для устранения проблема:

  1. Задайте для свойства 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>
    
  2. Убедитесь, что другие свойства, связанные с прямым прокси-сервером , настроены в обработчике сообщений следующим образом:

    1. Просмотрите файл /opt/apigee/customer/application/message-processor.properties на каждом из процессоров сообщений.
    2. Убедитесь, что следующие свойства установлены в соответствии с вашим вариантом использования или требованиями:

      Примеры значений свойств:

      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
    

Рекомендации