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

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式收到 HTTP 回應狀態 503 及訊息 Service Unavailable 追蹤 API Proxy 呼叫。

錯誤訊息

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

HTTP/1.1 503 Service Unavailable

此外,您也可能會看到下列錯誤訊息:

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

可能原因

原因 說明 適用的疑難排解操作說明
目標伺服器連線過早 目標伺服器在訊息處理器仍在運作時提前結束連線 傳送要求酬載 邊緣公有雲和私有雲使用者

常見的診斷步驟

找出失敗要求的訊息 ID

追蹤工具

如要使用追蹤工具找出失敗要求的訊息 ID,請按照下列步驟操作:

  1. 如果問題仍未解決,請啟用 追蹤工作階段
  2. 發出 API 呼叫並重現問題 - 503 Service Unavailable 錯誤代碼:messaging.adaptors.http.flow.ServiceUnavailable.
  3. 請選取其中一個失敗的要求。
  4. 前往 AX 階段,然後找出郵件 ID (X-Apigee.Message-ID) 方法是向下捲動, 「Phase Details」部分,如下圖所示。

    「階段詳細資料」部分中的郵件 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-code message.adaptors.http.flow.ServiceUnavailable 有任何 503 錯誤, 記下一或多個這類要求的郵件 ID,如以下範例所示:

    顯示 503 錯誤的範例項目

    範例項目:顯示狀態碼、訊息 ID、錯誤來源和錯誤程式碼

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

診斷

  1. 如果您是公有雲Private Cloud 使用者:
    1. 使用追蹤工具 (如常見診斷步驟中所述) ,然後確認您已在「Analytics 資料記錄」窗格中完成以下兩個設定:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. 使用追蹤工具 (如常見診斷步驟中所述) 然後,檢查您是否在「Error」窗格中完成以下兩個設定, TARGET_REQ_FLOW state 屬性:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. 如要進一步調查,請參閱使用 tcpdump
  2. 如果您是 Private Cloud 使用者:
    • 找出失敗要求的訊息 ID
    • 在訊息處理者記錄中搜尋郵件 ID (/opt/apigee/var/log/edge-message-processor/logs/system.log)。
    • 您會看到下列其中一項例外狀況:

      例外狀況 #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)
      

      例外狀況 #2:onExceptionWrite 例外狀況:{}
      java.io.IOException:管道無效

      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 910 封包中 11,訊息處理器會繼續將要求酬載傳送至 後端伺服器
    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 使用者,請提供下列資訊:

  • 偵測到失敗要求的完整錯誤訊息
  • 要觀察的機構、環境名稱和 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 發生錯誤