現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください。 情報
内容
クライアント アプリケーションが、API 呼び出しへのレスポンスとして HTTP ステータス コード 502 Bad Gateway
とエラーコード messaging.adaptors.http.flow.DecompressionFailureAtResponse
を受け取ります。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
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 形式をご覧ください。 |
単一のエンコード | デフレート | この形式では、 |
複数のエンコード | 複数のエンコード たとえば、エンコードが 2 回行われる場合は次のようになります。
|
ヘッダーに表示されるとおりの順序で、複数のエンコードがペイロードに適用されます。 |
このエラーには、次のような原因が考えられます。
原因 | 説明 | トラブルシューティングの実施対象 |
---|---|---|
レスポンスのペイロード形式が Content-Encoding と一致しない | バックエンド/ターゲット サーバーから送信されたレスポンス ペイロードの形式が、エンコードされていないか、Content-Encoding ヘッダーで指定されたエンコードと一致していません。 |
Edge Public Cloud ユーザーと Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールや手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題を調査する組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した期間を選択します。
- [プロキシ] フィルタが [すべて] に設定されていることを確認します。
- [Time] に [Fault Code] をプロットします。
次のように、障害コード
messaging.adaptors.http.flow.DecompressionFailureAtResponse
を含むセルを選択します。( 拡大画像を表示)
障害コード
messaging.adaptors.http.flow.DecompressionFailureAtResponse
に関する情報が次のように表示されます。( 拡大画像を表示)
[ログを表示] をクリックし、
502
エラーで失敗した行を開きます。( 拡大画像を表示)
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
502
- 障害ソース:
target
- 障害コード:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
。
- ステータス コード:
- [Fault Source] の値が
target
の場合、レスポンス ペイロードの形式が、バックエンド サーバーのレスポンス ヘッダーContent-Encoding
で指定された サポートされているエンコードと一致しなかったことを示します。
Trace ツール
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gateway
エラーが発生するまで待ちます。- 問題を再現できる場合は、API 呼び出しを行って
502 Bad Gateway
を再現します。
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したレスポンスの 1 つを選択し、トレースを調べます。
- トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
通常、エラーは以下のように、「Response Received from target server」フェーズの直後のフローに表示されます。
( 拡大画像を表示)
-
トレースのプロパティの値をメモします。
- Content-Encoding:
gzip
- レスポンス コンテンツの本文:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
ターゲット サーバーからレスポンスを受信 フェーズの直後にエラー フェーズに進みます。
( 拡大画像を表示)
プロパティに注意してください。
- エラー:
Decompression failure at response
- error.class:
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
error.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 Data Recorded)フェーズに移動し、クリックします。
- [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
で失敗するレスポンスがあるかどうかを検索します。 messaging.adaptors.http.flow.DecompressionFailureAtResponse
の値と一致する X-Apigee-fault-code の502
エラーが見つかった場合は、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 と一致しない
デフォルトでは、レスポンス ヘッダー 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
Trace を使用して検証するには:
- 一般的な診断手順の説明に沿って、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 ファイルとして送信されます。したがって、このレスポンスは502 Bad Gateway
エラー(エラーコード:messaging.adaptors.http.flow.DecompressionFailureAtResponse
)で失敗します。
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 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 として指定されているにもかかわらず、レスポンス ペイロードが 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 は例外をスローし、502
ステータス コードと障害コードmessaging.adaptors.http.flow.DecompressionFailureAtResponse
をクライアント アプリケーションに返します。
-
解像度
- 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 仕様に従って、エラーコード messaging.adaptors.http.flow.DecompressionFailureAtResponse
とともにステータス コード 502 Bad Gateway
を返します。
仕様 |
---|
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