Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Симптом
В ответ на вызовы API клиентское приложение получает HTTP-статус 404 с сообщением Not Found и сообщением об ошибке Unable to identify proxy for host: VIRTUAL_HOST and url: PATH .
Эта ошибка означает, что Edge не смог найти прокси-сервер API для указанного виртуального хоста и пути.
Сообщение об ошибке
Клиентское приложение получает следующий код ответа:
HTTP/1.1 404 Not Found
Кроме того, вы можете увидеть сообщение об ошибке, похожее на показанное ниже:
{
"fault":{
"faultstring":"Unable to identify proxy for host: default and url: \/oauth2\/token",
"detail":{
"errorcode":"messaging.adaptors.http.flow.ApplicationNotFound"
}
}
}Возможные причины
| Причина | Описание | Инструкции по устранению неполадок, применимые для |
|---|---|---|
| Виртуальный хост с дублирующимся псевдонимом хоста | Несколько виртуальных хостов имеют одинаковый псевдоним хоста и номер порта. | Пользователи публичных и частных облачных сервисов на периферии сети |
Общие этапы диагностики
Журналы NGINX и Message Processor помогут в устранении ошибки 404 Для проверки журналов выполните следующие действия:
- Просмотреть журналы NGINX можно с помощью следующей команды:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Проверьте наличие следующих полей в записях журнала:
Поле Ценить Upstream_status, status404X-Apigee-fault-codemessaging.adaptors.http.flow.ApplicationNotFoundЗапишите идентификатор сообщения из журналов.
- Проверьте журналы обработчика сообщений (
/opt/apigee/var/log/edge-message-processor/logs/system.log), чтобы узнать, есть ли у васmessaging.adaptors.http.flow.ApplicationNotFoundдля конкретного API или уникальный идентификатор сообщения из шага 2 для запроса к API.Пример сообщения об ошибке из журнала обработчика сообщений.
NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/weather, message Id:null, exception:com.apigee.rest.framework.ResourceNotFoundException{ code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for host: vh1 and url: /weather, associated contexts = []}, context:Context@342ea86b input=ClientInputChannel(SSLClientChannel[Accepted: Remote:10.123.123.123:8443 Local:10.135.33.68:62092]@1206954 useCount=1 bytesRead=0 bytesWritten=0 age=1ms lastIO=0ms isOpen=true)
В приведенном выше журнале указан код ошибки, а сообщение об ошибке выглядит следующим образом:
code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for host: vh1 and url: /weather
Причина: Несколько виртуальных хостов с одинаковым псевдонимом хоста и номером порта.
Маршрутизаторы и обработчики сообщений Apigee Edge используют заголовок хоста, номер порта и пути URI для маршрутизации трафика к правильному API-прокси. Наличие неоднозначных определений, таких как несколько виртуальных хостов с одним и тем же псевдонимом хоста и номером порта, является известным антипаттерном и может привести к неожиданному поведению. Одна из распространенных ошибок, которую вы можете наблюдать, — это ошибка 404 с сообщением Unable to identify proxy for host: VIRTUAL_HOST and url: PATH .
Как правило, если существует несколько виртуальных хостов с одним и тем же псевдонимом, вы будете наблюдать периодические ошибки 404 Это происходит потому, что конкретный API-прокси может быть настроен на прием запросов только к одному из виртуальных хостов. Когда запросы API направляются к конкретному виртуальному хосту, настроенному в API-прокси, вы получите успешный ответ. Однако, когда запросы API направляются к другим виртуальным хостам, для которых API-прокси не настроен на прием запросов, API будут завершаться с ошибками 404 .
Следуйте инструкциям, приведенным в сообщении об ошибке 404 «Не удалось идентифицировать прокси для хоста: <имя виртуального хоста> и URL: <путь>», и устраните эту ошибку. Если ни одна из причин не приводит к этой ошибке, выполните следующие шаги, чтобы определить, вызывают ли ошибки 404 виртуальные хосты с повторяющимися псевдонимами хостов.
Диагноз
Для определения наличия нескольких виртуальных хостов с одинаковым псевдонимом хоста/номером порта, приводящих к ошибкам 404 используйте один из следующих методов:
- Edge UI
- API управления
Edge UI
Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста/номером порта, используя пользовательский интерфейс Edge.
Например, если вы наблюдали ошибку 404 при использовании URL-адреса http://example.com:9001/proxy1 , то вам необходимо выяснить, какие виртуальные хосты имеют псевдоним хоста example.com и порт 9001 .
- В публичном облаке и новом пользовательском интерфейсе Edge в частном облаке :
- Выберите Администратор .
- Выберите виртуальные хосты .
- Для каждой среды используйте фильтр поиска, чтобы определить виртуальные хосты , соответствующие конкретному псевдониму хоста, с помощью которого были вызваны запросы API.
- Если вы обнаружили, что несколько виртуальных хостов используют один и тот же псевдоним хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.
Например:

- В классическом пользовательском интерфейсе в частном облаке :
- Выберите вкладку API .
- Выберите «Конфигурация среды» .
- Выберите виртуальные хосты .
- Для каждой среды просмотрите список виртуальных хостов , чтобы проверить, соответствуют ли какие-либо из них конкретному псевдониму хоста, с помощью которого были вызваны запросы API.
- Если вы обнаружили несколько виртуальных хостов с одинаковым псевдонимом хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.
Например:

API управления
Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста/номером порта, используя API управления.
Получите описание каждого виртуального хоста в каждой из сред вашей организации, чтобы увидеть, какие виртуальные хосты имеют одинаковый псевдоним хоста и номер порта:
Например, если вы наблюдали ошибку
404при использовании URL-адресаhttp://example.com:9001/proxy1, то вам необходимо выяснить, какие виртуальные хосты имеют псевдоним хостаexample.comи порт9001.Получить список сред
Пользователь публичного облака:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
Пользователь частного облака:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
Где:
ORGANIZATION_NAME — это название организации.
Пример:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
[ "prod", "test", "dev" ]
Получите список виртуальных хостов в среде.
Пользователь публичного облака:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
Пользователь частного облака:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
Где:
ORGANIZATION_NAME — это название организации.
ENVIRONMENT_NAME — это имя среды.
Пример:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
[ "default" ]
Получите описание каждого из виртуальных хостов в среде.
Пользователь публичного облака:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
Пользователь частного облака:
curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
Где:
ORGANIZATION_NAME — это название организации.
ENVIRONMENT_NAME — это имя среды.
VIRTUAL_HOST_NAME — это имя виртуального хоста.
Пример:
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u USERNAME
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }Повторите описанные выше два шага для остальных сред в вашей организации.
В этом примере повторите шаги для среды
dev:curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts -u USERNAME
[ "default" ]
curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u USERNAME
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }В этом примере видно, что два виртуальных хоста
defaultв двух разных средах,testиdev, и оба содержат один и тот же псевдоним хостаexample.comи номер порта9001Это и является причиной ошибок404.- Если вы обнаружили несколько виртуальных хостов с одинаковым псевдонимом хоста, перейдите в раздел «Решение» , чтобы устранить эту проблему.
Разрешение
- Убедитесь, что каждый виртуальный хост содержит только уникальные комбинации псевдонимов хостов и портов.
- Если вы обнаружили несколько виртуальных хостов с одинаковыми комбинациями псевдонимов хостов и портов, необходимо обновить их, присвоив им уникальные псевдонимы хостов.
- Обновить их можно с помощью пользовательского интерфейса Edge или API управления; инструкции можно найти в разделе «Изменение виртуального хоста».
- Убедитесь, что для каждого псевдонима хоста существует корректная запись DNS.
- В приведенном выше примере, если бы наша конфигурация выглядела так:
curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
[ "prod", "test", "dev" ]
curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user
{ "hostAliases" : [ "example.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }- Вы можете обновить некорректно настроенный виртуальный хост таким образом, чтобы они не пересекались.
- То есть, обновите псевдоним хоста на
example2.com. - Убедитесь, что новый псевдоним хоста имеет аналогичную запись DNS, как и предыдущий псевдоним хоста.
curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user -H 'Content-Type: application/json' -d '{ "hostAliases" : [ "example2.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }' -iHTTP/1.1 200 OK Date: Tue, 02 Feb 2021 20:54:29 GMT Content-Type: application/json X-Apigee.user: user X-Apigee.organization: myorg X-Apigee.environment: dev X-Apigee.backends: management-server Date: Tue, 02 Feb 2021 20:54:29 GMT Content-Length: 152 { "hostAliases" : [ "example2.com" ], "interfaces" : [ ], "listenOptions" : [ ], "name" : "default", "port" : "9001", "retryOptions" : [ ] }
- Повторите вызовы API к прокси-серверу и убедитесь, что вы постоянно получаете успешные ответы:
curl http://example.com:9001/proxy1
{ "slideshow": { "author": "Yours Truly", "date": "date of publication", "slides": [ { "title": "Wake up to WonderWidgets!", "type:": "all" }, { "items": [ "Why WonderWidgets are great", "Who buys WonderWidgets" ], "title": "Overview", "type": "all" } ], "title": "Sample Slide Show" } }
- Если проблема сохраняется, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Необходимо собрать диагностическую информацию.
Если проблема сохраняется даже после выполнения вышеуказанных инструкций, соберите следующую диагностическую информацию, а затем обратитесь в службу поддержки Apigee Edge :
Если вы являетесь пользователем публичного облака , предоставьте следующую информацию:
- Название организации
- Название среды
- Имя API-прокси
- Выполните команду
curlдля воспроизведения ошибки404 - Если ошибки
404в настоящее время не возникают, укажите период времени с информацией о часовом поясе, когда ошибки404возникали в прошлом.
Если вы являетесь пользователем частного облака , предоставьте следующую информацию:
- Полное сообщение об ошибке, полученное для неудачных запросов.
- Название организации, среды и имя API-прокси, для которых наблюдаются ошибки
404 - Пакет API-прокси
- Журналы доступа NGINX
/opt/apigee/var/log/edge-router/nginx/ ORGANIZATION_NAME ~ ENVIRONMENT_NAME . PORT# _access_log - Журналы обработчика сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log - Период времени с указанием часового пояса, когда возникали ошибки
404