您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 HTTP 狀態碼 404,以及訊息 Not
Found 和錯誤訊息 Unable to identify proxy for host: VIRTUAL_HOST and
url: PATH,做為 API 呼叫的回應。
這個錯誤表示 Edge 找不到指定虛擬主機和路徑的 API Proxy。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
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 和訊息處理工具記錄有助於排解 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 要求中是否有步驟 2 的專屬訊息 ID。訊息處理工具記錄中的錯誤訊息示例
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 Proxy。如果定義不明確 (例如多個虛擬主機使用相同的主機別名和通訊埠編號),這就是已記錄的反模式,可能會導致非預期的行為。您會觀察到的常見錯誤之一是 404 錯誤,訊息為 Unable to identify proxy for host: VIRTUAL_HOST
and url: PATH。
通常如果存在多個具有相同主機別名的虛擬主機,您會觀察到間歇性的 404 錯誤。這是因為特定 API Proxy 可能只設定為接受其中一個虛擬主機的要求。當 API 要求路由至 API Proxy 中設定的特定虛擬主機時,您會收到成功回應。不過,如果 API 要求會轉送至 API Proxy 未設定接受要求的其他虛擬主機,API 就會失敗並顯示這些 404 錯誤。
請按照「
404 無法識別主機 <virtual host name> 和網址 <path> Proxy」的說明操作,排解這項錯誤。如果上述原因皆不適用,請按照下列步驟操作,判斷是否為具有重複主機別名的虛擬主機導致 404 錯誤。
診斷
請使用下列其中一種方法,判斷是否有相同主機別名/通訊埠編號的多個虛擬主機,導致發生 404 錯誤:
- Edge UI
- Management API
Edge UI
請按照這些操作說明,使用 Edge UI 判斷是否有相同主機別名/通訊埠編號的多個虛擬主機。
舉例來說,如果您觀察到網址 404 發生 http://example.com:9001/proxy1 錯誤,則需要找出哪些虛擬主機具有主機別名 example.com 和連接埠 9001。
Management API
請按照這些操作說明,使用 Management API 判斷是否有相同主機別名/通訊埠編號的多個虛擬主機。
取得您機構中每個環境的虛擬主機定義,找出具有相同主機別名和通訊埠號碼的虛擬主機:
舉例來說,如果您觀察到網址
404發生http://example.com:9001/proxy1錯誤,則需要找出哪些虛擬主機具有主機別名example.com和連接埠9001。取得環境清單
公有雲使用者:
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" ]
取得環境中的虛擬主機清單
公有雲使用者:
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" ]
取得環境中每個虛擬主機的定義。
公有雲使用者:
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 UI 或 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" : [ ] }
- 再次對 Proxy 發出 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 Proxy 名稱
- 完成
curl指令,重現404錯誤 - 如果目前沒有發生
404錯誤,請提供過去發生404錯誤的時間範圍和時區資訊。
如果您是 Private Cloud 使用者,請提供下列資訊:
- 失敗要求顯示的完整錯誤訊息
- 您觀察到錯誤的機構、環境和 API Proxy 名稱
404 - API Proxy 套裝組合
- 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錯誤的時間範圍 (含時區資訊)

