ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとしてエラーコード
messaging.adaptors.http.flow.DecompressionFailureAtResponse の HTTP ステータス コード 502 Bad Gateway を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
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ヘッダーで指定されたエンコード形式と一致していません
ただし
これは、ペイロードの形式が
Content-Encoding ヘッダーで指定されたエンコードと同じ形式ではないため、Apigee Edge が指定されたエンコードを使用してペイロードをデコードできないことが原因です。
サポートされている Content-Encoding 値の例と、Apigee Edge
がペイロード表現をどのように想定しているかを以下に示します。
| シナリオ | Content-Encoding | ペイロード表現 |
|---|---|---|
| 単一エンコード | gzip | Unix の |
| 単一エンコード | deflate | この形式では、deflate 圧縮アルゴリズムで |
| 複数エンコード | 複数エンコード たとえば、エンコードが 2 回行われる場合は、次のようになります。
|
ヘッダーに表示される順序でペイロードに適用される複数エンコード。 |
このエラーには、次の原因が考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| レスポンス ペイロードの形式が Content-Encoding と一致しない | バックエンド/ターゲット サーバーから送信されたレスポンス ペイロードの形式がエンコードされていないか、Content-Encoding ヘッダーで指定されたエンコードと一致していません。 |
Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題を調査する組織に切り替えます。
- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
- [プロキシ] フィルタが [すべて] に設定されていることを確認します。
- [障害コード] を [時間] に対してプロットします。
次のように、障害コード
messaging.adaptors.http.flow.DecompressionFailureAtResponseを含むセルを選択します。( 大きい画像を表示)
次のように、障害コード
messaging.adaptors.http.flow.DecompressionFailureAtResponseに関する情報が表示されます。( 大きい画像を表示)
[ログを表示] をクリックし、
502エラーで失敗した行を展開します。( 大きい画像を表示)
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
502 - 障害ソース:
target - 障害コード:
messaging.adaptors.http.flow.DecompressionFailureAtResponse。
- ステータス コード:
- 障害ソース の値が
targetの場合、レスポンス ペイロードの形式が、バックエンド サーバーのレスポンス ヘッダーContent-Encodingで指定された サポート対象のエンコードと一致していません。
Trace ツール
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gatewayエラーが発生するまで待つ。- 問題が再現できる場合は、API 呼び出しを行って
502 Bad Gatewayを再現します。
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したレスポンスのいずれかを選択し、トレースを調べます。
- トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
通常、エラーは、次の図に示すように、 [Response Received from target server] フェーズの直後のフローにあります。
( 大きい画像を表示)
-
トレースからプロパティの値をメモします。
- Content-Encoding:
gzip - レスポンス コンテンツの本文:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
[Response Received from target server] フェーズの直後のエラー フェーズに移動します。
( 大きい画像を表示)
プロパティをメモします。
- エラー:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formaterror.cause は、レスポンス ペイロードが GZIP 形式ではないことを示しています。 これは、Apigee Edge が、
Content-Encodingヘッダーで指定されているように(前の手順で確認)、レスポンス ペイロードが GZIP 形式であることを想定していたことを意味します。そのため、Apigee Edge は gzip を使用してペイロードを解凍できず、エラーDecompression failure at responseを返します。
この場合、ターゲット/バックエンド サーバーからのレスポンスは
200ですが、エラーは Apigee Edge によって返されるため、クライアント アプリケーションは502レスポンスを受け取ります。- エラー:
トレースの [Response Sent to Client] フェーズに移動してクリックします。
( 大きい画像を表示)
トレースから次の詳細をメモします。
- ステータス コード:
502 Bad Gateway。 - エラー コンテンツ:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- ステータス コード:
トレースの [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.DecompressionFailureAtResponseX-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 が
messaging.adaptors.http.flow.DecompressionFailureAtResponseの値と一致する502エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。NGINX アクセスログからの 502 エラーのサンプル:
NGINX アクセスログの上記のサンプル エントリには、 X-Apigee-fault-code と X-Apigee-fault-source: の次の値があります。
レスポンス ヘッダー 値 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
原因: レスポンス ペイロードの形式が Content-Encoding と一致しない
デフォルトでは、レスポンス ヘッダー
Content-Encoding に有効で
サポートされているエンコードが含まれている場合、Apigee Edge は常にペイロードを解凍します。したがって、レスポンス ペイロードの形式は、レスポンス ヘッダー Content-Encoding で指定されたエンコードと一致する 必要があります。不一致がある場合は、このエラーが発生します。
診断
- 共通の診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード と障害ソース を特定します。
- 障害コード が
messaging.adaptors.http.flow.DecompressionFailureAtResponseで、 障害ソース の値がtargetの場合、バックエンド/ターゲット サーバーから送信されたレスポンス ペイロードの形式が、 レスポンス ヘッダーContent-Encodingで指定された サポート対象のエンコードと一致していません。 次のいずれかの 方法で、HTTP レスポンスの一部として不一致を特定できます。
エラー メッセージ
エラー メッセージを使用して検証するには:
-
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。エラー メッセージの例:
"faultstring":"Decompression failure at response"
- 上記のエラー メッセージには
"Decompression failure at response"と表示されています。これは、レスポンス をContent-Encodingヘッダーで指定されたエンコードを使用して解凍できなかったことを意味します。
トレース
トレースを使用して検証するには:
- 共通の診断手順で説明されているように、Trace を使用して Content-Type と error.cause を特定します。
トレースのサンプル値は次のとおりです。
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
レスポンス ヘッダー Content-Encoding の値は gzipですが、レスポンス ペイロードは GZIP 形式ではありません(error.causeで示されています)。そのため、Apigee Edge は
502 Bad Gatewayとエラーコードmessaging.adaptors.http.flow.DecompressionFailureAtResponseで応答します。- Content-Encoding:
実際のリクエスト
実際のリクエストを使用して検証するには:
ターゲット/バックエンド サーバー アプリケーションに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
- Public Cloud/Private Cloud ユーザーの場合は、バックエンド サーバー自体から、またはバックエンド サーバーにリクエストを送信できる他のマシンから、バックエンド サーバーに直接リクエストを送信します。
- Private Cloud ユーザーの場合は、Message Processor のいずれかからバックエンド サーバーにリクエストを送信することもできます。
- バックエンド サーバーから送信されたレスポンスを調べて、レスポンス ヘッダー
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ヘッダーに送信されます。これは、Apigee Edge で サポートされているエンコードです。ただし、response_payload.zipは zip ファイルとして送信されます。そのため、この レスポンスはエラーコードmessaging.adaptors.http.flow.DecompressionFailureAtResponseの502 Bad Gatewayエラーで失敗します。
Message Processor ログ
Message Processor ログを使用して検証するには:
Private Cloud ユーザーの場合は、Message Processor ログ を使用して、HTTP
502エラーに関する重要な情報を確認できます。Message Processor ログを確認します。
/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 formatoccurred 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は、レスポンス ペイロードが GZIP 形式で送信されていないことを示しています。これは、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は、レスポンス ペイロードが deflate 形式で送信されておらず、deflate のContent-Encodingヘッダーで指定されたエンコードと一致していないことを示しています。そのため、Apigee Edge は例外をスローし、障害コードmessaging.adaptors.http.flow.DecompressionFailureAtResponseの502ステータス コードをクライアント アプリケーションに返します。
-
解決策
- Apigee Edge とバックエンド サーバーの API プロキシ フローで圧縮されたレスポンス ペイロードが必要ない場合は、渡**さないでください**
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 は、次の RFC 仕様に従って、ステータス コード 502 Bad Gateway とエラーコード
messaging.adaptors.http.flow.DecompressionFailureAtResponse で応答します。
| 仕様 |
|---|
| RFC 7231、セクション 6.5.1 |
| RFC 7231、セクション 3.1.2.2 |
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
502エラーを再現するために使用した完全なcurlコマンド- API レスポンスのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したレスポンスで確認された完全なエラー メッセージ
- 環境名
- API プロキシ バンドル
- API レスポンスのトレース ファイル
NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logここで: ORG、ENV、PORT# は実際の値に置き換えてください。
- Message Processor システムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log