502 Bad Gateway - TooBigBody

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 502 Bad Gateway とエラーコード protocol.http.TooBigBody を受け取ります。

エラー メッセージ

クライアント アプリケーションが次のレスポンス コードを受け取ります。

HTTP/1.1 502 Bad Gateway

また、次のエラー メッセージが表示される場合があります。

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

考えられる原因

このエラーは、HTTP レスポンスの一部としてターゲット/バックエンド サーバーから Apigee Edge に送信されるペイロード サイズが、Apigee Edge で許可されている上限を超えている場合に発生します。

エラーの考えられる原因は次のとおりです。

原因 説明 トラブルシューティングの実施対象
レスポンスのペイロードのサイズが上限を超えています ターゲット/バックエンド サーバーから Apigee への HTTP レスポンスの一部として送信されるペイロード サイズが、Apigee で許容される上限を超えています。 Edge Public Cloud ユーザーと Private Cloud ユーザー
解凍後にレスポンス ペイロードのサイズが上限を超える Apigee への HTTP レスポンスの一部としてターゲット/バックエンド サーバーによって圧縮形式で送信されたペイロード サイズが、Apigee による解凍時に許容されている上限を超えています。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

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

API Monitoring

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

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

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [Proxy] フィルタを選択すると、障害コードを絞り込むことができます。
  6. [Time] に [Fault Code] をプロットします。
  7. 次のように、障害コード protocol.http.TooBigBody を含むセルを選択します。

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

  9. [ログを表示] をクリックし、失敗したリクエストの行を開きます。

  10. [ログ] ウィンドウで、次の詳細情報をメモします。
    • ステータス コード: 502
    • 障害ソース: target
    • 障害コード: protocol.http.TooBigBody
  11. [Fault Source] の値が target で、[Fault Code] の値が protocol.http.TooBigBody の場合、ターゲット/ バックエンド サーバーからの HTTP レスポンスのレスポンス ペイロード サイズが、Apigee Edge で許容される上限を超えていることを示します。

Trace

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

  1. トレース セッションを有効にして、次のいずれかを行います。
    • 502 Bad Gateway エラーが発生するまで待ちます。
    • 問題を再現できる場合は、API 呼び出しを行い、502 Bad Gateway エラーを再現します。
  2. 失敗したリクエストの 1 つを選択し、トレースを調べます。
  3. トレースのさまざまなフェーズを順に確認し、エラーが発生した場所を見つけます。
  4. 次のように、[Response received from target server] フェーズの直後にある「Error」フェーズに移動します。

    トレースでエラーの値をメモします。

    • エラー: Body buffer overflow
    • error.class: com.apigee.errors.http.server.BadGateway

    これは、ペイロードのサイズが上限を超えているため、Apigee Edge(Message Processor コンポーネント)がバックエンド サーバーからレスポンスを受信するとすぐにエラーをスローすることを示しています。

  5. 次のように [Response Sent to Client] フェーズにエラーが表示されます。

  6. トレースでエラーの値をメモします。上記のトレース例は次のとおりです。
    • エラー: 502 Bad Gateway
    • エラー内容: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. さまざまなシナリオの場合、以下のように [Response Received from target server] フェーズに移動します。

    非圧縮

    シナリオ 1: 非圧縮形式で送信されたレスポンス ペイロード

    トレースでエラーの値をメモします。

    • ターゲット サーバーからレスポンスを受信しました: 200 OK
    • Content-Lengthレスポンス ヘッダー セクションから): 最大 11 MB

    圧縮

    シナリオ 2: 圧縮された形式で送信されたリクエスト ペイロード

    トレースでエラーの値をメモします。

    • ターゲット サーバーからレスポンスを受信しました: 200 OK
    • Content-Encoding: このヘッダーがレスポンス ヘッダー セクションに表示されている場合は、値をメモします。たとえばこの例での値は gzip です。
  8. [Response Content] セクションの本文に注意してください。

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. トレースの [AX(Analytics Data Recorded)] フェーズに移動し、クリックして関連する詳細を表示します。

  10. [Phase Details] で [Variables Read] セクションまで下にスクロールし、次の target.received.content.length の値を確認します。
    • 非圧縮形式で送信された場合のレスポンス ペイロードの実際のサイズ。
    • ペイロードが圧縮形式で送信された場合の、Apigee による解凍時のレスポンス ペイロードのサイズ。このシナリオでは、これは許容される上限の値(10 MB)と常に同じになります。

    非圧縮

    シナリオ 1: 非圧縮形式で送信されたレスポンス ペイロード

    target.received.content.length の値をメモします。

    リクエスト ヘッダー
    target.received.content.length ~ 11 MB

    圧縮

    シナリオ 2: 圧縮された形式で送信されたリクエスト ペイロード

    target.received.content.length の値をメモします。

    リクエスト ヘッダー
    target.received.content.length ~ 10 MB
  11. 次の表に、2 つのシナリオで target.received.content.length の値に基づいて Apigee が 502 エラーを返す理由を示します。

    シナリオ target.received.content.length の値 不合格の理由
    非圧縮形式のレスポンス ペイロード ~ 11 MB サイズ > 上限の 10 MB
    圧縮形式のレスポンス ペイロード ~ 10 MB

    解凍時にサイズの上限を超えました

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-code protocol.http.TooBigBody の値と一致する 502 エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。

    NGINX のアクセスログの 502 エラーの例:

    上記の NGINX アクセスログのエントリ例では、X-Apigee- fault-codeX-Apigee-fault-source に次の値が入っています。

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source target

原因: レスポンス ペイロード サイズが上限を超えています。

診断

  1. シナリオ 1 の一般的な診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースレスポンス ペイロード サイズを特定します。
  2. 障害ソースの値が target の場合、ターゲット/バックエンド サーバーから Apigee に送信されるレスポンス ペイロード サイズが Apigee Edge で許容される上限を超えていることを示します。
  3. ステップ 1 で決定したレスポンス ペイロード サイズを確認します。
  4. 次の手順で実際のレスポンスをチェックし、レスポンスのペイロード サイズが実際に上限の 10 MB を超えていることを確認します。
    1. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできない場合は、解決策に進みます。
    2. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
      1. Public Cloud/Private Cloud ユーザーは、バックエンド サーバー自体またはバックエンド サーバーへのリクエストを許可されている他のマシンから、バックエンド サーバーに直接リクエストを送信します。
      2. Private Cloud ユーザーは、いずれかの Message Processor からバックエンド サーバーへのリクエストを行うこともできます。
      3. Content-Length ヘッダーを確認して、レスポンスで渡されたペイロードのサイズを確認します。
      4. ペイロードのサイズが Apigee Edge で許容される上限を超えている場合、それが問題の原因です。

    バックエンド サーバーからのレスポンス例:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    上記の例では、 Apigee Edge で許可されている上限を超えているため、このエラーの原因である Content-Length: 11534336 (which is ~11 MB) を確認できます。

解像度

解決策を参照してください。

原因: レスポンス ペイロード サイズが解凍後に許容上限を超えている

レスポンス ペイロードが圧縮形式で送信され、レスポンス ヘッダー Content-Encodinggzip, に設定されている場合、Apigee はレスポンス ペイロードを解凍します。Apigee は、解凍プロセス中にペイロードのサイズが Apigee Edge で許容される上限を超えていることを検出すると、それ以上の解凍を停止し、すぐに 502 Bad Gateway とエラーコード protocol.http.TooBigBody を返します。

診断

  1. シナリオ 2 の一般的な診断手順で説明されているように、API Monitoring、Trace ツール、または NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースレスポンス ペイロード サイズを特定します。
  2. [Fault Source] の値が target の場合、ターゲット/バックエンド アプリケーションによって Apigee に送信されるレスポンス ペイロード サイズが Apigee Edge で許容される上限を超えていることを示します。
  3. ステップ 1 で決定したレスポンス ペイロード サイズを確認します。
    • ペイロード サイズが上限の 10 MB を超えている場合は、それがエラーの原因です。
    • ペイロード サイズが上限の 10 MB を超える場合、レスポンス ペイロードは圧縮形式で渡される可能性があります。この場合は、圧縮レスポンス ペイロードの非圧縮サイズを確認します。
  4. ターゲット/バックエンドからのレスポンスが圧縮形式で送信され、非圧縮サイズが許容上限より大きいかどうかを確認するには、次のいずれかの方法を使用します。

    Trace

    Trace ツールの使用:

    1. 失敗したリクエストのトレースをキャプチャしている場合は、トレース
      1. target.received.content.length の値を決定します。
      2. クライアントからのリクエストに Content-Encoding: gzip ヘッダーが含まれているかどうかを確認します。
    2. target.received.content.length の値が上限の 10 MB 程度で、レスポンス ヘッダー target.received.content.length が、このエラーの原因です。

    実際のリクエスト

    実際のリクエストを使用する場合:

    1. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできない場合は、解決策に進みます。
    2. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
      1. レスポンスで渡されたペイロードのサイズと、レスポンスで送信された Content-Encoding ヘッダーを確認します。
      2. レスポンス ヘッダー Content-Encodinggzip に設定され、ペイロードの非圧縮サイズが Apigee Edge で許容される上限を超えている場合、それがこのエラーの原因です。

        バックエンド サーバーから受信したレスポンスの例:

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * About to connect() to 10.1.0.10 port 9000 (#0)
        *   Trying 10.1.0.10...
        * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
        > GET /testzippedfile.gz HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 10.1.0.10:9000
        > Accept: */*
        >
        < HTTP/1.1 200 OK
        < Accept-Ranges: bytes
        < Content-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        上記の場合、ヘッダー Content-Encoding: gzip が送信され、レスポンスのファイル testzippedfile.gz のサイズは上限未満ですが、非圧縮ファイル testzippedfile のサイズは 15 MB 以下になっています。

    Message Processor のログ

    Message Processor のログの使用:

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

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 特定の期間に 502 エラーが発生しているかどうか(問題が過去に発生した場合)、または 502 で失敗しているリクエストがあるかどうかを検索します。次の検索文字列を使用できます。

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. system.log からの行は次のようになります(TotalReadchunkCount は実際の状況によって異なります)。
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. Message Processor は、解凍プロセス中に読み取りバイト数の合計が 10 MB を超えるとすぐに判断し、次の行を停止して出力します。

      Message is too large. TotalRead 10489856 chunkCount 2571

      これは、レスポンス ペイロード サイズが 10 MB を超えていることを意味しており、サイズが上限の 10 MB を超えると、Apigee はエラーをスローします(障害コード: protocol.http.TooBigBody)。

解像度

サイズを修正

オプション #1 [推奨]: Apigee の上限を超えるペイロード サイズが送信されないようにターゲット サーバー アプリケーションを修正する

  1. 特定のターゲット サーバーが、 上限で定義されている上限を超えるレスポンスやペイロード サイズを送信する理由を分析します。
  2. 望ましくない場合は、許容される上限より小さいレスポンスまたはペイロード サイズを送信するようにターゲット サーバー アプリを変更します。
  3. もし可能で、許容される上限を超えるレスポンスやペイロードを送信する場合は、次のオプションに進みます。

署名付き URL パターン

オプション 2 [推奨]: Apigee JavaCallout 内で署名付き URL パターンを使用する

10 MB を超えるペイロードの場合、Apigee JavaCallout 内で署名付き URL パターンを使用することをおすすめします(GitHub の Edge Callout: 署名付き URL 生成ツールの例を参照)。

ストリーミング

オプション #3: ストリーミングを使用する

API プロキシが非常に大きなリクエスト/レスポンスを処理する必要がある場合は、Apigee でストリーミングを有効にできます。

CwC

方法 4: CwC プロパティを使用してバッファ上限を増やす

このオプションは、推奨オプションをどれも使用できない場合にのみ使用してください。デフォルトのサイズを大きくするとパフォーマンスの問題が発生する可能性があります。

Apigee には、リクエストとレスポンスのペイロード サイズの上限を引き上げることができる CwC プロパティが用意されています。詳細については、 Router または Message Processor のメッセージ サイズの上限を設定するをご覧ください。

上限

Apigee Edge の上限 Request/response size で説明されているように、クライアント アプリケーションとバックエンド サーバーが許容される上限を超えるペイロード サイズを送信しないことが想定されています。

  1. Public Cloud ユーザーの場合、リクエストとレスポンスのペイロード サイズの上限は、 Apigee Edge の上限Request/response size に記載されています。
  2. Private Cloud ユーザー の場合、リクエストとレスポンスのペイロード サイズに関するデフォルトの上限を変更した可能性があります(推奨される方法ではありませんが)。リクエストのペイロード サイズの上限を確認するには、現在の上限を確認する方法をご覧ください。

現在の上限を確認する方法

このセクションでは、Message Processor のプロパティ HTTPResponse.body.buffer.limit が新しい値で更新されていることを確認する方法について説明します。

  1. Message Processor マシンで、/opt/apigee/edge-message- processor/conf ディレクトリでプロパティ HTTPResponse.body.buffer.limit を検索し、次のように設定されている値を確認します。

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上記のコマンドの結果は次のようになります。

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. 上の出力例では、プロパティ HTTPResponse.body.buffer.limithttp.properties の値 10m で設定されています。

    これは、Apigee for Private Cloud で構成されたリクエスト ペイロード サイズの上限が 10 MB であることを示します。

Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

次の診断情報を収集して、Apigee Edge サポートに連絡してください。

Public Cloud ユーザーの場合は、次の情報を入力します。

  • 組織の名前
  • 環境名
  • API プロキシ名
  • 502 エラーの再現に使用する完全な curl コマンド
  • API リクエストのトレース ファイル
  • ターゲット/バックエンド サーバーからのレスポンスの完全な出力と、ペイロードのサイズ

Private Cloud ユーザーの場合は、次の情報を入力します。

  • 失敗したリクエストについて確認された完全なエラー メッセージ
  • 組織の名前
  • 環境名
  • API プロキシ バンドル
  • 失敗した API リクエストのトレース ファイル
  • 502 エラーの再現に使用する完全な curl コマンド
  • ターゲット/バックエンド サーバーからのレスポンスの完全な出力と、ペイロードのサイズ
  • 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