502 Bad Gateway - TooBigBody

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します
info

症状

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

エラー メッセージ

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

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. [分析] > [API Monitoring] > [調査] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. [プロキシ] フィルタを選択して、障害コードを絞り込むことができます。
  6. [障害コード] を [時間] に対してプロットします。
  7. 次のように、障害コード protocol.http.TooBigBody を含むセルを選択します。

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

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

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

トレース

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

  1. トレース セッションを有効にして、次のいずれかを行います。
    • 502 Bad Gateway エラーが発生するまで待つ。
    • 問題が再現できる場合は、API 呼び出しを行って 502 Bad Gateway エラーを再現します。
  2. 失敗したリクエストのいずれかを選択して、トレースを調べます。
  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: レスポンス ペイロードが非圧縮形式で送信される

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

    • Response received from target server: 200 OK
    • Content-Length ([Response Headers] セクションから): ~11 MB

    圧縮

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

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

    • Response received from target server: 200 OK
    • Content-Encoding: [Response Headers] セクションにこのヘッダーが表示されたら、値をメモします。たとえば、この例での値は gzipです。
  8. [Response Content] セクションの [Body] をメモします。

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. トレースの [AX](分析データが記録された)フェーズに移動してクリックすると、 関連する詳細が表示されます。

  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. 次の表に、502 エラーが Apigee によって返される理由を、 target.received.content.length の値に基づく 2 つのシナリオで示します。

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

    NGINX アクセスログからの 502 エラーのサンプル:

    NGINX アクセスログの上記のサンプル エントリには、X-Apigee- fault-code X-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>

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

解決策

解決策をご覧ください。

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

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

診断

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

    トレース

    Trace ツールを使用する場合:

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

    実際のリクエスト

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

    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 を超えるペイロードには、GitHub の Edge Callout: Signed URL Generator の例に示されている、Apigee JavaCallout に含まれる署名付き URL パターンを使用することをおすすめします。

ストリーミング

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

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

CwC

オプション #4: CwC プロパティを使用してバッファの上限を増やす

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

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

上限

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

  1. Public Cloud ユーザーの場合、リクエストとレスポンスの ペイロード サイズの上限は、Request/response size Apigee Edge の上限に規定されているとおりです。
  2. Private Cloud ユーザー の場合は、リクエストとレスポンスのペイロード サイズのデフォルトの上限を変更している可能性があります(推奨される方法ではありません)。 リクエスト ペイロード サイズの上限を確認する方法の手順に沿って、リクエスト ペイロード サイズの上限を確認できます。

現在の上限を確認するにはどうすればよいですか?

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

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

    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.limit10m で値 http.properties に設定されています。

    これは、Private Cloud 用に Apigee で構成されたリクエスト ペイロード サイズの上限が 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