404 具有相同主機別名的多個虛擬主機

您正在查看 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"
      }
   }
}

可能原因

原因 說明 適用的疑難排解指示
具有重複主機別名的虛擬主機 多個虛擬主機使用相同的主機別名和通訊埠號碼。 Edge Public and 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),或是否已有步驟 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 邊緣路由器和訊息處理器會使用主機標頭、通訊埠編號和 URI 路徑,將流量轉送至正確的 API Proxy。如果多個虛擬主機具有相同的主機別名和通訊埠號碼,那麼就會有明確的定義是記錄的反模式,這可能會導致非預期的行為。您會遇到的其中一項常見錯誤是顯示 Unable to identify proxy for host: VIRTUAL_HOST and url: PATH 訊息的 404 錯誤。

一般來說,如果有多個虛擬主機具有相同的主機別名,就會發現間歇性 404 錯誤。這是因為特定 API Proxy 可能會設為只在其中一個虛擬主機上接受要求。當 API 要求轉送至在 API Proxy 中設定的特定虛擬主機時,您會收到成功的回應。 不過,若將 API 要求轉送至其他虛擬主機未設定 API Proxy 接受要求,API 就會失敗,並發生這些 404 錯誤。

請按照 404 找不到主機的 Proxy (<虛擬主機名稱> 和網址:<路徑>) 中的指示操作,並排解這個錯誤。如果沒有上述錯誤導致這項錯誤,請使用下列步驟,判斷含有重複主機別名的虛擬主機是否會導致發生 404 錯誤。

診斷

請使用下列其中一種方法,判斷是否多個虛擬主機具有相同的主機別名/通訊埠號碼導致 404 錯誤:

  • Edge UI
  • Management API

Edge UI

請按照下列操作說明,透過 Edge UI 判斷多個虛擬主機是否擁有相同的主機別名/通訊埠編號。

舉例來說,如果您發現網址 http://example.com:9001/proxy1 發生 404 錯誤,就必須找出哪些虛擬主機擁有主機別名 example.com 和通訊埠 9001

  1. 公有雲私有雲上的新 Edge UI 中:
    1. 選取 [管理員]。
    2. 選取「Virtual Hosts」
    3. 針對每個「Environment」使用搜尋篩選器,判斷「虛擬主機」與叫用 API 要求的特定「主機別名」相符。
    4. 如果您發現多個虛擬主機使用同一個主機別名,請前往「Resolution」解決這項問題。

    例如:

  2. 私有雲的傳統版 UI 中:
    1. 選取「API」 分頁標籤。
    2. 選取「Environment Configuration」
    3. 選取「Virtual Hosts」
    4. 針對每個「Environment」,查看「Virtual Hosts」清單,查看是否有任何與叫用 API 要求的特定「主機別名」相符。
    5. 如果找到多個與同一個主機別名相符的虛擬主機,請前往「Resolution」解決這項問題。

    例如:

Management API

請按照下列操作說明,使用 Management API 判斷多個虛擬主機是否擁有相同的主機別名/通訊埠編號。

  1. 取得機構中每個環境中各個虛擬主機的定義,查看哪些虛擬主機使用相同的主機別名和通訊埠號碼:

    舉例來說,如果您發現網址 http://example.com:9001/proxy1 發生 404 錯誤,就必須找出哪些虛擬主機擁有主機別名 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" : [ ]
      }
      

      在這個範例中,您可以看到在 testdev 兩個不同環境中,這兩個虛擬主機 default 含有相同的主機別名 example.com 和通訊埠號碼 9001。這是 404 錯誤的原因。

    5. 如果找到多個與同一個主機別名相符的虛擬主機,請前往「Resolution」解決這項問題。

解析度

  1. 確保每個虛擬主機只包含不重複的主機別名和通訊埠組合。
  2. 如果找到多個具有相同主機別名和通訊埠組合的虛擬主機,則必須使用不重複的主機別名更新這些主機。
  3. 您可以使用 Edge UI 或 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. 再次向 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"
        }
    
    }
    
  7. 如果問題仍未解決,請參閱「必須收集診斷資訊」。

必須收集診斷資訊

如果按照上述指示操作後仍無法解決問題,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:

如果您是公開雲端使用者,請提供下列資訊:

  • 機構組織名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令以重現 404 錯誤
  • 如果目前未在 404 錯誤發生,請提供過去 404 錯誤發生時的時區資訊。

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 觀察失敗要求的完整錯誤訊息
  • 您要觀察到 404 錯誤的機構、環境名稱和 API Proxy 名稱
  • 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 錯誤時,包含時區資訊的時間範圍