Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Клиентское приложение получает код состояния HTTP 404
с сообщением Not Found
и сообщением об ошибке Unable to identify proxy for host: VIRTUAL_HOST and url: PATH
в ответ на вызовы API.
Эта ошибка означает, что 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" } } }
Возможные причины
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Виртуальный хост с повторяющимся псевдонимом хоста | Несколько виртуальных хостов имеют одинаковый псевдоним хоста и номер порта. | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Журналы NGINX и процессора сообщений помогут устранить ошибку 404
. Чтобы проверить журналы, выполните следующие действия:
- Просмотрите журналы NGINX с помощью следующей команды:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Проверьте следующие поля в записях журнала:
Поле Ценить Upstream_status, status
404
X-Apigee-fault-code
messaging.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
:
- Пограничный интерфейс
- API управления
Пограничный интерфейс
Используйте эти инструкции, чтобы определить, существует ли несколько виртуальных хостов с одинаковым псевдонимом хоста или номером порта с помощью пользовательского интерфейса 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" : [ ] }' -i
HTTP/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 :
Если вы являетесь пользователем Public Cloud , предоставьте следующую информацию:
- Название организации
- Имя среды
- Имя 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