404 具有相同主机别名的多个虚拟主机

您正在查看 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 错误。 请按照以下步骤检查日志:

  1. 使用以下命令查看 NGINX 日志:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 检查日志条目中是否有以下字段:
    字段
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    记下日志中的消息 ID。

  3. 检查消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log),看看您 是否具有特定 API 的 messaging.adaptors.http.flow.ApplicationNotFound,或者您是否具有 API 请求的唯一 消息 ID(来自第 2 步)。

    消息处理器日志中的示例错误消息

  4. 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/proxy1404 错误,则需要找到哪些虚拟主机具有 主机别名 example.com 和端口 9001

  1. Public CloudPrivate Cloud 上的新 Edge 界面 中:
    1. 选择管理
    2. 选择虚拟主机
    3. 对于每个环境 ,使用搜索过滤条件确定与调用 API 请求的特定主机别名 匹配的虚拟 主机
    4. 如果您发现多个虚拟主机 使用相同的主机别名 ,请转到 分辨率部分以解决此问题。

    例如

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

    例如

Management API

使用这些说明确定是否存在多个具有相同主机 别名/端口号的虚拟主机(使用 Management API)。

  1. 获取组织中每个环境中的每个虚拟主机的定义,以查看哪些虚拟主机具有相同的主机别名和端口号:

    例如,如果您观察到网址为 http://example.com:9001/proxy1404 错误,则需要找到哪些虚拟 主机具有主机别名 example.com 和端口 9001

    1. 获取环境列表

      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" ]
    2. 获取环境中的虚拟主机列表

      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" ]
    3. 获取环境中每个虚拟主机的定义。

      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" : [ ]
      }
    4. 针对组织中的其他环境重复上述两个步骤。

      在此示例中,针对 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" : [ ]
      }

      在此示例中,您可以看到,两个不同环境(testdev)中的两个虚拟主机 default 都包含相同的主机别名 example.com 和端口号 9001。这是导致 404 错误的原因。

    5. 如果您发现多个虚拟主机与相同的主机别名匹配,请转到 分辨率部分以解决此问题。

分辨率

  1. 确保每个虚拟主机仅包含唯一的主机别名和端口组合。
  2. 如果您发现多个虚拟主机具有相同的主机别名和端口组合 ,则必须使用唯一的主机别名更新这些虚拟主机。
  3. 您可以使用 Edge 界面或 Management API 更新这些虚拟主机,相关说明请参阅 修改虚拟主机。
  4. 确保每个主机别名都有正确的 DNS 条目。
  5. 在上面讨论的示例中,如果我们的配置如下所示:
    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" : [  ]
    }
    1. 您可以更新不正确的虚拟主机,使其不重叠。
    2. 也就是说,将主机别名更新为 example2.com
    3. 确保新主机别名具有与之前的主机别名类似的 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" : [  ]
      }
  6. 再次对代理进行 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"
        }
    
    }
  7. 如果问题仍然存在,请转到必须收集的诊断信息

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下 诊断信息,然后联系 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 错误的时间段以及时区信息