您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 HTTP 回應狀態 503,以及 API Proxy 呼叫後傳送的訊息 Service Unavailable。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 503 Service Unavailable
此外,您可能會看到下列錯誤訊息:
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}可能原因
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
|---|---|---|
| 目標伺服器過早關閉連線 | 訊息處理器仍在傳送要求酬載時,目標伺服器過早結束連線。 | Edge 公有和私有雲使用者 |
常見的診斷步驟
找出失敗要求訊息的 ID
追蹤工具
如要使用「追蹤」工具判斷失敗要求的訊息 ID,請按照下列步驟操作:
- 如果問題仍未解決,請為受影響的 API 啟用 追蹤工作階段。
- 發出 API 呼叫並重現問題 -
503 Service Unavailable錯誤代碼為messaging.adaptors.http.flow.ServiceUnavailable. - 選取其中一個失敗的要求。
- 前往 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.ServiceUnavailable,請記下這類要求的一或多個訊息 ID,如下例所示:顯示
503錯誤的範例項目
原因:目標伺服器過早關閉連線
診斷
- 如果您是公有雲或私有雲使用者:
- 使用「追蹤」工具 (如「常見診斷步驟」一文所述),
並確認「Analytics Data Recorded」(已記錄的 Analytics 資料) 窗格中已設定下列兩項:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- 使用追蹤工具 (如「常見診斷步驟」一文所述),並在
TARGET_REQ_FLOWstate 屬性後,立即在「Error」(錯誤) 窗格中確認您已設定下列兩項屬性:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- 如要進一步調查,請參閱「使用 tcpdump」。
- 使用「追蹤」工具 (如「常見診斷步驟」一文所述),
並確認「Analytics Data Recorded」(已記錄的 Analytics 資料) 窗格中已設定下列兩項:
- 如果您是 Private Cloud 使用者:
- 判斷失敗要求的訊息 ID。
- 在訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋郵件 ID。 - 您會看到下列其中一個例外狀況:
例外狀況 1:java.io.IOException:寫入管道 ClientOutputChannel 時發生管道中斷
2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy rev:1 messageid:myorg-opdk-test-1-30312-13747-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1 bytesRead=0 bytesWritten=76295 age=2012ms lastIO=2ms isOpen=false)
或
Exception #2: onExceptionWrite exception: {}
java.io.IOException: Broken pipe2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() : ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms lastIO=2 ms isOpen=false.onExceptionWrite exception: {} java.io.IOException: Broken pipe
- 這兩種例外狀況都表示,當訊息處理器仍在將要求酬載寫入後端伺服器時,後端伺服器已提前關閉連線。因此,訊息處理器會擲回
java.io.IOException: Broken pipe例外狀況。 Remote:IP:PORT表示已解析的後端伺服器 IP 位址和通訊埠號碼。- 上述錯誤訊息中的
bytesWritten=76295屬性表示連線過早關閉時,訊息處理器已將76295位元組的酬載傳送至後端伺服器。 - 這個屬性表示訊息處理器尚未從後端伺服器收到任何資料 (回應)。
bytesRead=0 - 如要進一步調查這個問題,請在後端伺服器或訊息處理器上收集
tcpdump,然後按照下文說明進行分析。
使用 tcpdump
-
使用下列指令,在後端伺服器或訊息處理器中擷取
tcpdump:在後端伺服器上收集
tcpdump的指令:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
收集訊息處理器上
tcpdump的指令:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- 分析擷取的
tcpdump:tcpdump 輸出內容範例 (在訊息處理器上收集):

在上述
tcpdump中,您可以看到下列內容:- 在封包
4中,訊息處理器將POST要求傳送至後端伺服器。 - 在封包
5、8、9、10、11中,訊息處理器持續將要求酬載傳送至後端伺服器。 - 在封包
6和7中,後端伺服器會針對從訊息處理器收到的部分要求酬載,以ACK回應。 - 不過,在封包
12中,後端伺服器並未針對收到的應用程式資料封包回應ACK,隨後也未回應回應酬載,而是回應FIN ACK,啟動連線關閉程序。 - 這清楚顯示後端伺服器過早關閉連線,而訊息處理器仍在傳送要求酬載。
- 這會導致訊息處理器記錄
IOException: Broken Pipe錯誤,並將503傳回給用戶端
- 在封包
解析度
- 請與應用程式和網路團隊合作,分析並修正後端伺服器過早中斷連線的問題。
- 請確保後端伺服器應用程式不會在收到完整的要求酬載之前,逾時或重設連線。
- 如果 Apigee 和後端伺服器之間有任何中介網路裝置或層,請確保這些裝置或層不會在收到完整要求酬載之前逾時。
如果問題仍未解決,請參閱「必須收集診斷資訊」。
必須收集診斷資訊
如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl指令,重現503錯誤 - 包含要求和
503 Service Unavailable錯誤的追蹤記錄檔 - 如果目前沒有發生
503錯誤,請提供過去發生503錯誤的時間範圍和時區資訊。
如果您是 Private Cloud 使用者,請提供下列資訊:
- 失敗要求顯示的完整錯誤訊息
- 您觀察到錯誤的機構、環境和 API Proxy 名稱
503 - API Proxy 套裝組合
- 包含發生
503 Service Unavailable錯誤的要求的追蹤記錄檔 - NGINX 存取記錄
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - 訊息處理器記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log - 發生
503錯誤的時間範圍 (含時區資訊) Tcpdumps在發生錯誤時,訊息處理器和後端伺服器上收集到的資訊