503 服務無法使用 - 後端伺服器必須關閉

您目前查看的是 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,請按照下列步驟操作:

  1. 如果問題仍未解決,請為受影響的 API 啟用 追蹤工作階段。
  2. 發出 API 呼叫並重現問題 - 503 Service Unavailable 錯誤代碼為 messaging.adaptors.http.flow.ServiceUnavailable.
  3. 選取其中一個失敗的要求。
  4. 前往 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.ServiceUnavailable,請記下這類要求的一或多個訊息 ID,如下例所示:

    顯示 503 錯誤的範例項目

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

原因:目標伺服器過早關閉連線

診斷

  1. 如果您是公有雲或私有雲使用者:
    1. 使用「追蹤」工具 (如「常見診斷步驟」一文所述), 並確認「Analytics Data Recorded」(已記錄的 Analytics 資料) 窗格中已設定下列兩項:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

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

      alt_text

    3. 如要進一步調查,請參閱「使用 tcpdump」。
  2. 如果您是 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 pipe

      2021-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

  1. 使用下列指令,在後端伺服器或訊息處理器中擷取 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
    
  2. 分析擷取的 tcpdump:

    tcpdump 輸出內容範例 (在訊息處理器上收集):

    alt_text

    在上述 tcpdump 中,您可以看到下列內容:

    1. 在封包 4 中,訊息處理器將 POST 要求傳送至後端伺服器。
    2. 在封包 5、8、 9、10、11 中,訊息處理器持續將要求酬載傳送至後端伺服器。
    3. 在封包 6 和 7 中,後端伺服器會針對從訊息處理器收到的部分要求酬載,以 ACK 回應。
    4. 不過,在封包 12 中,後端伺服器並未針對收到的應用程式資料封包回應 ACK,隨後也未回應回應酬載,而是回應 FIN ACK,啟動連線關閉程序。
    5. 這清楚顯示後端伺服器過早關閉連線,而訊息處理器仍在傳送要求酬載。
    6. 這會導致訊息處理器記錄 IOException: Broken Pipe 錯誤,並將 503 傳回給用戶端

解析度

  1. 請與應用程式和網路團隊合作,分析並修正後端伺服器過早中斷連線的問題。
  2. 請確保後端伺服器應用程式不會在收到完整的要求酬載之前,逾時或重設連線。
  3. 如果 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在發生錯誤時,訊息處理器和後端伺服器上收集到的資訊