ここに表示されているのは 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 を使用してエラーを診断するには:
- 適切なロールを持つユーザーで Apigee Edge UIにログインします。
問題を調査する組織に切り替えます。
- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
- [プロキシ] フィルタを選択して、障害コードを絞り込むことができます。
- [障害コード] を [時間] に対してプロットします。
次のように、障害コード
protocol.http.TooBigBodyを含むセルを選択します。
次のように、障害コード
protocol.http.TooBigBodyに関する情報が表示されます。
[ログを表示] をクリックして、失敗したリクエストの行を展開します。
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
502 - 障害ソース:
target - 障害コード:
protocol.http.TooBigBody。
- ステータス コード:
- 障害ソース の値が
targetで、障害コード の値がprotocol.http.TooBigBodyの場合、ターゲット/ バックエンド サーバーからの HTTP レスポンスのレスポンス ペイロード サイズが、Apigee Edge で許可されている 上限 を超えていることを示します。
トレース
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gatewayエラーが発生するまで待つ。- 問題が再現できる場合は、API 呼び出しを行って
502 Bad Gatewayエラーを再現します。
- 失敗したリクエストのいずれかを選択して、トレースを調べます。
- トレースのさまざまなフェーズを移動して、障害が発生した場所を見つけます。
次のように、[Response received from target server] フェーズの直後の [Error] フェーズに移動します。
トレースからエラーの値をメモします。
- エラー:
Body buffer overflow - error.class:
com.apigee.errors.http.server.BadGateway
これは、ペイロード サイズが許可されている上限を超えているため、バックエンド サーバーからレスポンスを受信するとすぐに Apigee Edge(Message Processor コンポーネント)がエラーをスローすることを示しています。
- エラー:
次のように、[Response Sent to Client] フェーズで障害が発生します。
- トレースからエラーの値をメモします。上記のトレースの例は次のとおりです。
- エラー:
502 Bad Gateway - エラー コンテンツ:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- エラー:
さまざまなシナリオについて、次のように [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です。
- Response received from target server:
[Response Content] セクションの [Body] をメモします。
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}トレースの [AX](分析データが記録された)フェーズに移動してクリックすると、 関連する詳細が表示されます。
- [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 次の表に、
502エラーが Apigee によって返される理由を、 target.received.content.length の値に基づく 2 つのシナリオで示します。シナリオ target.received.content.length の値 失敗の理由 非圧縮形式のレスポンス ペイロード ~11 MB サイズが 10 MB の上限を超えている 圧縮形式のレスポンス ペイロード ~10 MB 解凍時にサイズの上限を超えた
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
502エラーに関する重要な情報を確認できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
場所: ORG、ENV、PORT# は実際の値に置き換えてください。
- 特定の期間に
502エラーが発生したかどうか(過去に問題が発生した場合)、または502で失敗しているリクエストがまだあるかどうかを検索します。 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.TooBigBodyX-Apigee-fault-source target
原因: レスポンス ペイロード サイズが許可されている上限を超えている
診断
- シナリオ #1 の共通の診断手順で説明したように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード、障害ソース、レスポンス ペイロード サイズを特定します。
- 障害ソースの値が
targetの場合、ターゲット/バックエンド サーバーから Apigee に送信されたレスポンス ペイロード サイズが、Apigee Edge で許可されている上限を超えていることを示します。 - レスポンス ペイロード サイズを、ステップ 1で特定したとおりに確認します。
- ペイロード サイズが 10 MB の上限を超えている場合、それがエラーの原因です。
- ペイロード サイズが 10 MB の上限に近い場合、レスポンス ペイロードが圧縮形式で渡されている可能性があります。 原因: レスポンス ペイロード サイズが解凍後に許可されている上限を超えているに移動します。
- 次の手順で実際のレスポンスを確認して、レスポンス ペイロード サイズが 10 MB の上限を超えていることを確認します。
- ターゲット/バックエンド サーバーへの実際のリクエストにアクセスできない場合は、 解決策に移動します。
- ターゲット/バックエンド サーバーへの実際のリクエストにアクセスできる場合は、
次の手順を行います。
- Public Cloud/Private Cloud ユーザーの場合は、バックエンド サーバー自体から、またはバックエンド サーバーにリクエストを送信できる他のマシンから、バックエンド サーバーに直接リクエストを送信します。
- Private Cloud ユーザーの場合は、Message Processor のいずれかから バックエンド サーバーにリクエストを送信することもできます。
- ** Content-Length ヘッダー** を確認して、レスポンスで渡されたペイロードのサイズを確認します。
- ペイロードのサイズが 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-Encodingがgzip, に設定されている場合、Apigee はレスポンス ペイロードを解凍します。解凍プロセス中に、ペイロードのサイズが Apigee Edge で許可されている 上限を超えている
ことが判明すると、Apigee はそれ以上の
解凍を停止し、502 Bad Gateway とエラーコード protocol.http.TooBigBody をすぐに
返します。
診断
- シナリオ #2 の 共通の診断手順で説明したように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード、障害ソース、およびレスポンス ペイロード サイズを特定します。
- 障害ソース の値が
targetの場合、ターゲット/バックエンド アプリケーションから Apigee に送信されたレスポンス ペイロード サイズが、Apigee Edge で許可されている 上限 を超えていることを示します。 - レスポンス ペイロード サイズを、ステップ 1で特定したとおりに確認します。
- ペイロード サイズが 10 MB の上限を超えている場合、それがエラーの原因です。
- ペイロード サイズが 10 MB の上限に近い場合、レスポンス ペイロードが 圧縮形式で渡されている可能性があります。この場合は、圧縮された レスポンス ペイロードの非圧縮サイズを確認します。
- 次のいずれかの方法で、ターゲット/バックエンドからのレスポンスが圧縮形式で送信され、
非圧縮サイズが許可されている上限を超えているかどうかを確認できます。
トレース
Trace ツールを使用する場合:
- 失敗したリクエストのトレースをキャプチャした場合は、
Trace で説明されている手順を参照してください。
- target.received.content.length の値を特定します。
- クライアントからのリクエストに
Content-Encoding:
gzipヘッダーが含まれているかどうかを確認します。
- target.received.content.length の値が 10 MB の上限に近い場合、レスポンス ヘッダー Content-Encoding:
gzipがこのエラーの原因です。
実際のリクエスト
実際のリクエストを使用する場合:
- ターゲット/バックエンド サーバーへの実際のリクエストにアクセスできない場合は、 解決策に移動します。
- ターゲット/バックエンド サーバーへの実際のリクエストにアクセスできる場合は、次の手順を行います。
- レスポンスで送信された
Content-Encodingヘッダーとともに、レスポンスで渡されたペイロードのサイズを確認します。 - レスポンス ヘッダー
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 でした。
- レスポンスで送信された
Message Processor ログ
Message Processor ログを使用する場合:
- Private Cloud ユーザーの場合は、Message Processor ログを使用して、HTTP
502エラーに関する重要な情報を確認できます。 Message Processor ログを確認します。
/opt/apigee/var/log/edge-message-processor/logs/system.log特定の期間に
502エラーが発生したかどうか(過去に問題が発生した場合)、または502で失敗しているリクエストがまだあるかどうかを検索します。次の検索文字列を使用できます。grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- 次のように、
system.logから行が見つかります(TotalReadとchunkCountは異なる場合があります)。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)
解凍プロセス中に、Message Processor が 読み取りバイト数の合計が 10 MB を超えていると判断すると、処理を停止して次の行を出力します。
Message is too large. TotalRead 10489856 chunkCount 2571これは、レスポンス ペイロード サイズ が 10 MB を超えていることを意味します。サイズが 10 MB の上限を超え始めると、Apigee 障害コード
protocol.http.TooBigBodyでエラーをスローします。
- 失敗したリクエストのトレースをキャプチャした場合は、
Trace で説明されている手順を参照してください。
解決策
サイズを修正する
オプション #1(推奨): ターゲット サーバー アプリケーションが Apigee の上限を超えるペイロード サイズを送信しないように修正する
署名付き 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 で規定されている許可されている上限を超えるペイロード サイズを送信しないことを想定しています。
- Public Cloud ユーザーの場合、リクエストとレスポンスの
ペイロード サイズの上限は、
Request/response sizeで Apigee Edge の上限に規定されているとおりです。 - Private Cloud ユーザー の場合は、リクエストとレスポンスのペイロード サイズのデフォルトの上限を変更している可能性があります(推奨される方法ではありません)。 リクエスト ペイロード サイズの上限を確認する方法の手順に沿って、リクエスト ペイロード サイズの上限を確認できます。
現在の上限を確認するにはどうすればよいですか?
このセクションでは、Message Processor でプロパティ
HTTPResponse.body.buffer.limit が新しい値で更新されていることを確認する方法について説明します。
Message Processor マシンで、
HTTPResponse.body.buffer.limitディレクトリの/opt/apigee/edge-message- processor/confプロパティを検索し、次のように設定されている値を確認します。grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
上記のコマンドの出力例は次のとおりです。
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
上記の出力例では、プロパティ
HTTPResponse.body.buffer.limitが10mで値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場所: ORG、ENV、PORT# は実際の値に置き換えてください。
- Message Processor システムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log