503 Service Unavailable - NoActiveTargets - HealthCheckFailures

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

影片

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

影片 說明
疑難排解並解決 503 Service Unavailable - NoActiveTargets 請參閱下列文章:
  • 目標伺服器和健康監控器的重要性
  • 即時疑難排解並解決即時 503 Service Unavailable - NoActiveTargets 健康狀態檢查失敗導致的錯誤

問題

用戶端應用程式收到 HTTP 回應狀態碼 503Service Unavailable 訊息和錯誤代碼 NoActiveTargets API Proxy 要求

錯誤訊息

系統會顯示以下錯誤回應:

HTTP/1.1 503 Service Unavailable
  

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

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

可能原因

系統通常會觀察到 HTTP 回應 503 Service Unavailable 及錯誤代碼 NoActiveTargets 您在 API Proxy 目標端點設定中使用一或多個目標伺服器時。

本教戰手冊涵蓋 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 就不會再向該特定伺服器傳送任何要求。確定所有指定目標後 LoadBalancer 設定中設定的伺服器達到 MaxFailure 數量, API 要求會獲得 503 Service Unavailable 回應,並傳回錯誤代碼 NoActiveTargets.

使用健康狀態監控器可協助 Apigee Edge 自動將目標伺服器加回 並且不必重新部署 API Proxy。

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

原因 說明 誰可以執行疑難排解步驟
連線逾時錯誤 訊息處理器無法在指定的逾時時間內連線到目標伺服器 設定期間。 Edge Private Cloud 使用者
對不安全的通訊埠提交安全要求
  1. 如果目標伺服器已定義為安全伺服器,但與 使用不安全的通訊埠
  2. 如果目標伺服器已定義為安全伺服器,但健康狀態監控器 以便對不安全的通訊埠執行健康狀態檢查。
Edge Private Cloud 使用者
對安全通訊埠提出的不安全要求
  1. 如果目標伺服器定義為不安全的伺服器,但設定不正確 以及安全連接埠
  2. 如果目標伺服器已定義為不安全的伺服器,但健康狀態監控器是 執行健康狀態檢查,以對安全通訊埠執行健康狀態檢查
Edge Private Cloud 使用者
Health Check API 傳回錯誤 如果健康狀態檢查 API 傳回錯誤或回應代碼, 會在健康狀態檢查的 SuccessResponse 元素中指定。 Edge Private Cloud 使用者

常見的診斷步驟

找出失敗要求的訊息 ID

追蹤工具

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

  1. 啟用追蹤工作階段。 發出 API 呼叫,並重現問題 - 503 Service Unavailable 與錯誤代碼 NoActiveTargets
  2. 請選取其中一個失敗的要求。
  3. 前往 AX 階段,找出郵件 ID (X-Apigee.Message-ID) 該要求的資訊,方法是在「Phase Details」部分向下捲動,如下圖所示。

    「階段詳細資料」部分中的郵件 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. 如果 X-Apigee-fault-code message.adaptors.http.flow.NoActiveTargets 中有任何 503 錯誤, 記下一或多個這類要求的郵件 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. 您會看到 常見錯誤訊息。不過 如要取得健康狀態檢查失敗的實際原因,請捲動至這些 常見的錯誤訊息,並檢查是否有任何 HEALTH MONITOR 錯誤。

    舉例來說,如果出現下列 HEALTH MONITOR 錯誤訊息,表示訊息處理器失敗 提出健康狀態檢查 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}
            

    請仔細閱讀警告訊息中提供的資訊。確認 MaxFailure 特定 API Proxy 中所用目標伺服器的數量已達上限 會收到 503 回應代碼及錯誤代碼 NoActiveTargets

  4. 在上述範例中,健康狀態檢查失敗,並發生 connection timed out 錯誤。 檢查您能否直接從各個後端伺服器 使用 telnet 指令的訊息處理器:
  5. telnet <BackendServer-HostName> 443
          
  6. 如果您能連上後端伺服器,可能會看到類似以下內容的訊息: 已連線至後端伺服器。那麼問題也許只是暫時性問題, 也許已解決,或者是間歇性問題重複執行步驟 4 數次 ,然後驗證輸出內容。
    1. 如果 telnet 指令持續沒有錯誤,則問題為 均已解決。重新檢查健康狀態檢查失敗是否已停止。如果支援,您就不必這麼做 它會有什麼影響
    2. 如果無法使用 telnet 指令連線至後端伺服器, 也有可能是網路發生問題,或是後端伺服器處於忙碌狀態。
  7. 如果無法持續使用 telnet 指令連線至後端伺服器, 這可能是因為系統不允許來自特定後端伺服器的訊息處理器流量。

解析度

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

如果問題持續發生,請與網路管理員合作,以判斷並修正問題。 如需 Apigee 的進一步協助,請與 Apigee 支援團隊聯絡。

原因:對不安全的通訊埠提出安全要求

診斷

  1. 找出失敗要求的訊息 ID
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋郵件 ID。
  3. 您會看見與郵件 ID 相對應的常見錯誤訊息。 不過,如要取得健康狀態檢查失敗的實際原因,請捲動至這些 常見的錯誤訊息,並檢查是否有任何 HEALTH MONITOR 錯誤。

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

    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}
            

    請仔細閱讀警告訊息中提供的資訊。確認 MaxFailure 特定 API Proxy 中所用目標伺服器的數量已達上限 會收到 503 回應代碼及錯誤代碼 NoActiveTargets

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

    錯誤訊息和網址會指出造成這個問題的可能原因: 安全呼叫 (HTTPS) 是向不安全的通訊埠 80 發出。

    此錯誤可能會在下列兩種情況中發生:

    • 以不安全的通訊埠定義安全目標伺服器
    • 已定義安全目標伺服器,但健康監控器設定了不安全的通訊埠

    安全目標不安全通訊埠

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

    如果您已定義安全的目標伺服器,但使用了不安全的通訊埠 (例如 80), 。請按照下列步驟操作,確認這是否為這個問題的原因:

    1. 檢查目標端點設定中使用的目標伺服器定義。
    2. 使用 取得 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 的郵件處理器會使用通訊埠 。

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

    安全目標不安全的 HM 通訊埠

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

    如果您已定義安全的目標伺服器,但健康監控器設定了 如果不是安全通訊埠 (例如 80),就會出現這個錯誤訊息。請按照以下步驟進行驗證 造成這個問題的原因:

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

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

      目標伺服器定義輸出內容

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

      在上述範例中,定義顯示目標伺服器 mocktargetSSLInfo 區塊所示的安全伺服器。

    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>
              

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

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

      在這個情況下,Edge 會將健康狀態檢查 API 視為含有不安全呼叫的安全呼叫 通訊埠 80 執行失敗,發生上述錯誤。

解析度

安全目標不安全通訊埠

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

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

使用 更新 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) 執行目標 失敗 API Proxy 的目標端點設定中的伺服器健康狀態檢查,如下所示:
    <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. 您會看到 常見錯誤訊息。 不過,如要取得健康狀態檢查失敗的實際原因,請捲動至這些 常見的錯誤訊息,並檢查是否有任何 HEALTH MONITOR 錯誤。

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

    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}
              

    請仔細閱讀警告訊息中提供的資訊。確認 MaxFailure 特定 API Proxy 中所用目標伺服器的數量已達上限 會收到 503 回應代碼及錯誤代碼 NoActiveTargets

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

    錯誤訊息和網址會指出造成這個問題的可能原因: 非安全呼叫 (HTTP) 則是透過安全通訊埠 443 進行。

    此錯誤可能會在下列兩種情況中發生:

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

    不安全的目標安全通訊埠

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

    如果您定義了不安全的目標伺服器,但使用了安全通訊埠 (例如 443), 就會顯示這則錯誤訊息請按照下列步驟操作,確認這是否為這個問題的原因:

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

      使用 取得 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:未定義不安全的目標伺服器,但健康監控器設定了安全通訊埠

    如果您已定義不安全的目標伺服器,但 Health Monitor 設定了安全通訊埠,例如 443, 就會顯示這則錯誤訊息請按照下列步驟操作,確認這是否為這個問題的原因:

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

      使用 取得 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 變更。

原因:Health check 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}
            

    請仔細閱讀警告訊息中提供的資訊。確認 MaxFailure 特定 API Proxy 中所用目標伺服器的數量已達上限 會收到 503 回應代碼及錯誤代碼 NoActiveTargets

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

    以上警告訊息指出 Health check 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 範例中,之所以發生問題,是因為 Health Monitor 設定中使用的網址不正確。 找到的 https://mocktarget.apigee.net:443/statuscode/200 網址正確無誤 模擬目標 API
  7. 如果收到其他錯誤回應,請按照 步驟。如有必要,請與後端團隊合作。

解析度

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

如果問題仍未解決,請前往 Must Gather Diagnostic Information

使用 API 監控功能診斷問題

API Monitoring 可讓您找出問題所在 迅速診斷錯誤、效能和延遲問題及其來源,例如開發人員 應用程式、API Proxy、後端目標或 API 平台

逐步完成範例情境 ,示範如何使用 API Monitoring 排解 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)