查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式會取得 404
的 HTTP 狀態碼、訊息 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" } } }
可能原因
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
具有重複主機別名的虛擬主機 | 多個虛擬主機使用相同的主機別名和通訊埠號碼。 | 邊緣公有雲和私有雲使用者 |
常見的診斷步驟
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
記下記錄中的郵件 ID,
- 查看訊息處理器記錄
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)
,看看您是否 含有特定 API 的messaging.adaptors.http.flow.ApplicationNotFound
,或您沒有 步驟 2 中針對 API 要求提供的訊息 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 Router 和訊息處理器同時使用主機標頭、通訊埠編號和 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 無法識別以下主機的 Proxy:<虛擬主機名稱>和 url:<path> 和
排解這個錯誤。如果沒有任何原因導致這項錯誤,請使用下列步驟
請在下方判斷具有重複主機別名的虛擬主機是否導致 404
發生錯誤。
診斷
請使用下列其中一種方法,確認有多個虛擬主機具備
主機別名/通訊埠 # 導致 404
錯誤:
- Edge UI
- Management API
Edge UI
請按照以下操作說明,確認有多部虛擬主機擁有相同的主機 別名/通訊埠 #。
舉例來說,如果你觀察到網址出現 404
錯誤
http://example.com:9001/proxy1
,您必須找出
主機別名 example.com
和通訊埠 9001
。
- 在「Public Cloud」和「New Edge UI on Private Cloud」中:
- 選取 [管理員]。
- 選取「Virtual Hosts」。
- 針對每個環境使用搜尋篩選器來判斷虛擬 主機 與 API 的特定 主機別名 叫用要求數。
- 如果您透過相同的「主機別名」找到多個「虛擬主機」,請前往 「解決方法」來解決這個問題。
例如:
- 在私有雲的傳統版 UI 中:
- 選取「API」 分頁標籤。
- 選取「Environment Configuration」。
- 選取「Virtual Hosts」。
- 查看每個「Environment」(環境) 的「Virtual Hosts」(虛擬主機) 清單,看看是否有任何相符項目 叫用 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" : [ ] }
在此範例中,可以看到兩個虛擬主機
default
test
和dev
這兩個不同環境 內含相同的主機別名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" : [ ] }' -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" : [ ] }
- 再次向 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
錯誤的時間範圍