502 Bad Gateway - DecompressionFailureAtResponse

現在、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 の gzip 形式。

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

単一のエンコード デフレート

この形式では、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. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [プロキシ] フィルタが [すべて] に設定されていることを確認します。
  6. [Time] に [Fault Code] をプロットします。
  7. 次のように、障害コード messaging.adaptors.http.flow.DecompressionFailureAtResponse を含むセルを選択します。

    拡大画像を表示

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

    拡大画像を表示

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

    拡大画像を表示

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

Trace ツール

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

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

  3. 失敗したレスポンスの 1 つを選択し、トレースを調べます。
  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. ターゲット サーバーからレスポンスを受信 フェーズの直後にエラー フェーズに進みます。

    拡大画像を表示

    プロパティに注意してください。

    • エラー: 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 Data Recorded)フェーズに移動し、クリックします。

  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. messaging.adaptors.http.flow.DecompressionFailureAtResponse の値と一致する X-Apigee-fault-code502 エラーが見つかった場合は、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 で指定されたエンコードと一致する必要があります。不一致があると、このエラーが発生します。

診断

  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 ヘッダーで指定されたエンコードを使用してレスポンスを解凍できなかったことを示します。

    Trace

    Trace を使用して検証するには:

    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 ファイルとして送信されます。したがって、このレスポンスは 502 Bad Gateway エラー(エラーコード: messaging.adaptors.http.flow.DecompressionFailureAtResponse)で失敗します。

    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 行は、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 をクライアント アプリケーションに返します。

解像度

  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 仕様に従って、エラーコード 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

    ここでORGENVPORT# は実際の値に置き換えられます。

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