503 Service Unavailable - NoActiveTargets - HealthCheckFailures

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。
info

影片

如要進一步瞭解 503 錯誤,請觀看下列影片:

影片 說明
排解及解決「503 Service Unavailable - NoActiveTargets」問題 瞭解以下內容:
  • 目標伺服器和健康狀態監控的重要性
  • 排解及解決因健康狀態檢查失敗而導致的即時 503 Service Unavailable - NoActiveTargets 錯誤

問題

用戶端應用程式會收到 HTTP 回應狀態碼 503,以及訊息「Service Unavailable」(服務無法使用),而 API Proxy 要求會收到錯誤代碼「NoActiveTargets」(沒有作用中的目標)。

錯誤訊息

您會看到下列錯誤回應:

HTTP/1.1 503 Service Unavailable
  

您會在 HTTP 回應中看到下列錯誤訊息:

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.NoActiveTargets"
       }
    }
}
  

可能原因

如果您在 API Proxy 的目標端點設定中使用一或多個目標伺服器,通常會觀察到 HTTP 回應 503 Service Unavailable,並顯示錯誤代碼 NoActiveTargets。

本劇本涵蓋 503 Service Unavailable,錯誤代碼為 NoActiveTargets,這是因為健康狀態檢查失敗所致。如要瞭解這項錯誤的其他原因,請參閱這份教戰手冊。

健康狀態檢查失敗

只有在您已將 健康狀態監控設定為 API Proxy 目標端點中目標伺服器負載平衡設定的一部分時,才會觀察到健康狀態檢查失敗。

如果目標伺服器未通過健康狀態檢查,Edge 會增加該伺服器的失敗次數。如果該伺服器的健康狀態檢查失敗次數達到預先定義的門檻 (<MaxFailures>),訊息處理器會在記錄檔中記錄下列警告訊息:

Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
    

警告訊息會提供下列資訊: 這項指標有助您瞭解哪個目標伺服器達到 MaxFailure 計數:

  • 目標伺服器名稱
  • 機構和環境名稱
  • API Proxy 名稱
  • 目標端點名稱

之後,Edge 就不會再向該特定伺服器傳送任何要求。負載平衡器設定中設定的所有目標伺服器達到 MaxFailure 計數後,後續的 API 要求會以 503 Service Unavailable 回應,並顯示 NoActiveTargets 錯誤代碼。

使用健康狀態監控器時,Apigee Edge 會在目標伺服器恢復正常時,自動將其納入輪替,不必重新部署 API Proxy。

以下是健康狀態檢查失敗的可能原因:

原因 說明 誰可以執行疑難排解步驟
連線逾時錯誤 在 LoadBalancer 設定中指定的逾時期間內,訊息處理器無法連線至目標伺服器。 Edge Private Cloud 使用者
在不安全的連接埠上發出安全要求
  1. 如果目標伺服器定義為安全伺服器,但設定的通訊埠不安全。
  2. 如果目標伺服器定義為安全伺服器,但健康狀態監控器設定為在不安全的通訊埠上執行健康狀態檢查。
Edge Private Cloud 使用者
安全通訊埠上的不安全要求
  1. 如果目標伺服器定義為不安全的伺服器,但設定的通訊埠卻是安全的。
  2. 如果目標伺服器定義為不安全的伺服器,但健康狀態監控器設定為在安全通訊埠上執行健康狀態檢查。
Edge Private Cloud 使用者
健康檢查 API 回應錯誤 如果健康狀態檢查 API 傳回錯誤或回應代碼,則不符合健康狀態監控器 SuccessResponse 元素中指定的任何項目。 Edge Private Cloud 使用者

常見的診斷步驟

找出失敗要求訊息的 ID

追蹤工具

如要使用「追蹤」工具判斷失敗要求的訊息 ID,請按照下列步驟操作:

  1. 啟用追蹤工作階段、發出 API 呼叫,然後重現問題 - 503 Service Unavailable,錯誤代碼為 NoActiveTargets。
  2. 選取其中一個失敗的要求。
  3. 前往 AX 階段,然後在「Phase Details」(階段詳細資料) 區段中向下捲動,找出要求的訊息 ID (X-Apigee.Message-ID),如下圖所示。

    「階段詳細資料」部分的訊息 ID

NGINX 存取記錄

如要使用 NGINX 存取記錄判斷失敗要求的訊息 ID,請按照下列步驟操作:

您也可以參閱 NGINX 存取記錄,判斷 503 錯誤的訊息 ID。 如果問題過去曾發生,或是問題間歇性出現,且您無法在 UI 中擷取追蹤記錄,這個方法就特別實用。請按照下列步驟,從 NGINX 存取記錄檔判斷這項資訊:

  1. 檢查 NGINX 存取記錄:(/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  2. 在特定時間內,搜尋特定 API Proxy 是否有任何 503 錯誤 (如果問題發生在過去),或是否有任何要求仍因 503 錯誤而失敗。
  3. 如果出現任何 503 錯誤,並顯示 X-Apigee-fault-code messaging.adaptors.http.flow.NoActiveTargets,請記下其中一或多個這類要求的訊息 ID,如下例所示:

    顯示 503 錯誤的範例項目

    顯示狀態碼、訊息 ID、錯誤來源和錯誤代碼的範例項目

常見錯誤訊息

使用目標伺服器時,如果訊息處理器嘗試連線至後端伺服器時發生錯誤,訊息處理器記錄檔中就會顯示幾則常見的錯誤訊息。這些錯誤會在導致失敗的實際例外狀況/錯誤訊息之後記錄。

訊息處理器記錄中常見的錯誤訊息 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 如下: 503 Service Unavailable,錯誤代碼為 NoActiveTargets

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 INFO  ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Failed to send request to target servers : [demo-target] for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2}

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : No Active Target server Found for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2}

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Unexpected error while sending request
com.apigee.errors.http.server.ServiceUnavailableException: The Service is temporarily unavailable
	at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.sendRequest(LBTargetRequestSender.java:299)
	at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.access$400(LBTargetRequestSender.java:57)
	…<snipped>

這些錯誤訊息表示要求無法傳送至後端伺服器。因此,訊息處理器會傳送 503 Service Unavailable,並以錯誤代碼 NoActiveTargets 做為對用戶端的回應。

原因:連線逾時

診斷

  1. 判斷失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。
  3. 您會看到與訊息 ID 相對應的常見錯誤訊息。不過,如要瞭解健康狀態檢查失敗的實際原因,請捲動至上述常見錯誤訊息,並檢查是否有任何健康狀態監控錯誤。

    舉例來說,下列健康監控錯誤訊息表示訊息處理器在發出健康狀態檢查 API 要求時,因連線逾時而失敗:

    Apigee-Timer-6 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://<BackendServer-Hostname>:443/status
    java.net.ConnectException: Connection timed out (Connection timed out)
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    …<snipped>
            

    如果這個錯誤重複發生 MaxFailure 次 (次數是在健康狀態監控器中設定),您就會看到類似以下的警告訊息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    請仔細閱讀警告訊息中的資訊。請確認特定 API Proxy 中使用的目標伺服器已達到 MaxFailure 計數,您目前遇到 503 回應代碼,且錯誤代碼為 NoActiveTargets。

  4. 在上述範例中,健康狀態檢查失敗,並出現 connection timed out 錯誤。 使用 telnet 指令,檢查是否能從每個 Message Processor 直接連線至特定後端伺服器:
  5. telnet <BackendServer-HostName> 443
          
  6. 如果可以連線至後端伺服器,您可能會看到「Connected to backend-server」(已連線至後端伺服器) 等訊息。那麼問題可能是暫時性的,或許已經解決,也可能是間歇性問題。重複執行步驟 4 幾次 (10 次以上),並驗證輸出內容。
    1. 如果 telnet 指令持續沒有錯誤,表示問題已解決。重新檢查健康狀態檢查失敗是否已停止。如果是,則無須採取任何進一步行動。
    2. 如果無法使用 telnet 指令間歇性連線至後端伺服器,可能是網路問題,或是後端伺服器忙碌中。
  7. 如果無法使用 telnet 指令連線至後端伺服器,可能是因為特定後端伺服器上的訊息處理器不允許流量。

解析度

如果持續出現 connection timed out 錯誤,請確認後端伺服器沒有任何防火牆限制,且允許來自 Apigee Edge 訊息處理器的流量。舉例來說,在 Linux 上,您可以使用 iptables,允許後端伺服器上的訊息處理器 IP 位址傳送流量。

如果問題仍未解決,請與網路管理員合作,找出並修正問題。 如需 Apigee 的進一步協助,請與 Apigee 支援團隊聯絡。

原因:在不安全的連接埠上提出安全要求

診斷

  1. 判斷失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。
  3. 您會看到與訊息 ID 相對應的常見錯誤訊息。 不過,如要瞭解健康狀態檢查失敗的實際原因,請捲動至上述常見錯誤訊息上方,並檢查是否有任何健康狀態監控錯誤。

    舉例來說,您可能會看到如下所示的健康狀態監控錯誤:

    Apigee-Timer-1 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://mocktarget.apigee.net:80/status
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
            at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710)
            at sun.security.ssl.InputRecord.read(InputRecord.java:527)
            at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
            at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
    …<snipped>
            

    如果這個錯誤重複發生 MaxFailure 次 (次數是在健康狀態監控器中設定),您就會看到類似以下的警告訊息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    請仔細閱讀警告訊息中的資訊。請確認特定 API Proxy 中使用的目標伺服器已達到 MaxFailure 計數,您目前遇到 503 回應代碼,且錯誤代碼為 NoActiveTargets。

  4. 健康狀態檢查失敗,錯誤如下:
    Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
          

    錯誤訊息和網址指出,這個問題的原因是在非安全通訊埠 80 上進行安全呼叫 (HTTPS)。

    這個錯誤可能在下列兩種情況中發生:

    • 使用不安全的通訊埠定義安全目標伺服器
    • 已定義安全目標伺服器,但健康狀態監控器設定為使用不安全的通訊埠

    保護目標的不安全通訊埠

    情境 1:使用不安全的通訊埠定義安全目標伺服器

    如果您定義了安全目標伺服器,但使用不安全的通訊埠 (例如 80),就會收到這項錯誤。請按照下列步驟確認問題是否為此原因所致:

    1. 檢查目標端點設定中使用的目標伺服器定義。
    2. 使用 Get TargetServer API 取得目標伺服器定義。

      目標伺服器定義輸出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>80</Port>
        <IsEnabled>true</IsEnabled>
        <SSLInfo>
            <Enabled>true</Enabled>
        </SSLInfo>
      </TargetServer>
                

      在上述範例中,定義顯示目標伺服器 mocktarget 是安全伺服器,如 SSLInfo 區塊所示。但設定的通訊埠 80 不安全。

    3. 現在,請檢查目標端點設定中目標伺服器的健康狀態監控設定:

      健康狀態監控設定

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
            <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
                

      請注意,上述健康狀態監控設定中並未指定 <Port> 元素。在本例中,Edge 的訊息處理器會使用目標伺服器定義中指定的通訊埠 (即 80),發出健康狀態檢查 API 呼叫。

    4. 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為安全伺服器 (因為已啟用 SSLInfo 區塊),但使用不安全的通訊埠 80。

    保護目標不安全的 HM 連接埠

    情境 2:已定義安全目標伺服器,但健康狀態監控器設定為使用不安全的通訊埠

    如果您已定義安全目標伺服器,但健康狀態監控器設定的通訊埠並非安全通訊埠 (例如 80),就會收到這則錯誤訊息。請按照下列步驟確認問題是否由此造成:

    1. 檢查目標端點設定中使用的目標伺服器定義。

      使用 Get TargetServer API 取得目標伺服器定義。

      目標伺服器定義輸出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>443</Port>
        <IsEnabled>true</IsEnabled>
        <SSLInfo>
            <Enabled>true</Enabled>
        </SSLInfo>
      </TargetServer>
              

      在上述範例中,定義顯示目標伺服器 mocktarget 是安全伺服器,如 SSLInfo 區塊所示。

    2. 接著,請檢查目標端點設定中目標伺服器的健康狀態監控器設定:

      健康狀態監控設定

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
         	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Port>80</Port>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
              

      在上述範例中,健康狀態監控器設定為使用不安全的通訊埠 80,如 <Port> 元素所示。

    3. 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為安全伺服器 (因為已啟用 SSLInfo 區塊),並使用安全通訊埠 443,但健康狀態監控器設定為使用不安全的通訊埠 80 (在 <Port> 元素中指定) 執行健康狀態檢查。

      也就是說,在這種情況下,Edge 會透過不安全的通訊埠 80,以安全呼叫的形式執行健康狀態檢查 API,並因上述錯誤而失敗。

解析度

保護目標的不安全通訊埠

情境 1:使用不安全的通訊埠定義安全目標伺服器

如要修正這個錯誤,請更新目標伺服器定義,使用適當的安全通訊埠。

使用 Update a TargetServer API 更新目標伺服器定義,並確保使用安全通訊埠 (例如:443) ,如下方範例所示:

<TargetServer name="mocktarget">
  <Host>mocktarget.apigee.net</Host>
  <Port>443</Port>
  <IsEnabled>true</IsEnabled>
  <SSLInfo>
      <Enabled>true</Enabled>
  </SSLInfo>
</TargetServer>
    

保護目標不安全的 HM 連接埠

情境 2:已定義安全目標伺服器,但健康狀態監控器設定為使用不安全的通訊埠

如要修正這項錯誤,請按照下列指示操作:

  1. 修改健康狀態監控器設定,使用安全通訊埠 (例如:443) 執行目標伺服器健康狀態檢查,如下所示:
    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
        <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>443</Port>
          <Verb>GET</Verb>
          <Path>/statuscode/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            
  2. 儲存 API Proxy 變更。

原因:安全連接埠上的不安全要求

診斷

  1. 判斷失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。
  3. 您會看到與訊息 ID 相對應的常見錯誤訊息。不過,如要瞭解健康狀態檢查失敗的實際原因,請捲動至上述常見錯誤訊息上方,並檢查是否有任何健康狀態監控錯誤。

    舉例來說,您可能會看到如下所示的健康狀態監控錯誤:

    Apigee-Timer-2 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : http://mocktarget.apigee.net:443/status
    java.net.SocketException: Unexpected end of file from server
    	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
    	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
    	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
    	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
    	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
    …<snipped>
              

    如果這個錯誤重複發生 MaxFailure 次 (次數是在健康狀態監控器中設定),您就會看到類似以下的警告訊息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
              

    請仔細閱讀警告訊息中的資訊。請確認特定 API Proxy 中使用的目標伺服器已達到 MaxFailure 計數,您目前遇到 503 回應代碼,且錯誤代碼為 NoActiveTargets。

  4. 健康狀態檢查失敗,錯誤如下:
    Error sending request Request URL : http://mocktarget.apigee.net:443/status
    java.net.SocketException: Unexpected end of file from server
          

    錯誤訊息和網址指出,這個問題的原因是在安全通訊埠 443 上發出不安全的呼叫 (HTTP)。

    這個錯誤可能在下列兩種情況中發生:

    • 使用安全通訊埠定義不安全的目標伺服器
    • 定義不安全的目標伺服器,但健康狀態監控工具設定為使用安全通訊埠

    不安全的目標安全通訊埠

    情境 1:使用安全通訊埠定義不安全的目標伺服器

    如果您定義了不安全的目標伺服器,但使用安全的通訊埠 (例如 443),請按照下列步驟確認問題是否為此原因所致:

    1. 檢查目標端點設定中使用的目標伺服器定義。

      使用 Get TargetServer API 取得目標伺服器定義。

      目標伺服器定義輸出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>443</Port>
        <IsEnabled>true</IsEnabled>
      </TargetServer>
                    

      在上述範例中,定義顯示目標伺服器 mocktarget 是不安全的伺服器,因為沒有 SSLInfo 區塊。不過,系統設定有誤,使用了安全的通訊埠 443。

    2. 現在,請檢查目標端點設定中目標伺服器的健康狀態監控設定:

      健康狀態監控設定

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
            <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
                      

      請注意,上述健康狀態監控器設定中並未指定 <Port> 元素。在這種情況下,Edge 的訊息處理器會使用目標伺服器定義中指定的通訊埠 (即 443)。

    3. 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為不安全的伺服器 (因為未定義 SSLInfo 區塊),但使用安全的通訊埠 443。

      也就是說,Edge 會以非安全呼叫的形式,透過安全通訊埠 443 進行健康狀態檢查,並因上述錯誤而失敗。

    不安全的目標安全 HM 連接埠

    情境 2:定義不安全的目標伺服器,但健康狀態監控器設定為使用安全通訊埠

    如果您定義了不安全的目標伺服器,但健康狀態監控器設定了安全通訊埠 (例如 443),就會收到這項錯誤。請按照下列步驟確認問題是否為此原因所致:

    1. 檢查目標端點設定中使用的目標伺服器定義。

      使用 Get TargetServer API 取得目標伺服器定義。

      目標伺服器定義輸出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>80</Port>
        <IsEnabled>true</IsEnabled>
      </TargetServer>
              

      在上述範例中,定義顯示目標伺服器 mocktarget 是不安全的伺服器 (因為沒有 SSLInfo 區塊),且已正確設定不安全的通訊埠 80。

    2. 接著,請檢查目標端點設定中目標伺服器的健康狀態監控器設定:

      健康狀態監控設定

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
         	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Port>443</Port>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
            

      在上述範例中,健康狀態監控器已設定為使用安全通訊埠 443,如 <Port> 元素所示。

    3. 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為不安全的伺服器 (因為未定義 SSLInfo 區塊),且不安全的通訊埠 80 正確無誤,但健康狀態監控器設定為使用安全的通訊埠 443 (在 <Port> 元素中指定) 執行健康狀態檢查。

      也就是說,在本例中,Edge 會以安全通訊埠 443 進行健康狀態檢查,但會以非安全呼叫的形式進行,因此會發生上述錯誤。

解析度

不安全的目標安全通訊埠

情境 1:使用安全通訊埠定義不安全的目標伺服器

如要修正這個錯誤,請更新目標伺服器定義,使用適當的安全通訊埠。

使用「 更新目標伺服器 API」更新目標伺服器定義,並確保使用不安全的通訊埠 (例如:80),如下例所示:

<TargetServer name="mocktarget">
  <Host>mocktarget.apigee.net</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer>
              

不安全的目標安全 HM 連接埠

情境 2:定義不安全的目標伺服器,但健康狀態監控器設定為安全通訊埠

如要修正這項錯誤,請按照下列指示操作:

  1. 請從健康狀態監控設定中移除 <Port> 元素,或修改健康狀態監控設定,使用非安全通訊埠 (例如:80) ,在失敗的 API Proxy 目標端點設定中執行目標伺服器健康狀態檢查,如下所示:
    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
       	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>80</Port>
          <Verb>GET</Verb>
          <Path>/statuscode/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            
  2. 儲存 API Proxy 變更。

原因:健康狀態檢查 API 回應錯誤

診斷

  1. 判斷失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。
  3. 您會看到與訊息 ID 相對應的常見錯誤訊息。 不過,如要瞭解健康狀態檢查失敗的實際原因,請向上捲動至這些常見錯誤訊息,並檢查是否有任何健康狀態監控錯誤/警告。

    舉例來說,您可能會看到健康狀態監控警告,如下所示:

    Apigee-Timer-7 INFO  SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
    Apigee-Timer-7 WARN  SERVICES.HEALTH_MONITOR - HTTPMonitor.monitor() : HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
            

    如果這個錯誤重複發生 MaxFailure 次 (次數是在健康狀態監控器中設定),您就會看到類似以下的警告訊息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    請仔細閱讀警告訊息中的資訊。請確認特定 API Proxy 中使用的目標伺服器已達到 MaxFailure 計數,您目前遇到 503 回應代碼,且錯誤代碼為 NoActiveTargets。

  4. 健康狀態檢查傳回警告訊息:
    HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
          

    上述警告訊息指出,健康狀態檢查 API 的預期回應碼為 200,但實際收到的回應為 404。因此系統會將此視為失敗。

  5. 在調查健康狀態檢查 API 傳回錯誤回應的原因之前,請先判斷 Edge 為何預期健康狀態檢查 API 的回應代碼為 200。為此,請檢查目標端點設定中目標伺服器的健康狀態監控器設定:

    健康狀態監控設定

    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
       	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>443</Port>
          <Verb>GET</Verb>
          <Path>/status/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            

    請注意,健康狀態監控設定是在 <SuccessResponse> 元素下設定 200 回應代碼。 也就是說,如果 Edge 從健康狀態檢查 API 取得 200 以外的回應代碼 (例如 400、401、404、500),就會視為錯誤並增加失敗次數。

  6. 現在,如要調查健康狀態檢查 API 傳回錯誤回應的原因,請按照下列步驟操作:
    1. 查看訊息處理器記錄中的警告訊息之前的訊息。
      Apigee-Timer-7 INFO  SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
                

      請記下這則訊息中的健康檢查網址。

    2. 您可以從訊息處理器直接呼叫這個網址,並檢查實際回應
      curl -i https://mocktarget.apigee.net:443/status/200
                

      上述呼叫的回應會提供 404,如訊息處理器記錄所示:

      < HTTP/2 404
                
    3. 這表示即使直接呼叫健康狀態檢查網址,也會失敗並傳回相同的 404 回應代碼。 這表示健康狀態檢查網址可能不正確,或網址存取的資源已無法使用。
    4. 在上述健康狀態檢查 API 範例中,問題是因為健康狀態監控設定中使用了不正確的網址。 正確的網址為 https://mocktarget.apigee.net:443/statuscode/200,來自「模擬目標 API」。
  7. 如果收到其他錯誤回應,請按照上述步驟判斷原因。如有需要,請與後端團隊合作。

解析度

  1. 修正後端伺服器上的健康狀態檢查 API 問題。
  2. 如要修正上述範例中的問題,請按照下列步驟操作:
    1. 將健康狀態監控設定中的 <Path> 元素修改為 /statuscode/200,如下所示:
      <Path>/statuscode/200</Path>
              
    2. 儲存 API Proxy 中的變更。

如果問題仍未解決,請參閱「必須收集的診斷資訊」。

使用 API 監控功能診斷問題

API 監控功能可協助您快速找出問題領域,診斷錯誤、效能和延遲問題,以及問題來源 (例如開發人員應用程式、API Proxy、後端目標或 API 平台)。

逐步瞭解範例情境,瞭解如何使用 API 監控功能排解 API 的 5xx 問題。舉例來說,您可能想設定快訊,在messaging.adaptors.http.flow.NoActiveTargets故障次數超過特定門檻時收到通知。

必須收集診斷資訊

如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊。請與 Apigee 支援團隊聯絡並提供下列資訊:

  1. 如果您是公有雲使用者,請提供下列資訊:
    1. 機構名稱
    2. 環境名稱
    3. API Proxy 名稱
    4. 完成 curl 指令,重現錯誤
    5. 包含要求 (503 Service Unavailable) 的追蹤記錄檔,錯誤代碼為 NoActiveTargets
  2. 如果您是 Private Cloud 使用者,請提供下列資訊:
    1. 出現的完整錯誤訊息
    2. 環境名稱
    3. API Proxy 套裝組合
    4. 包含要求 (503 Service Unavailable) 的追蹤記錄檔,錯誤代碼為 NoActiveTargets
    5. NGINX 存取記錄

      (/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log)

    6. 訊息處理器記錄

      (/opt/apigee/var/log/edge-message-processor/logs/system.log)