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

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

在 API Proxy 呼叫後,用戶端應用程式會取得 HTTP 回應狀態 503,以及 Service Unavailable 訊息。

錯誤訊息

用戶端應用程式會取得下列回應代碼:

HTTP/1.1 503 Service Unavailable

此外,您可能會遇到以下錯誤訊息:

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

可能原因

原因 說明 適用的疑難排解指示
目標伺服器太早關閉連線 目標伺服器提早結束連線,而訊息處理器仍在傳送要求酬載。 Edge Public and Private Cloud 使用者

常見診斷步驟

判斷失敗要求的郵件 ID

追蹤工具

如何使用追蹤工具判斷失敗要求的郵件 ID:

  1. 如果問題仍未解決,請為受影響的 API 啟用 追蹤記錄工作階段
  2. 發出 API 呼叫並重現問題:503 Service Unavailable (錯誤代碼 messaging.adaptors.http.flow.ServiceUnavailable.)
  3. 請選取其中一個失敗的要求。
  4. 前往 AX 階段,在「階段詳細資料」部分向下捲動,判斷要求的訊息 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. 如果 X-Apigee-fault-codeMessaging.adaptors.http.flow.ServiceUnavailable 出現任何 503 錯誤,請留意一或多項這類要求的訊息 ID,如以下範例所示:

    顯示 503 錯誤的範例項目

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

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

診斷

  1. 如果您是公有雲私有雲使用者:
    1. 使用追蹤工具 (如常見診斷步驟所述),並確認您在「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:寫入 Channel 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)
      

      例外狀況 #2:onExceptionWrite 例外狀況:{}
      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. 58 91011 封包中,訊息處理器會繼續將要求酬載傳送至後端伺服器。
    3. 67 封包中,後端伺服器針對訊息處理器接收的部分要求酬載回應了 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 使用者,請提供下列資訊:

  • 觀察失敗要求的完整錯誤訊息
  • 您要觀察到 503 錯誤的機構、環境名稱和 API Proxy 名稱
  • 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