您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
影片
如要進一步瞭解 503 錯誤,請觀看以下影片:
影片 | 說明 |
---|---|
疑難排解並解決 503 服務無法使用 - 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 會停止將其他要求傳送至該特定伺服器。在 LoadBalancer 設定中設定的所有目標伺服器達到 MaxFailure
數量後,後續的 API 要求就會以 503 Service Unavailable 回應,並傳回錯誤代碼 NoActiveTargets.。
使用健康監控工具可讓 Apigee Edge 在健康狀態良好的時,自動將目標伺服器納入輪替作業,而不需重新部署 API Proxy。
以下是健康狀態檢查失敗的可能原因:
原因 | 說明 | 誰可以執行疑難排解步驟 |
---|---|---|
連線逾時錯誤 | 訊息處理器無法在 LoadBalancer 設定中的指定逾時期間內,連線至目標伺服器。 | Edge Private Cloud 使用者 |
透過非安全通訊埠傳送安全要求 |
|
Edge Private Cloud 使用者 |
安全通訊埠的不安全要求 |
|
Edge Private Cloud 使用者 |
Health Check API 回應並顯示錯誤 | 如果健康狀態檢查 API 回應包含錯誤或回應代碼,則除了 Health Monitor 的 SuccessResponse 元素中指定的其他任何內容, | Edge Private Cloud 使用者 |
常見診斷步驟
判斷失敗要求的郵件 ID
追蹤工具
如何使用追蹤工具判斷失敗要求的郵件 ID:
- 啟用追蹤工作階段,發出 API 呼叫並重現問題:503 Service Unavailable 並傳回錯誤代碼 NoActiveTargets。
- 請選取其中一個失敗的要求。
- 前往 AX 階段,在「階段詳細資料」部分向下捲動,判斷要求的訊息 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 錯誤。
- 如果 X-Apigee-fault-codeMessaging.adaptors.http.flow.NoActiveTargets 出現任何 503 錯誤,請注意一或多個這類要求的訊息 ID,如以下範例所示:
顯示 503 錯誤的範例項目
常見錯誤訊息
如果使用目標伺服器,且訊息處理器嘗試與後端伺服器連線時發生錯誤,您會在訊息處理器記錄檔中看到一些常見的錯誤訊息。在實際導致失敗的例外狀況/錯誤訊息結束後,系統會記錄這類錯誤。
在 503 Service Unavailable 中,出現錯誤代碼 NoActiveTargets 的訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中常見的錯誤訊息如下:
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 相對應的常見錯誤訊息。不過,如要取得健康狀態檢查失敗的實際原因,請捲動至這些常見錯誤訊息上方,並檢查是否有任何健康監控錯誤。
舉例來說,下列 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}
請詳閱警告訊息中提供的資訊。確認您在收到 503 回應代碼 (錯誤代碼為 NoActiveTargets) 時,在特定 API Proxy 中使用的目標伺服器已達
MaxFailure
數量。 - 在上述範例中,健康狀態檢查失敗,並出現
connection timed out
錯誤。使用telnet
指令確認是否能從各個訊息處理器直接連線至特定後端伺服器: - 如果您可以連線至後端伺服器,您可能會看到類似「已連線至後端伺服器」的訊息。那麼,這可能是暫時性問題,也可能是已解決或間歇性問題。重複步驟 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 相對應的常見錯誤訊息。
不過,如要取得健康狀態檢查失敗的實際原因,請捲動至這些常見錯誤訊息上方,並檢查是否有任何「健康監控錯誤」。
例如,您可能會看到以下「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}
請詳閱警告訊息中提供的資訊。確認您在收到 503 回應代碼 (錯誤代碼為 NoActiveTargets) 時,在特定 API Proxy 中使用的目標伺服器已達
MaxFailure
數量。 - 健康狀態檢查失敗,並出現以下錯誤:
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),就會收到這個錯誤。請按照下列步驟確認這個問題是否為原因:
- 檢查目標端點設定所用目標伺服器的定義。
- 現在,檢查目標端點設定中目標伺服器的 Health Monitor 設定:
健康監控功能設定
<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>
請注意,上述的 Health Monitor 設定並未指定任何
<Port>
元素。在此情況下,邊緣的訊息處理器會使用目標伺服器定義 (即 80) 中指定的通訊埠執行健康狀態檢查 API 呼叫。 - 根據上述資訊,這個錯誤的原因是目標伺服器已定義為安全伺服器 (如已啟用 SSLInfo 區塊),但卻使用不安全的通訊埠 80。
使用 取得 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>
在上述範例中,根據「SSLInfo」SSLInfo區塊指示,目標伺服器
mocktarget
是安全伺服器。 - 接著,檢查目標端點設定中目標伺服器的 Health Monitor 設定:
健康監控功能設定
<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 會將健康狀態檢查 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:已定義安全目標伺服器,但狀態監控器設定了不安全的通訊埠
如要修正這項錯誤,請按照下列說明操作:
- 將 Health Monitor 設定修改為使用安全通訊埠 (例如: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>
- 儲存對 API Proxy 所做的變更。
原因:透過安全通訊埠進行不安全的要求
診斷
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜尋訊息 ID。 - 您會看到與訊息 ID 相對應的常見錯誤訊息。不過,如要取得健康狀態檢查失敗的實際原因,請捲動至這些常見錯誤訊息上方,並檢查是否有任何「健康監控錯誤」。
例如,您可能會看到以下「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}
請詳閱警告訊息中提供的資訊。確認您在收到 503 回應代碼 (錯誤代碼為 NoActiveTargets) 時,在特定 API Proxy 中使用的目標伺服器已達
MaxFailure
數量。 - 健康狀態檢查失敗,並出現以下錯誤:
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 未正確設定。 - 現在,檢查目標端點設定中目標伺服器的 Health Monitor 設定:
健康監控功能設定
<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>
請注意,上述的 Health Monitor 設定並未指定任何
<Port>
元素。在這種情況下,邊緣的訊息處理器將使用目標伺服器定義中指定的通訊埠,也就是 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 設定「正確」。 - 接著,檢查目標端點設定中目標伺服器的 Health Monitor 設定:
健康監控功能設定
<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>
在上述範例中,根據
<Port>
元素的說明,健康狀態監控器設定了安全通訊埠 443。 - 根據上述資訊,這項錯誤是因為目標伺服器已正確定義為不安全的伺服器 (未定義 SSLInfo 區塊),但健康監控器已設為使用安全通訊埠 443 (在
<Port>
元素指定) 執行健康狀態檢查。在這種情況下,Edge 會將健康狀態檢查視為使用安全通訊埠 443 的不安全呼叫,並失敗,並顯示上述錯誤。
解析度
不安全的目標安全通訊埠
情境 1:使用安全通訊埠定義的不安全目標伺服器
如要修正這個錯誤,請更新目標伺服器定義,改用合適的安全通訊埠。
使用 更新目標伺服器 API 更新目標伺服器定義,並確保使用的是不安全的通訊埠 (例如:80),如以下範例所示:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
不安全的目標安全 HM 通訊埠
情境 2:已定義不安全的目標伺服器,但狀態監控器已設定安全通訊埠
如要修正這項錯誤,請按照下列說明操作:
- 請從 Health Monitor 設定中移除
<Port>
元素,或修改 Health Monitor 設定,藉此使用非安全通訊埠 (例如: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 所做的變更。
原因:Health check 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}
請詳閱警告訊息中提供的資訊。確認您在收到 503 回應代碼 (錯誤代碼為 NoActiveTargets) 時,在特定 API Proxy 中使用的目標伺服器已達
MaxFailure
數量。 - 健康狀態檢查傳回警告訊息:
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。如要這麼做,請檢查目標端點設定中目標伺服器的 Health Monitor 設定:
健康監控功能設定
<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>
請注意,Health Monitor 設定在
<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 範例中,之所以會發生這個問題,是因為 Health Monitor 設定中使用的網址不正確。系統發現 Mock Target API 為
https://mocktarget.apigee.net:443/statuscode/200
的正確網址。 - 如果收到任何其他錯誤回應,請按照上述步驟找出造成相同原因的原因。如有必要,請與後端團隊合作。
解析度
- 修正後端伺服器上的健康狀態檢查 API 問題。
- 如何修正上述範例中的問題:
- 將 Health Monitor 設定中的
<Path>
元素修改為/statuscode/200
,如下所示:<Path>/statuscode/200</Path>
- 將變更儲存至 API Proxy。
如果問題仍未解決,請參閱「收集診斷資訊」一節。
使用 API 監控功能診斷問題
API 監控功能可讓您快速隔離問題區域,以診斷錯誤、效能與延遲問題及其來源 (例如開發人員應用程式、API Proxy、後端目標或 API 平台)。
逐步操作範例情境,示範如何使用 API Monitoring 排解 API 的 5xx 問題。例如,您可以設定快訊,讓系統在 messaging.adaptors.http.flow.NoActiveTargets
錯誤數量超過特定門檻時收到通知。
必須收集診斷資訊
按照上述操作說明操作後,如果問題仍未解決,請收集下列診斷資訊。請與 Apigee 支援團隊聯絡並分享資料:
- 如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成 curl 指令即可重現錯誤
- 包含 503 Service Unavailable 與錯誤代碼 NoActiveTargets 相關要求的追蹤檔
- 如果您是私有雲使用者,請提供下列資訊:
- 發現完整錯誤訊息
- 環境名稱
- 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
)