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

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

403 - Forbidden

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

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

503 - Service Unavailable

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

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

504 - Gateway Timeout

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

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

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

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

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

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

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

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

Для диагностики ошибки с помощью инструмента трассировки:

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

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

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

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

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

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

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

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

    Заголовки ответа Ценить
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source 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-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.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Причина: Прокси-сервер отказался создать туннель с кодом ответа 403.

Диагноз

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

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

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

    След

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

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

      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

    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 и внимательно изучите его содержимое, в частности заголовок Host , передаваемый обработчиком сообщений на прокси-сервер.

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

Разрешение

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

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

  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

Ссылки