您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
影片
如要進一步瞭解 503 錯誤,請觀看下列影片:
| 影片 | 說明 |
|---|---|
| 排解及解決「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 使用者 |
| 在不安全的連接埠上發出安全要求 |
|
Edge Private Cloud 使用者 |
| 安全通訊埠上的不安全要求 |
|
Edge Private Cloud 使用者 |
| 健康檢查 API 回應錯誤 | 如果健康狀態檢查 API 傳回錯誤或回應代碼,則不符合健康狀態監控器 SuccessResponse 元素中指定的任何項目。 | Edge Private Cloud 使用者 |
常見的診斷步驟
找出失敗要求訊息的 ID
追蹤工具
如要使用「追蹤」工具判斷失敗要求的訊息 ID,請按照下列步驟操作:
- 啟用追蹤工作階段、發出 API 呼叫,然後重現問題 - 503 Service Unavailable,錯誤代碼為 NoActiveTargets。
- 選取其中一個失敗的要求。
- 前往 AX 階段,然後在「Phase Details」(階段詳細資料) 區段中向下捲動,找出要求的訊息 ID (
X-Apigee.Message-ID),如下圖所示。
NGINX 存取記錄
如要使用 NGINX 存取記錄判斷失敗要求的訊息 ID,請按照下列步驟操作:
您也可以參閱 NGINX 存取記錄,判斷 503 錯誤的訊息 ID。 如果問題過去曾發生,或是問題間歇性出現,且您無法在 UI 中擷取追蹤記錄,這個方法就特別實用。請按照下列步驟,從 NGINX 存取記錄檔判斷這項資訊:
- 檢查 NGINX 存取記錄:(
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log) - 在特定時間內,搜尋特定 API Proxy 是否有任何 503 錯誤 (如果問題發生在過去),或是否有任何要求仍因 503 錯誤而失敗。
- 如果出現任何 503 錯誤,並顯示 X-Apigee-fault-code messaging.adaptors.http.flow.NoActiveTargets,請記下其中一或多個這類要求的訊息 ID,如下例所示:
顯示 503 錯誤的範例項目
常見錯誤訊息
使用目標伺服器時,如果訊息處理器嘗試連線至後端伺服器時發生錯誤,訊息處理器記錄檔中就會顯示幾則常見的錯誤訊息。這些錯誤會在導致失敗的實際例外狀況/錯誤訊息之後記錄。
訊息處理器記錄中常見的錯誤訊息 (/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 做為對用戶端的回應。
原因:連線逾時
診斷
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。 - 您會看到與訊息 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。 - 在上述範例中,健康狀態檢查失敗,並出現
connection timed out錯誤。 使用telnet指令,檢查是否能從每個 Message Processor 直接連線至特定後端伺服器: - 如果可以連線至後端伺服器,您可能會看到「Connected to backend-server」(已連線至後端伺服器) 等訊息。那麼問題可能是暫時性的,或許已經解決,也可能是間歇性問題。重複執行步驟 4 幾次 (10 次以上),並驗證輸出內容。
- 如果
telnet指令持續沒有錯誤,表示問題已解決。重新檢查健康狀態檢查失敗是否已停止。如果是,則無須採取任何進一步行動。 - 如果無法使用
telnet指令間歇性連線至後端伺服器,可能是網路問題,或是後端伺服器忙碌中。 - 如果無法使用
telnet指令連線至後端伺服器,可能是因為特定後端伺服器上的訊息處理器不允許流量。
telnet <BackendServer-HostName> 443
解析度
如果持續出現 connection timed out 錯誤,請確認後端伺服器沒有任何防火牆限制,且允許來自 Apigee Edge 訊息處理器的流量。舉例來說,在 Linux 上,您可以使用 iptables,允許後端伺服器上的訊息處理器 IP 位址傳送流量。
如果問題仍未解決,請與網路管理員合作,找出並修正問題。 如需 Apigee 的進一步協助,請與 Apigee 支援團隊聯絡。
原因:在不安全的連接埠上提出安全要求
診斷
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。 - 您會看到與訊息 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。 - 健康狀態檢查失敗,錯誤如下:
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),就會收到這項錯誤。請按照下列步驟確認問題是否為此原因所致:
- 檢查目標端點設定中使用的目標伺服器定義。
- 現在,請檢查目標端點設定中目標伺服器的健康狀態監控設定:
健康狀態監控設定
<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 呼叫。 - 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為安全伺服器 (因為已啟用 SSLInfo 區塊),但使用不安全的通訊埠 80。
使用 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 不安全。保護目標不安全的 HM 連接埠
情境 2:已定義安全目標伺服器,但健康狀態監控器設定為使用不安全的通訊埠
如果您已定義安全目標伺服器,但健康狀態監控器設定的通訊埠並非安全通訊埠 (例如 80),就會收到這則錯誤訊息。請按照下列步驟確認問題是否由此造成:
- 檢查目標端點設定中使用的目標伺服器定義。
使用 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 區塊所示。 - 接著,請檢查目標端點設定中目標伺服器的健康狀態監控器設定:
健康狀態監控設定
<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>元素所示。 - 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為安全伺服器 (因為已啟用 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:已定義安全目標伺服器,但健康狀態監控器設定為使用不安全的通訊埠
如要修正這項錯誤,請按照下列指示操作:
- 修改健康狀態監控器設定,使用安全通訊埠 (例如: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> - 儲存 API Proxy 變更。
原因:安全連接埠上的不安全要求
診斷
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。 - 您會看到與訊息 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。 - 健康狀態檢查失敗,錯誤如下:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server錯誤訊息和網址指出,這個問題的原因是在安全通訊埠 443 上發出不安全的呼叫 (HTTP)。
這個錯誤可能在下列兩種情況中發生:
- 使用安全通訊埠定義不安全的目標伺服器
- 定義不安全的目標伺服器,但健康狀態監控工具設定為使用安全通訊埠
不安全的目標安全通訊埠
情境 1:使用安全通訊埠定義不安全的目標伺服器
如果您定義了不安全的目標伺服器,但使用安全的通訊埠 (例如 443),請按照下列步驟確認問題是否為此原因所致:
- 檢查目標端點設定中使用的目標伺服器定義。
使用 Get TargetServer API 取得目標伺服器定義。
目標伺服器定義輸出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>在上述範例中,定義顯示目標伺服器
mocktarget是不安全的伺服器,因為沒有 SSLInfo 區塊。不過,系統設定有誤,使用了安全的通訊埠 443。 - 現在,請檢查目標端點設定中目標伺服器的健康狀態監控設定:
健康狀態監控設定
<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)。 - 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為不安全的伺服器 (因為未定義 SSLInfo 區塊),但使用安全的通訊埠 443。
也就是說,Edge 會以非安全呼叫的形式,透過安全通訊埠 443 進行健康狀態檢查,並因上述錯誤而失敗。
不安全的目標安全 HM 連接埠
情境 2:定義不安全的目標伺服器,但健康狀態監控器設定為使用安全通訊埠
如果您定義了不安全的目標伺服器,但健康狀態監控器設定了安全通訊埠 (例如 443),就會收到這項錯誤。請按照下列步驟確認問題是否為此原因所致:
- 檢查目標端點設定中使用的目標伺服器定義。
使用 Get TargetServer API 取得目標伺服器定義。
目標伺服器定義輸出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>在上述範例中,定義顯示目標伺服器
mocktarget是不安全的伺服器 (因為沒有 SSLInfo 區塊),且已正確設定不安全的通訊埠 80。 - 接著,請檢查目標端點設定中目標伺服器的健康狀態監控器設定:
健康狀態監控設定
<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>元素所示。 - 根據上述資訊,造成這項錯誤的原因是目標伺服器定義為不安全的伺服器 (因為未定義 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:定義不安全的目標伺服器,但健康狀態監控器設定為安全通訊埠
如要修正這項錯誤,請按照下列指示操作:
- 請從健康狀態監控設定中移除
<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> - 儲存 API Proxy 變更。
原因:健康狀態檢查 API 回應錯誤
診斷
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋訊息 ID。 - 您會看到與訊息 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。 - 健康狀態檢查傳回警告訊息:
HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404上述警告訊息指出,健康狀態檢查 API 的預期回應碼為 200,但實際收到的回應為 404。因此系統會將此視為失敗。
- 在調查健康狀態檢查 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),就會視為錯誤並增加失敗次數。 - 現在,如要調查健康狀態檢查 API 傳回錯誤回應的原因,請按照下列步驟操作:
- 查看訊息處理器記錄中的警告訊息之前的訊息。
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200請記下這則訊息中的健康檢查網址。
- 您可以從訊息處理器直接呼叫這個網址,並檢查實際回應
curl -i https://mocktarget.apigee.net:443/status/200上述呼叫的回應會提供 404,如訊息處理器記錄所示:
< HTTP/2 404 - 這表示即使直接呼叫健康狀態檢查網址,也會失敗並傳回相同的 404 回應代碼。 這表示健康狀態檢查網址可能不正確,或網址存取的資源已無法使用。
- 在上述健康狀態檢查 API 範例中,問題是因為健康狀態監控設定中使用了不正確的網址。
正確的網址為
https://mocktarget.apigee.net:443/statuscode/200,來自「模擬目標 API」。 - 如果收到其他錯誤回應,請按照上述步驟判斷原因。如有需要,請與後端團隊合作。
解析度
- 修正後端伺服器上的健康狀態檢查 API 問題。
- 如要修正上述範例中的問題,請按照下列步驟操作:
- 將健康狀態監控設定中的
<Path>元素修改為/statuscode/200,如下所示:<Path>/statuscode/200</Path> - 儲存 API Proxy 中的變更。
如果問題仍未解決,請參閱「必須收集的診斷資訊」。
使用 API 監控功能診斷問題
API 監控功能可協助您快速找出問題領域,診斷錯誤、效能和延遲問題,以及問題來源 (例如開發人員應用程式、API Proxy、後端目標或 API 平台)。
逐步瞭解範例情境,瞭解如何使用 API 監控功能排解 API 的 5xx 問題。舉例來說,您可能想設定快訊,在messaging.adaptors.http.flow.NoActiveTargets故障次數超過特定門檻時收到通知。
必須收集診斷資訊
如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊。請與 Apigee 支援團隊聯絡並提供下列資訊:
- 如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成 curl 指令,重現錯誤
- 包含要求 (503 Service Unavailable) 的追蹤記錄檔,錯誤代碼為 NoActiveTargets
- 如果您是 Private Cloud 使用者,請提供下列資訊:
- 出現的完整錯誤訊息
- 環境名稱
- API Proxy 套裝組合
- 包含要求 (503 Service Unavailable) 的追蹤記錄檔,錯誤代碼為 NoActiveTargets
- NGINX 存取記錄
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log) - 訊息處理器記錄
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)