502 閘道錯誤 - DecompressionFailureAtResponse

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

問題

用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway 和錯誤代碼 messaging.adaptors.http.flow.DecompressionFailureAtResponse 做為 API 回應 呼叫。

錯誤訊息

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

HTTP/1.1 502 Bad Gateway

此外,您可能也會看到類似以下的錯誤訊息:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

可能原因

只有在下列情況下才會發生這個錯誤:

  • HTTP 回應 (來自後端/目標伺服器) 標頭中指定的編碼 Content-Encoding 有效, 目前由 Apigee Edge 支援
  • 但是

  • 後端/目標伺服器在 HTTP 回應中傳送的酬載格式 不必 符合 Content-Encoding 標頭中指定的編碼格式

這是因為 Apigee Edge 無法使用指定的編碼解碼酬載,因為 酬載的格式與 Content-Encoding 標頭。

以下列舉幾個支援 Content-Encoding 值和 Apigee Edge 方式的範例。 預期酬載表示法會發生在以下情況:

情境 Content-Encoding 酬載表示法
單一編碼 gzip

Unix gzip 格式。

詳情請見 RFC1952 GZIP 格式

單一編碼 延遲

這種格式使用 zlib 結構搭配延遲壓縮演算法。

詳情請參閱 RFC1950 RFC1951.

多重編碼

多重編碼

例如,若編碼作業完成兩次,則可能出現以下情形:

  • gzip, deflate
  • gzip、gzip
  • deflate、gzip
  • deflate, deflate
多重編碼會依照標頭中的特定順序套用於酬載。

造成這項錯誤的可能原因如下:

原因 說明 適用的疑難排解操作說明
回應酬載格式與 Content-Encoding 不符 後端/目標伺服器傳送的回應酬載格式為 未編碼或未編碼 與 Content-Encoding 標頭中指定的編碼相符。 邊緣公有雲和私有雲使用者

常見的診斷步驟

請使用下列其中一項工具/技巧診斷這個錯誤:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 以下列使用者身分登入 Apigee Edge UI 擔任適當角色
  2. 切換到您要調查問題的機構。

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 確認「Proxy」篩選器已設為「All」。
  6. 根據「時間」繪製「Fault Code」指標。
  7. 選取含有錯誤程式碼 messaging.adaptors.http.flow.DecompressionFailureAtResponse 的儲存格 如下所示:

    ( 查看較大的圖片)

  8. 錯誤程式碼相關資訊 messaging.adaptors.http.flow.DecompressionFailureAtResponse 顯示如下:

    ( 查看較大的圖片)

  9. 按一下「查看記錄」,然後展開出現 502 錯誤的資料列。

    ( 查看較大的圖片)

  10. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: messaging.adaptors.http.flow.DecompressionFailureAtResponse
  11. 如果「Fault Source」的值為 target,則代表 回應酬載格式與 後端伺服器的回應標頭中指定的支援編碼 Content-Encoding

追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段 和下列其中一項:
    1. 等待 502 Bad Gateway 錯誤發生,或
    2. 如果可以重現問題,請發出 API 呼叫並重現問題 502 Bad Gateway
  2. 確保已啟用「Show all FlowInfos」

  3. 請選取其中一個失敗回應並檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
  5. 一般而言,您通常會在 已從目標伺服器收到的回應階段,如下所示:

    ( 查看較大的圖片)

  6. 請注意追蹤記錄中的屬性值:

    • 內容編碼: gzip
    • 回應內容內文: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. 前往已從目標伺服器收到回應之後,前往錯誤階段 階段:

    ( 查看較大的圖片)

    請注意屬性:

    • 錯誤: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      error.cause 指出回應酬載並非採用 GZIP 格式。 這表示 Apigee Edge 預期回應酬載採用的是 GZIP 格式 是在 Content-Encoding 標頭中指定 (於 因此,Apigee Edge 無法使用 gzip 解壓縮酬載,並將 錯誤 Decompression failure at response

    請注意,在這個例子中,目標/後端伺服器的回應是 200 case;不過,用戶端應用程式會接收 502 ,因為該錯誤是由 Apigee Edge 傳回。

  8. 前往追蹤記錄中的「Response Sent to Client」階段,然後按一下該階段。

    ( 查看較大的圖片)

    請注意下列追蹤記錄詳細資料:

    • 狀態碼: 502 Bad Gateway
    • 錯誤內容: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. 前往追蹤記錄中的「AX」AX(已記錄的 Analytics 資料) 階段 然後按一下

  10. 向下捲動至「Phase Details」、「Error Headers」部分,然後 確定 X-Apigee-fault-codeX-Apigee-fault-source 的值 如下所示:

    ( 查看較大的圖片)

  11. 您會看到 X-Apigee-fault-codeX-Apigee-fault-source 的值。 使用身分:messaging.adaptors.http.flow.DecompressionFailureAtResponsetarget,表示回應酬載格式與 Content-Encoding 標頭中指定的編碼方式。
    回應標頭
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄 來判斷 HTTP 502 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為實際值。

  3. 搜尋,查看在特定期間是否有任何 502 錯誤 (如果問題是過去發生),或是仍有其他回應失敗 502
  4. 如果發現任何含有 X-Apigee-fault-code502 錯誤 與 messaging.adaptors.http.flow.DecompressionFailureAtResponse 的值相符 然後判斷 X-Apigee-fault-source. 的價值。

    NGINX 存取記錄中的 502 錯誤示例:

    上述 NGINX 存取記錄的範例項目如下 X-Apigee-fault-code X-Apigee-fault-code

    回應標頭
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

原因:回應酬載格式與 Content-Encoding 不符

根據預設,如果回應標頭,Apigee Edge 一律會解壓縮酬載 Content-Encoding 包含有效和 支援的編碼方式。因此,回應酬載的格式應是 應與回應標頭 Content-Encoding 中指定的編碼相符。 如果有不相符的項目,就會收到這則錯誤訊息。

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟
  2. 如果「Fault Code」顯示為 messaging.adaptors.http.flow.DecompressionFailureAtResponse和 「Fault Source」的值為 target,則這個值為 表示後端/目標伺服器傳送的回應酬載格式與 回應標頭 Content-Encoding 中指定的支援編碼
  3. 您可以使用下列其中一種方法判斷 HTTP 回應中的不符情形 方法:

    錯誤訊息

    如何使用錯誤訊息進行驗證:

    1. 如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱 faultstring

      錯誤訊息示例:

      "faultstring":"Decompression failure at response"
      
    2. 在上述錯誤訊息中 "Decompression failure at response",表示回應 無法使用 Content-Encoding 標頭。

    Trace

    如何使用 Trace 進行驗證:

    1. 決定 Content-Typeerror.cause。 使用 Trace 功能,詳情請參閱「常見診斷步驟」一文。
    2. 追蹤記錄的值如下:

      • 內容編碼: gzip
      • error.cause: Not in GZIP format

      回應標頭 Content-Encoding 中的值是 gzip。 但回應酬載不是 GZIP 格式 (如 error.cause 所示)。因此,Apigee Edge 會以 502 Bad Gateway 和錯誤代碼 messaging.adaptors.http.flow.DecompressionFailureAtResponse

    實際要求

    如要使用實際要求進行驗證,請按照下列步驟操作:

    如果您可以存取對目標/後端伺服器提出的實際要求 應用程式,然後執行下列步驟:

    1. 如果您是公用 Cloud/Private Cloud 使用者,請提出要求 或從後端伺服器本身 即可向後端伺服器發出要求。
    2. 如果您是 Private Cloud 使用者,也可以提出要求 將要求傳送至後端伺服器
    3. 檢查後端伺服器傳送的回應,並判斷其值 傳入回應標頭 Content-Encoding.
    4. 決定做為要求中傳送的酬載格式。
    5. 如果 Content-Encoding 標頭的值在 支援的編碼方式,但回應酬載的格式, 與 Content-Encoding 標頭中指定的編碼不符, 這就是問題的原因

      範例:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      上述回應範例會將 gzip 值傳送至 Content-Encoding 標頭 支援的編碼方式。不過, 「response_payload.zip」是以 ZIP 檔案的形式傳送。因此 回應失敗,並傳回 502 Bad Gateway 錯誤,錯誤代碼: messaging.adaptors.http.flow.DecompressionFailureAtResponse

    訊息處理器記錄

    如何使用訊息處理器記錄進行驗證:

    如果您是 Private Cloud 使用者,可以使用訊息處理者記錄檔 來判斷 HTTP 502 錯誤的相關重要資訊。

    1. 查看訊息處理器記錄:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. 搜尋,查看特定期間是否有任何 502 錯誤 時間長度 (如果問題是過去發生) 或是否有任何回應 仍因 502 失敗您可能會使用以下搜尋字串:

      grep -ri "ZipException"
      
    3. 您會看到 system.log 中的幾行內容:

      情境 1

      情境 #1:如果 API 回應包含 Content-Encoding: gzip

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      上述錯誤訊息的第 java.util.zip.ZipException: Not in GZIP format 行表示回應 雖然 Content-Encoding 指定為 gzip因此,Apigee Edge 會擲回例外狀況, 傳回含有錯誤代碼的 502 狀態碼 messaging.adaptors.http.flow.DecompressionFailureAtResponse

      情境 2

      情境 #2:當 API 回應包含 Content-Encoding: deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      線條 java.util.zip.ZipException: incorrect header checkCaused by: java.util.zip.DataFormatException: incorrect header check ,表示在 定義格式,且與 Content-Encoding 標頭已延後。因此,Apigee Edge 擲回例外狀況並傳回 502 狀態碼,包括 錯誤代碼 messaging.adaptors.http.flow.DecompressionFailureAtResponse

解析度

  1. 如果 Apigee Edge 中的 API Proxy 流程不需要使用壓縮回應酬載 在後端伺服器中,則「不要」傳遞標頭 Content-Encoding。 如果需要壓縮回應酬載,請跳至步驟 2。
  2. 如果需要壓縮回應酬載,請確認後端伺服器 一律傳送下列資訊:
    • 任何 支援的編碼Content-Encoding 則回應
    • Apigee Edge 支援格式的回應酬載與編碼 Content-Encoding 標頭中指定的格式
  3. 在上例中,回應酬載採用 ZIP 格式,但回應標頭 會指定 Content-Encoding: gzip。如要修正問題,請傳送回覆 Content-Encoding: gzip 做為標頭,以及 gzip 中的回應酬載 格式:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

規格

Apigee Edge 會以狀態碼 502 Bad Gateway 回應 根據下列 RFC 定義 messaging.adaptors.http.flow.DecompressionFailureAtResponse 規格:

規格
RFC 7231,6.5.1 節
RFC 7231,3.1.2.2 節

如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。

必須收集診斷資訊

收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:

如果您是公有雲使用者,請提供下列資訊:

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令 (用來重現 502 錯誤)
  • API 回應的追蹤檔

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 偵測到失敗回應的完整錯誤訊息
  • 環境名稱
  • API Proxy 套裝組合
  • API 回應的追蹤檔
  • NGINX 存取記錄 /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為 實際價值

  • 訊息處理器系統記錄:/opt/apigee/var/log/edge-message-processor/logs/system.log