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

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

作为对 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"
      }
   }
}

可能的原因

原因 说明 适用的问题排查说明
具有重复主机别名的虚拟主机 多个虚拟主机具有相同的主机别名和端口号。 Edge 公有云和私有云用户

常见诊断步骤

NGINX 和 Message Processor 日志有助于排查 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 从第 2 步中获取的 API 请求消息 ID。

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

  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 Router 和消息处理器同时使用主机标头、端口号和 URI 路径 将流量路由到正确的 API 代理。具有不明确的定义,例如多个虚拟 具有相同主机别名和端口号的主机已记录 反模式和 可能会导致意外行为您会观察到的一个常见错误是 出现 404 错误,并显示 Unable to identify proxy for host: VIRTUAL_HOST and url: PATH 消息。

通常,如果存在多个具有相同主机别名的虚拟主机,您将观察 间歇性的 404 错误。这是因为可能配置了特定的 API 代理 仅接受其中一个虚拟主机上的请求。当 API 请求被路由到 则会收到成功响应。 不过,如果 API 请求被路由到 API 代理 未配置为接受请求,则 API 将失败并显示这些 404 错误。

<ph type="x-smartling-placeholder">

请按照 <ph type="x-smartling-placeholder"></ph> 404 无法识别主机 <虚拟主机名> 的代理网址:<path> 和 对此错误进行问题排查。如果所有原因均未导致此错误,请按照下列步骤操作: 以确定具有重复主机别名的虚拟主机是否会导致 404 错误。

诊断

使用以下方法之一来确定是否有多个虚拟主机具有 相同的主机别名/端口 # 导致 404 错误:

  • Edge 界面
  • Management API

Edge 界面

<ph type="x-smartling-placeholder">

使用以下说明确定是否有多个虚拟主机具有相同的主机 别名/端口 #。

例如,如果您发现网址出现 404 错误 http://example.com:9001/proxy1,则您需要查找哪些虚拟主机 主机别名 example.com 和端口 9001

  1. 公有云私有云上的新 Edge 界面中: <ph type="x-smartling-placeholder">
      </ph>
    1. 选择管理
    2. 选择虚拟主机
    3. 对于每个环境,使用搜索过滤器确定虚拟 与 API 的特定主机别名匹配的主机 请求。
    4. 如果您找到多个使用同一主机别名虚拟主机,请转到 解决方法以解决此问题。

    例如:

  2. 私有云上的传统版界面中: <ph type="x-smartling-placeholder">
      </ph>
    1. 选择 API 标签页。
    2. 选择环境配置
    3. 选择虚拟主机
    4. 对于每种环境,请查看虚拟主机列表,看看是否有任何匹配 调用 API 请求时所用的特定主机别名
    5. 如果您发现多个虚拟主机与同一主机别名匹配,请转到 解决方法以解决此问题。

    例如

Management API

<ph type="x-smartling-placeholder">

使用以下说明确定是否有多个虚拟主机具有相同的主机 别名/端口 #。

  1. 获取您在 Google Cloud 控制台 组织来查看哪些虚拟主机具有相同的主机别名和端口号:

    例如,如果您发现网址出现 404 错误 http://example.com:9001/proxy1,则您需要查找 主机具有主机别名 example.com 和端口 9001

    1. 获取环境列表

      公有云用户

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

      公有云用户

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

      公有云用户

      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" : [ ]
      }
      

      在此示例中,您可以看到两个虚拟主机 defaulttestdev 这两种不同的环境中, 包含相同的主机别名 example.com 和端口号 9001。这就是出现 404 错误的原因。

    5. 如果您发现多个虚拟主机与同一主机别名匹配,请转到 解决方法以解决此问题。

分辨率

  1. 确保每个虚拟主机仅包含唯一的主机别名和端口组合。
  2. 如果您确定了具有相同主机别名和端口组合的多个虚拟主机 那么您必须使用唯一的主机别名更新这些密码。
  3. 您可以使用 Edge 界面或 Management API 更新这些设置,如需查看相关说明 低于 <ph type="x-smartling-placeholder"></ph> 修改虚拟主机。
  4. 确保每个主机别名都有正确的 DNS 条目。 <ph type="x-smartling-placeholder">
  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 支持团队

如果您是公有云用户,请提供以下信息:

  • 组织名称
  • 环境名称
  • API 代理名称
  • 完成 curl 命令以重现 404 错误
  • 如果 404 错误目前未发生,请提供时间段 包含过去发生 404 个错误时的时区信息。

如果您是 Private Cloud 用户,请提供以下信息:

  • 观察到失败请求的完整错误消息
  • 您要观察的组织、环境名称和 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 错误时包含时区信息的时间段