502 Bad Gateway - DecompressionFailureAtResponse

ここに表示されているのは 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 の gzip 形式。

RFC1952 GZIP 形式をご覧ください。

単一エンコード deflate

この形式では、deflate 圧縮アルゴリズムで zlib 構造を使用します。

RFC1950 RFC1951. をご覧ください。

複数エンコード

複数エンコード

たとえば、エンコードが 2 回行われる場合は、次のようになります。

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
ヘッダーに表示される順序でペイロードに適用される複数エンコード。

このエラーには、次の原因が考えられます。

原因 説明 トラブルシューティングの実施対象
レスポンス ペイロードの形式が Content-Encoding と一致しない バックエンド/ターゲット サーバーから送信されたレスポンス ペイロードの形式がエンコードされていないか、Content-Encoding ヘッダーで指定されたエンコードと一致していません。 Edge Public Cloud と Private Cloud のユーザー

共通の診断手順

このエラーを診断するには、次のいずれかのツールまたは手法を使用します。

API Monitoring

API Monitoring を使用してエラーを診断するには:

  1. 適切なロールを持つユーザーとして Apigee Edge UI にログインします
  2. 問題を調査する組織に切り替えます。

  3. [分析] > [API Monitoring] > [調査] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. [プロキシ] フィルタが [すべて] に設定されていることを確認します。
  6. [障害コード] を [時間] に対してプロットします。
  7. 次のように、障害コード messaging.adaptors.http.flow.DecompressionFailureAtResponse を含むセルを選択します。

    大きい画像を表示

  8. 次のように、障害コード messaging.adaptors.http.flow.DecompressionFailureAtResponse に関する情報が表示されます。

    大きい画像を表示

  9. [ログを表示] をクリックし、502 エラーで失敗した行を展開します。

    大きい画像を表示

  10. [ログ] ウィンドウで、次の詳細をメモします。
    • ステータス コード: 502
    • 障害ソース: target
    • 障害コード: messaging.adaptors.http.flow.DecompressionFailureAtResponse
  11. 障害ソース の値が target の場合、レスポンス ペイロードの形式が、バックエンド サーバーのレスポンス ヘッダー Content-Encoding で指定された サポート対象のエンコードと一致していません。

Trace ツール

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションを有効にして、次のいずれかを行います。
    1. 502 Bad Gateway エラーが発生するまで待つ。
    2. 問題が再現できる場合は、API 呼び出しを行って 502 Bad Gatewayを再現します。
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したレスポンスのいずれかを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
  5. 通常、エラーは、次の図に示すように、 [Response Received from target server] フェーズの直後のフローにあります。

    大きい画像を表示

  6. トレースからプロパティの値をメモします。

    • Content-Encoding: gzip
    • レスポンス コンテンツの本文: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. [Response Received from target server] フェーズの直後のエラー フェーズに移動します。

    大きい画像を表示

    プロパティをメモします。

    • エラー: 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 レスポンスを受け取ります。

  8. トレースの [Response Sent to Client] フェーズに移動してクリックします。

    大きい画像を表示

    トレースから次の詳細をメモします。

    • ステータス コード: 502 Bad Gateway
    • エラー コンテンツ: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. トレースの [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-codemessaging.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.DecompressionFailureAtResponse
    X-Apigee-fault-source target

原因: レスポンス ペイロードの形式が Content-Encoding と一致しない

デフォルトでは、レスポンス ヘッダー Content-Encoding に有効で サポートされているエンコードが含まれている場合、Apigee Edge は常にペイロードを解凍します。したがって、レスポンス ペイロードの形式は、レスポンス ヘッダー Content-Encoding で指定されたエンコードと一致する 必要があります。不一致がある場合は、このエラーが発生します。

診断

  1. 共通の診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード障害ソース を特定します。
  2. 障害コードmessaging.adaptors.http.flow.DecompressionFailureAtResponse で、 障害ソース の値が target の場合、バックエンド/ターゲット サーバーから送信されたレスポンス ペイロードの形式が、 レスポンス ヘッダー Content-Encoding で指定された サポート対象のエンコードと一致していません。
  3. 次のいずれかの 方法で、HTTP レスポンスの一部として不一致を特定できます。

    エラー メッセージ

    エラー メッセージを使用して検証するには:

    1. Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、 faultstring を参照してください。

      エラー メッセージの例:

      "faultstring":"Decompression failure at response"
    2. 上記のエラー メッセージには "Decompression failure at response" と表示されています。これは、レスポンスContent-Encoding ヘッダーで指定されたエンコードを使用して解凍できなかったことを意味します。

    トレース

    トレースを使用して検証するには:

    1. 共通の診断手順で説明されているように、Trace を使用して Content-Typeerror.cause を特定します。
    2. トレースのサンプル値は次のとおりです。

      • 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 で応答します。

    実際のリクエスト

    実際のリクエストを使用して検証するには:

    ターゲット/バックエンド サーバー アプリケーションに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。

    1. Public Cloud/Private Cloud ユーザーの場合は、バックエンド サーバー自体から、またはバックエンド サーバーにリクエストを送信できる他のマシンから、バックエンド サーバーに直接リクエストを送信します。
    2. Private Cloud ユーザーの場合は、Message Processor のいずれかからバックエンド サーバーにリクエストを送信することもできます。
    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)>
      

      上記のサンプル レスポンスでは、値 gzipContent-Encoding ヘッダーに送信されます。これは、Apigee Edge で サポートされているエンコードです。ただし、 response_payload.zip は zip ファイルとして送信されます。そのため、この レスポンスはエラーコード messaging.adaptors.http.flow.DecompressionFailureAtResponse502 Bad Gatewayエラーで失敗します。

    Message Processor ログ

    Message Processor ログを使用して検証するには:

    Private Cloud ユーザーの場合は、Message Processor ログ を使用して、HTTP 502 エラーに関する重要な情報を確認できます。

    1. Message Processor ログを確認します。

      /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 は、レスポンス ペイロードが 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 checkCaused by: java.util.zip.DataFormatException: incorrect header check は、レスポンス ペイロードが deflate 形式で送信されておらず、deflate の Content-Encoding ヘッダーで指定されたエンコードと一致していないことを示しています。そのため、Apigee Edge は例外をスローし、障害コード messaging.adaptors.http.flow.DecompressionFailureAtResponse502 ステータス コードをクライアント アプリケーションに返します。

解決策

  1. Apigee Edge とバックエンド サーバーの API プロキシ フローで圧縮されたレスポンス ペイロードが必要ない場合は、渡**さないでください** 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 は、次の 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

    ここで: ORGENVPORT# は実際の値に置き換えてください。

  • Message Processor システムログ /opt/apigee/var/log/edge-message-processor/logs/system.log