查看 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 詳情請見 RFC1952 GZIP 格式。 |
單一編碼 | 延遲 | 這種格式使用 |
多重編碼 | 多重編碼 例如,若編碼作業完成兩次,則可能出現以下情形:
|
多重編碼會依照標頭中的特定順序套用於酬載。 |
造成這項錯誤的可能原因如下:
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
回應酬載格式與 Content-Encoding 不符 | 後端/目標伺服器傳送的回應酬載格式為
未編碼或未編碼
與 Content-Encoding 標頭中指定的編碼相符。 |
邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 確認「Proxy」篩選器已設為「All」。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
messaging.adaptors.http.flow.DecompressionFailureAtResponse
的儲存格 如下所示:( 查看較大的圖片)
錯誤程式碼相關資訊
messaging.adaptors.http.flow.DecompressionFailureAtResponse
顯示如下:( 查看較大的圖片)
按一下「查看記錄」,然後展開出現
502
錯誤的資料列。( 查看較大的圖片)
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
502
- 錯誤來源:
target
- 錯誤代碼:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
。
- 狀態碼:
- 如果「Fault Source」的值為
target
,則代表 回應酬載格式與 後端伺服器的回應標頭中指定的支援編碼Content-Encoding
。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段
和下列其中一項:
- 等待
502 Bad Gateway
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫並重現問題
502 Bad Gateway
。
- 等待
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗回應並檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
一般而言,您通常會在 已從目標伺服器收到的回應階段,如下所示:
( 查看較大的圖片)
-
請注意追蹤記錄中的屬性值:
- 內容編碼:
gzip
- 回應內容內文:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- 內容編碼:
前往已從目標伺服器收到回應之後,前往錯誤階段 階段:
( 查看較大的圖片)
請注意屬性:
- 錯誤:
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 傳回。- 錯誤:
前往追蹤記錄中的「Response Sent to Client」階段,然後按一下該階段。
( 查看較大的圖片)
請注意下列追蹤記錄詳細資料:
- 狀態碼:
502 Bad Gateway
。 - 錯誤內容:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- 狀態碼:
前往追蹤記錄中的「AX」AX(已記錄的 Analytics 資料) 階段 然後按一下
- 向下捲動至「Phase Details」、「Error Headers」部分,然後
確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值
如下所示:
( 查看較大的圖片)
- 您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值。
使用身分:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
和target
,表示回應酬載格式與Content-Encoding
標頭中指定的編碼方式。回應標頭 值 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄
來判斷 HTTP
502
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中: ORG、ENV 和 PORT# 會替換為實際值。
- 搜尋,查看在特定期間是否有任何
502
錯誤 (如果問題是過去發生),或是仍有其他回應失敗502
。 如果發現任何含有 X-Apigee-fault-code 的
502
錯誤 與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
中指定的編碼相符。
如果有不相符的項目,就會收到這則錯誤訊息。
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟。
- 如果「Fault Code」顯示為
messaging.adaptors.http.flow.DecompressionFailureAtResponse
和 「Fault Source」的值為target
,則這個值為 表示後端/目標伺服器傳送的回應酬載格式與 回應標頭Content-Encoding
中指定的支援編碼。 您可以使用下列其中一種方法判斷 HTTP 回應中的不符情形 方法:
錯誤訊息
如何使用錯誤訊息進行驗證:
-
如果您可以存取 Apigee Edge 收到的完整錯誤訊息, 請參閱
faultstring
。錯誤訊息示例:
"faultstring":"Decompression failure at response"
- 在上述錯誤訊息中
"Decompression failure at response"
,表示回應 無法使用Content-Encoding
標頭。
Trace
如何使用 Trace 進行驗證:
實際要求
如要使用實際要求進行驗證,請按照下列步驟操作:
如果您可以存取對目標/後端伺服器提出的實際要求 應用程式,然後執行下列步驟:
- 如果您是公用 Cloud/Private Cloud 使用者,請提出要求 或從後端伺服器本身 即可向後端伺服器發出要求。
- 如果您是 Private Cloud 使用者,也可以提出要求 將要求傳送至後端伺服器
- 檢查後端伺服器傳送的回應,並判斷其值
傳入回應標頭
Content-Encoding.
- 決定做為要求中傳送的酬載格式。
- 如果
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
錯誤的相關重要資訊。查看訊息處理器記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log
搜尋,查看特定期間是否有任何
502
錯誤 時間長度 (如果問題是過去發生) 或是否有任何回應 仍因502
失敗您可能會使用以下搜尋字串:grep -ri "ZipException"
您會看到 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() : Exceptionjava.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 check
和Caused by: java.util.zip.DataFormatException: incorrect header check
,表示在 定義格式,且與Content-Encoding
標頭已延後。因此,Apigee Edge 擲回例外狀況並傳回502
狀態碼,包括 錯誤代碼messaging.adaptors.http.flow.DecompressionFailureAtResponse
。
-
解析度
- 如果 Apigee Edge 中的 API Proxy 流程不需要使用壓縮回應酬載
在後端伺服器中,則「不要」傳遞標頭
Content-Encoding
。 如果需要壓縮回應酬載,請跳至步驟 2。 - 如果需要壓縮回應酬載,請確認後端伺服器
一律傳送下列資訊:
- 任何
支援的編碼是
Content-Encoding
則回應 - Apigee Edge 支援格式的回應酬載與編碼
Content-Encoding
標頭中指定的格式
- 任何
支援的編碼是
- 在上例中,回應酬載採用 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
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log