Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。 情報
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード protocol.http.TooBigHeaders 付きの HTTP ステータス コード 502 Bad Gateway を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 502 Bad Gateway
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"response headers size exceeding 25,600",
"detail":{
"errorcode":"protocol.http.TooBigHeaders"
}
}
}考えられる原因
このエラーは、HTTP レスポンスの一部としてターゲット/バックエンド サーバーから Apigee Edge に送信されたヘッダーの合計サイズが、Apigee Edge で許可されている上限を超えている場合に発生します。
このエラーの原因として、次のことが考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| レスポンスのヘッダーのサイズが許容上限を超えている | 特定のヘッダーのヘッダー サイズ、または Apigee Edge への HTTP レスポンスの一部としてターゲット/バックエンド サーバーから送信されたすべてのヘッダーのヘッダー サイズの合計が、Apigee Edge で許可されている上限を超えています。 | Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
次のいずれかのツールまたは手法を使用して、このエラーを診断します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題の調査対象となる組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した特定の期間を選択します。
- [Proxy] フィルタを選択して、障害コードを絞り込むことができます。
- 障害コードと時間をプロットします。
以下のように、障害コード
protocol.http.TooBigHeadersが含まれるセルを選択します。( 大きい画像を表示)
以下のように、障害コード
protocol.http.TooBigHeadersに関する情報が表示されます。( 大きい画像を表示)
[ログを表示] をクリックし、失敗したリクエストの行を開きます。
( 大きい画像を表示)
- [ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
502 - 障害の発生元:
target - 障害コード:
protocol.http.TooBigHeaders。
- ステータス コード:
- Fault Source の値が
targetで、Fault Code の値がprotocol.http.TooBigHeadersの場合、ターゲット/ バックエンド サーバーからの HTTP レスポンスに、Apigee Edge で許可されている上限を超えるサイズのヘッダーが含まれていることを示します。
Trace ツール
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gatewayエラーが発生するまで待つか、- 問題を再現できる場合は、API 呼び出しを行い、
502 Bad Gatewayエラーを再現します。
- 失敗したリクエストのいずれかを選択し、トレースを確認します。
- トレースのさまざまなフェーズを移動して、障害が発生した場所を特定します。
通常、このエラーは、次の図に示すように、ターゲット サーバーに送信されたリクエスト フェーズの直後の エラーという名前のフローに表示されます。
( 大きい画像を表示)
トレースからエラーの値をメモします。
- エラー:
response headers size exceeding 25,600 - error.class:
com.apigee.errors.http.server.BadGateway
これは、ヘッダー サイズが許可されている上限を超えているため、Apigee Edge(Message Processor コンポーネント)がバックエンド サーバーからレスポンスを受信するとすぐにエラーをスローすることを示します。
- エラー:
Apigee Edge から送信された Response Sent to Client エラー レスポンスに、次のように失敗が表示されます。
( 大きい画像を表示)
- トレースからエラーの値をメモします。上記のトレース サンプルは、次のことを示しています。
- エラー:
502 Bad Gateway。 - エラー コンテンツ:
{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
- エラー:
トレースの AX(分析データ記録)フェーズに移動してクリックすると、関連する詳細が表示されます。
( 大きい画像を表示)
次の値をメモします。
エラー ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source targetエラー コンテンツ: 本文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
502 Bad Gatewayに関する重要な情報を確認できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log説明: ORG、ENV、PORT# は実際の値に置き換えられます。
- 特定の期間にエラーコード
protocol.http.TooBigHeadersの502エラーが発生したかどうか(問題が過去に発生した場合)、または502で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が
protocol.http.TooBigHeadersの値と一致する502エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。NGINX アクセスログの 502 エラーの例:
上記の NGINX アクセスログのサンプル エントリには、X-Apigee-fault-code と X-Apigee-fault-source に次の値が設定されています。
エラー ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source target
原因: レスポンスのヘッダーのサイズが許容上限を超えている
診断
- 一般的な診断手順で説明したように、API モニタリング、Trace ツール、NGINX アクセスログを使用して確認されたエラーの障害コード、障害ソース、レスポンス ペイロード サイズを特定します。
- Fault Source の値が
targetの場合、ターゲット/バックエンド サーバーから Apigee に送信されたレスポンスに、Apigee Edge で許可されている上限を超えるサイズのヘッダーが含まれていることを示します。 - 次のいずれかの方法で、ターゲット/バックエンドからのレスポンスに、許可された上限を超えるサイズのヘッダーが含まれていることを検証できます。
エラー メッセージ
エラー メッセージを使用して検証するには:
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。faultstringは、レスポンス ヘッダーのサイズが上限を超えたことを示します。エラー メッセージの例:
"faultstring":"response headers size exceeding 25,600"
上記のエラー メッセージの
faultstringで、レスポンスにヘッダーが含まれており、その合計サイズが許容上限を超えていることに注意してください。実際のリクエスト
実際のリクエストを使用して検証するには:
ターゲット/バックエンド サーバーに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
- パブリック クラウド/プライベート クラウドのユーザーの場合は、バックエンド サーバー自体から、またはバックエンド サーバーへのリクエストを許可されている他のマシンから、バックエンド サーバーに直接リクエストを行います。
- Private Cloud ユーザーは、Message Processor のいずれかからバックエンド サーバーにリクエストを送信することもできます。
- バックエンド サーバーから受信したレスポンスを調べ、特にレスポンスで渡されたヘッダーの合計サイズを計算して検証します。
レスポンス ペイロードのヘッダーのサイズが Apigee Edge で許可されている上限を超えている場合は、それが問題の原因です。
ターゲット サーバーからのレスポンスの例:
curl -v https://TARGET_SERVER_HOST/test
* 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 /test 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-Length: 0 < Content-Type: text/plain; charset=utf-8 < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
< Testheader1: XVlBzgba—-<snipped>---THctcuAx < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP< Date: Fri, 23 Jul 2021 09:51:22 GMT < * Connection #0 to host 10.1.0.10 left intact上記の例では、
Testheader1とTestheader2のサイズが大きくなっています。これが、Apigee Edge で許可されている上限を超えているため、このエラーの原因となっています。
Message Processor ログ
Message Processor のログを使用して検証するには:
Private Cloud ユーザーは、Message Processor のログを使用して、レスポンス ヘッダーのサイズが Apigee Edge で許可されている上限を超えているかどうかを確認できます。
Message Processor のログを確認します。
/opt/apigee/var/log/edge-message-processor/logs/system.log- 特定の期間に
502エラーが発生したかどうか(問題が過去に発生した場合)、または502で失敗したリクエストがまだあるかどうかを検索します。次の検索文字列を使用できます。grep -ri "response headers size exceeding"
system.logから、次のような行が見つかります。レスポンス ヘッダーのサイズは、次のように異なる場合があります。2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1 bytesRead=0 bytesWritten=207 age=640ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600 2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
-
Message Processor は、バックエンド/ターゲット サーバーからレスポンスを取得し、ヘッダーの合計サイズが 25 KB を超えていることを検出すると、停止して次のエラーをスローします。
response headers size exceeding 25,600これは、合計ヘッダー サイズが 25 KB を超えていることを意味します。Apigee は、サイズが 25 KB の上限を超え始めると、障害コード
protocol.http.TooBigHeadersでエラーをスローします。
解決策
サイズを固定
オプション 1 [推奨]: Apigee の上限を超えるヘッダー サイズを送信しないようにターゲット サーバー アプリケーションを修正する
- 上限で定義されている上限を超えてレスポンス ヘッダー サイズを送信する特定のターゲット サーバーの理由を分析します。
- 望ましくない場合は、サイズが Apigee Edge で許可されている上限よりも小さいレスポンス ヘッダーを送信するようにバックエンド サーバー アプリケーションを変更します。
- ヘッダー情報をレスポンス本文の一部として送信できるかどうかを確認します。
- 可能であれば、ヘッダーの一部として送信する予定だった大きな情報をレスポンス本文で送信します。これにより、レスポンス ヘッダーの上限を超えないようにできます。
CwC
オプション 2 : CwC プロパティを使用してレスポンス ヘッダー サイズの上限を引き上げる
Apigee には、レスポンス ヘッダーのサイズ上限を引き上げる CwC プロパティが用意されています。詳細については、 Message Processor の上限を構成するをご覧ください。
上限
Apigee は、クライアント アプリケーションとバックエンド サーバーが、Apigee Edge の上限のリクエスト/レスポンス ヘッダー サイズで規定されている上限を超えるヘッダー サイズを送信しないことを想定しています。
- パブリック クラウド ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーの最大サイズは、Apigee Edge の上限のリクエスト/レスポンス ヘッダーのサイズで説明されているとおりです。
- Private Cloud ユーザーの場合、 リクエスト ヘッダーとレスポンス ヘッダーのサイズのデフォルトの最大制限を変更している可能性があります(推奨される方法ではありません)。レスポンス ヘッダーの最大サイズの上限は、現在の上限を確認する方法の手順に沿って確認できます。
現在の制限を確認する方法
このセクションでは、Message Processor でプロパティ HTTPResponse.headers.limit が新しい値で更新されたことを確認する方法について説明します。
- Message Processor マシンで、
/opt/apigee/edge-message-processor/confディレクトリのHTTPResponse.headers.limitプロパティを検索し、次のように設定されている値を確認します。grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
- 上記のコマンドの出力例は次のとおりです。
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
上記の出力例では、
HTTPResponse.headers.limitプロパティがhttp.propertiesの値25kで設定されています。これは、Apigee for Private Cloud で構成されたレスポンス ペイロード サイズの上限が 25 KB であることを示します。
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