502 Bad Gateway - TooBigBody

<ph type="x-smartling-placeholder"></ph> 現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント
詳細

症状

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

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

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

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

考えられる原因

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

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

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

共通の診断手順

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

API Monitoring

<ph type="x-smartling-placeholder">

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

  1. <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインするユーザーとして、 付与します
  2. 問題を調査する組織に切り替えます。

  3. [Analyze] >API モニタリング >Investigate ページをご覧ください。
  4. エラーが発生した期間を選択します。
  5. [Proxy] フィルタを選択して、障害コードを絞り込むことができます。
  6. 障害コードTime に対してプロットします。
  7. 障害コード protocol.http.TooBigBody を持つセルを選択します。 下に示します。

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

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

  10. [ログ] ウィンドウで、次の情報をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    • ステータス コード: 502
    • 障害の発生元: target
    • 障害コード: protocol.http.TooBigBody
  11. [Fault Source] の値が target で [Fault Code] の場合 値が protocol.http.TooBigBody の場合、これは HTTP ターゲット/ バックエンド サーバーから返されるレスポンスのペイロード サイズが 許可されている Apigee Edge の上限をご覧ください。

トレース

<ph type="x-smartling-placeholder">

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

  1. トレース セッションを有効にし、次のいずれかを行います。 <ph type="x-smartling-placeholder">
      </ph>
    • 502 Bad Gateway エラーが発生するのを待つ。または
    • 問題を再現できる場合は、API 呼び出しを行い、 502 Bad Gateway エラー。
  2. 失敗したリクエストのいずれかを選択し、トレースを調べます。
  3. トレースのさまざまなフェーズを移動して、エラーが発生した場所を特定します。
  4. ターゲットからレスポンスを受け取った直後のエラーフェーズに移動します server フェーズで実行します。

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

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

    これは、Apigee Edge(Message Processor コンポーネント)が次のタイミングでエラーをスローすることを示しています。 ペイロード サイズが許可された値を超えたため、バックエンド サーバーからレスポンスを受信 できます。

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

  6. トレースのエラーの値をメモします。上記のサンプル トレースから、次のことがわかります。 <ph type="x-smartling-placeholder">
      </ph>
    • エラー: 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: このヘッダーがレスポンス ヘッダーにある場合 セクションで値をメモします。この例での値は gzip
  8. [Response Content] セクションの [Body] に注目してください。

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
    <ph type="x-smartling-placeholder">
  9. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。 関連する詳細が表示されます。

  10. [Phase Details] で [Variables Read] セクションまで下にスクロールし、 値 target.received.content.length の値は次のようになります。 <ph type="x-smartling-placeholder">
      </ph>
    • 非圧縮形式で送信されたときのレスポンス ペイロードの実際のサイズ。
    • Apigee による解凍時のレスポンス ペイロードのサイズ(ペイロードが 圧縮して送信します。この値は常に許可される 上限(10 MB)です。
    で確認できます。 <ph type="x-smartling-placeholder">

    非圧縮

    シナリオ #1: レスポンス ペイロードが圧縮されていない形式で送信される

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

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

    圧縮

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

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

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

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

    解凍時にサイズ上限を超過

    <ph type="x-smartling-placeholder">

NGINX

<ph type="x-smartling-placeholder">

NGINX アクセスログを使用してエラーを診断するには:

  1. Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、 HTTP 502 エラーに関する重要な情報。
  2. NGINX アクセスログを確認します。

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

  3. 特定の期間に 502 エラーが発生していないかどうかを確認(例: 過去に発生したことがある)か、引き続き Cloud Logging によって 502
  4. X-Apigee-fault-code が一致する 502 エラーがある場合 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. [障害コード]、[障害ソース]、[レスポンス ペイロード サイズ] の値を決定します。 API Monitoring、Trace ツール、または NGINX アクセスログを使用して確認されたエラー シナリオ 1 の一般的な診断手順
  2. Fault Source の値が target の場合、これはレスポンスが ターゲット/バックエンド サーバーによって Apigee に送信されるペイロード サイズが、 Apigee Edge で許可されている上限をご覧ください。
  3. ステップ 1 で特定したレスポンスのペイロード サイズを確認します。
  4. レスポンスのペイロード サイズが実際にであることを検証する >上限の 10 MB にするには、 示しています。 <ph type="x-smartling-placeholder">
      </ph>
    1. ターゲット/バックエンド サーバーに対する実際のリクエストにアクセスできない場合は、 [解決策] に進みます。
    2. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできる場合: 次の操作を行います。 <ph type="x-smartling-placeholder">
        </ph>
      1. Public Cloud/Private Cloud ユーザーは、 バックエンド サーバー自体から、またはユーザーが使用している バックエンド サーバーにリクエストを送信できます。
      2. Private Cloud ユーザーは、Private Cloud リソースに対してリクエストを発行することもできます。 バックエンドサーバーと通信します
      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 によってペイロードのサイズが大きくなると Apigee Edge で許可されている上限を超えている場合は、さらに停止します。 即座に応答し、 (502 Bad Gateway、エラーコード: protocol.http.TooBigBody)。

診断

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

    トレース

    Trace ツールの使用:

    1. 失敗したリクエストのトレースをキャプチャした場合は、 Traceと <ph type="x-smartling-placeholder">
        </ph>
      1. target.received.content.length の値を確認します。
      2. クライアントからのリクエストに Content-Encoding: gzip ヘッダー
    2. target.received.content.length の値が許容される約 10 MB の値に近い場合 レスポンス ヘッダー Content-Encoding: gzip がある場合、 確認できます。

    実際のリクエスト

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

    1. ターゲット/バックエンド サーバーに対する実際のリクエストにアクセスできない場合は、 [解決策] に進みます。
    2. ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできる場合: 次の操作を行います。 <ph type="x-smartling-placeholder">
        </ph>
      1. レスポンスで渡されるペイロードのサイズと レスポンスで送信された Content-Encoding ヘッダー。
      2. レスポンス ヘッダー Content-Encoding が次のように設定されている場合、 gzip であり、ペイロードの非圧縮サイズは 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。

    で確認できます。 <ph type="x-smartling-placeholder">

    Message Processor のログ

    Message Processor ログの使用:

    <ph type="x-smartling-placeholder">
    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

      [Response Payload Size] が 10 MB を超えており、Apigee サイズが上限の 10 MB を超え始めると、次の障害コードがスローされます。 protocol.http.TooBigBody

      <ph type="x-smartling-placeholder">

解決策

サイズを修正

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

<ph type="x-smartling-placeholder">
  1. 特定のターゲット サーバーがレスポンス / ペイロード サイズを送信する理由を分析する で定義されている上限を超えています 制限
  2. これが望ましくない場合は、ターゲット サーバー アプリケーションに変更を加えて、 レスポンス / ペイロードのサイズが上限を下回っています。
  3. 許容されるサイズを超えるレスポンス/ペイロードを送信することが望ましい場合は、 次のオプションに進みます。

署名付き URL パターン

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

<ph type="x-smartling-placeholder">

ペイロードが 10 MB を超える場合、Apigee では、署名付き URL パターンを 図で示されている Apigee JavaCallout <ph type="x-smartling-placeholder"></ph> Edge Callout: 署名付き URL 生成ツールのサンプル(GitHub)

ストリーミング

方法 #3: ストリーミングを使用する

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

<ph type="x-smartling-placeholder">

CwC

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

<ph type="x-smartling-placeholder">

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

Apigee は、 <ph type="x-smartling-placeholder"></ph> CwC プロパティ。これにより、リクエストとレスポンスのペイロード サイズを増やすことができます。 できます。詳しくは、 <ph type="x-smartling-placeholder"></ph> Router または Message Processor でメッセージ サイズの上限を設定する

<ph type="x-smartling-placeholder">

上限

Apigee では、クライアント アプリケーションとバックエンド サーバーでは、ペイロードのサイズが Request/response size に記載されている上限 Apigee Edge の上限

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

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

<ph type="x-smartling-placeholder">

このセクションでは、プロパティが 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.limit の値は 10m に設定されています http.properties

    これは、Apigee で 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