您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
客户端应用获取 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 Cloud 和 Private Cloud 用户 |
常见诊断步骤
NGINX 和消息处理器日志有助于排查 404 错误。
请按照以下步骤检查日志:
- 使用以下命令查看 NGINX 日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 检查日志条目中是否有以下字段:
字段 值 Upstream_status, status404X-Apigee-fault-codemessaging.adaptors.http.flow.ApplicationNotFound记下日志中的消息 ID。
- 检查消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/logs/system.log),看看您 是否具有特定 API 的messaging.adaptors.http.flow.ApplicationNotFound,或者您是否具有 API 请求的唯一 消息 ID(来自第 2 步)。消息处理器日志中的示例错误消息
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:无法识别主机“<virtual host name>”和网址“<path>”的代理中的说明操作,
排查此错误。如果没有任何原因导致此错误,请使用以下步骤
确定具有重复主机别名的虚拟主机是否导致404
错误。
诊断
使用以下方法之一来确定是否存在多个具有相同主机别名/端口号的虚拟主机导致 404 错误:
- Edge 界面
- Management API
Edge 界面
使用这些说明确定是否存在多个具有相同主机 别名/端口号的虚拟主机(使用 Edge 界面)。
例如,如果您观察到网址为
http://example.com:9001/proxy1 的 404 错误,则需要找到哪些虚拟主机具有
主机别名 example.com 和端口 9001。
- 在 Public Cloud 和 Private Cloud 上的新 Edge 界面 中:
- 选择管理 。
- 选择虚拟主机 。
- 对于每个环境 ,使用搜索过滤条件确定与调用 API 请求的特定主机别名 匹配的虚拟 主机 。
- 如果您发现多个虚拟主机 使用相同的主机别名 ,请转到 分辨率部分以解决此问题。
例如:

- 在 Private Cloud 上的传统界面 中:
- 选择 API 标签页。
- 选择环境配置 。
- 选择虚拟主机 。
- 对于每个环境 ,查看虚拟主机 列表,看看是否有任何虚拟主机与调用 API 请求的特定主机别名 匹配。
- 如果您发现多个虚拟主机与相同的主机别名匹配,请转到 分辨率以解决此问题。
例如:

Management API
使用这些说明确定是否存在多个具有相同主机 别名/端口号的虚拟主机(使用 Management API)。
获取组织中每个环境中的每个虚拟主机的定义,以查看哪些虚拟主机具有相同的主机别名和端口号:
例如,如果您观察到网址为
http://example.com:9001/proxy1的404错误,则需要找到哪些虚拟 主机具有主机别名example.com和端口9001。获取环境列表
Public Cloud 用户:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
Private Cloud 用户:
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" ]
获取环境中的虚拟主机列表
Public Cloud 用户:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
Private Cloud 用户:
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" ]
获取环境中每个虚拟主机的定义。
Public Cloud 用户:
curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
Private Cloud 用户:
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" : [ ] }在此示例中,您可以看到,两个不同环境(
test和dev)中的两个虚拟主机default都包含相同的主机别名example.com和端口号9001。这是导致404错误的原因。- 如果您发现多个虚拟主机与相同的主机别名匹配,请转到 分辨率部分以解决此问题。
分辨率
- 确保每个虚拟主机仅包含唯一的主机别名和端口组合。
- 如果您发现多个虚拟主机具有相同的主机别名和端口组合 ,则必须使用唯一的主机别名更新这些虚拟主机。
- 您可以使用 Edge 界面或 Management 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 支持团队:
如果您是 Public Cloud 用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 重现
404错误的完整curl命令 - 如果目前未发生
404错误,请提供过去发生404错误的时间段以及时区信息 。
如果您是 Private Cloud 用户,请提供以下信息:
- 针对失败请求观察到的完整错误消息
- 您观察到
404错误的组织、环境名称和 API 代理名称 - 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错误的时间段以及时区信息