Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。 情報
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード protocol.http.TooBigHeaders 付きの HTTP ステータス コード 431 Request Header Fields Too
Large を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 431 Request Header Fields Too Large
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"request headers size exceeding 25,600",
"detail":{
"errorcode":"protocol.http.TooBigHeaders"
}
}
}考えられる原因
このエラーは、HTTP リクエストの一部としてクライアント アプリケーションから Apigee Edge に送信されたすべてのリクエスト ヘッダーの合計サイズが、 RFC 6585 のセクション 5: 431 Request Header Fields Too Large に準拠した Apigee Edge で許可されている上限を超えている場合に発生します。
このエラーの原因として、次のことが考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| リクエスト ヘッダーのサイズが上限を超えている | Apigee Edge への HTTP リクエストの一部としてクライアント アプリケーションによって送信されるすべてのヘッダーの合計サイズが、Apigee Edge で許可されている上限を超えている。 | Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
次のいずれかのツールまたは手法を使用して、このエラーを診断します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題の調査対象となる組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した特定の期間を選択します。
- 障害コードと時間をプロットします。
- 次の図に示すように、障害コード
protocol.http.TooBigHeadersとステータス コード431を含むセルを選択します。( 大きい画像を表示)
以下のように、障害コード
protocol.http.TooBigHeadersに関する情報が表示されます。( 大きい画像を表示)
[ログを表示] をクリックし、失敗したリクエストの行を開きます。
( 大きい画像を表示)
[ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
431 - 障害の原因:
apigee - 障害コード:
protocol.http.TooBigHeaders。 - リクエストの長さ(バイト):
32150 (> 25 KB)
- ステータス コード:
- Fault Source の値が
apigeeまたはMPで、Fault Code の値がprotocol.http.TooBigHeadersで、Request Length が 25 KB を超えている場合、HTTP リクエストの一部としてクライアント アプリケーションによって送信されるすべてのリクエスト ヘッダーの合計サイズが、 Apigee で許可されている上限を超えていることを示します。
Trace ツール
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP
431エラーに関する重要な情報を特定できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log説明: ORG、ENV、PORT# は実際の値に置き換えられます。
- 特定の期間に
431エラーが発生したかどうか(問題が過去に発生した場合)、または431で失敗したリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が
protocol.http.TooBigHeadersの値と一致する431エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。
上記の NGINX アクセスログのサンプル エントリには、X-Apigee-fault-code と X-Apigee-fault-source に次の値が設定されています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source MPリクエストの長さに注意:
40159(40 KB は 25 KB より大きいため、Apigee Edge のリクエスト ヘッダーで許可されている上限を超えています)上記のログエントリの例では、X-Apigee-fault-source の値は
apigeeまたはMP、X-Apigee-fault-code の値はprotocol.http.TooBigHeaders、リクエストの長さは 40 KB で、Apigee で許可されている上限(25 KB)を超えています。これは、HTTP リクエストの一部としてクライアント アプリケーションによって送信されたすべてのリクエスト ヘッダーの合計サイズが、Apigee Edge で許可されている上限の 25 KB を超えていることを明確に示しています。
原因: リクエスト ヘッダーのサイズが許容上限を超えている
診断
- 一般的な診断手順で説明したように、API Monitoring または NGINX アクセスログを使用して、観測されたエラーの Fault Code、Fault Source、Request-Length size を特定します。
- Fault Source の値が
apigeeまたはMP、Fault Code の値がprotocol.http.TooBigHeaders、Request Length が 25 KB を超えている場合、これは、クライアント アプリケーションから Apigee に送信されたリクエスト サイズが Apigee Edge で許可されている上限を超えていることを示します。 - リクエスト ヘッダーのサイズが許容上限の 25 KB を超えたことを確認するには、次のいずれかの方法を使用します。
エラー メッセージ
エラー メッセージを使用して検証するには:
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。faultstringは、リクエスト ヘッダーの合計サイズが 25 KB の上限を超えていることを示します。エラー メッセージの例:
"faultstring":"request headers size exceeding 25,600"
実際のリクエスト
実際のリクエストを使用して検証するには:
クライアント アプリケーションによって行われた実際のリクエストにアクセスできる場合は、次の手順を行います。
- リクエストで渡されたヘッダーのサイズを確認します。
ヘッダーの合計サイズが Apigee Edge で許可されている上限を超えている場合は、それが問題の原因です。
リクエストの例:
curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
上記の例では、ヘッダー
header0、header1、header2、header3の合計サイズが 25 KB を超えています。つまり、25 K を超える ASCII 文字(バイト)が含まれています。他のクライアントを使用している場合は、クライアント ログを確認して、Apigee Edge に送信されているリクエスト行のサイズを特定してください。
Message Processor ログ
Message Processor のログを使用して検証するには:
Private Cloud ユーザーは、Message Processor ログを使用して、リクエスト ヘッダーのサイズが Apigee Edge で許可されている上限を超えていないかどうかを確認できます。
Message Processor のログを確認します。
/opt/apigee/var/log/edge-message-processor/logs/system.log- 特定の期間に
431エラーが発生したかどうか(問題が過去に発生した場合)、または431で失敗したリクエストがまだあるかどうかを検索します。次の検索文字列を使用できます。grep -ri "exceeding"
grep -ri "RequestHeadersTooLarge"
system.logから次のような行が見つかります。2021-07-27 08:30:28,419 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:GET, uri:/test/, message Id:null, exception:com.apigee.errors.http.user.RequestHeadersTooLarge{ code = protocol.http.TooBigHeaders, message = request headers size exceeding 25,600, associated contexts = []}, context:Context@9c5903 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130 useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms lastIO=0ms isOpen=true)
上記のエラー メッセージのテキスト
message = request headers size exceeding 25,600は、リクエスト ヘッダーの合計サイズが 25 KB を超えていることを示しています。そのため、Apigee Edge は例外com.apigee.errors.http.user.RequestHeadersTooLargeをスローし、障害コードprotocol.http.TooBigHeadersを含む431ステータス コードをクライアント アプリケーションに返します。
解決策
サイズを固定
オプション 1 [推奨]: 許可されている上限を超える合計サイズのリクエスト ヘッダーを送信しないようにクライアント アプリケーションを修正する
- 上限で定義されているように、特定のクライアントがリクエスト ヘッダーを送信する理由を分析します。このリクエスト ヘッダーのサイズが大きいため、ヘッダーの合計サイズが許容上限を超えています。
望ましくない場合は、許可されている上限よりも小さいサイズのリクエスト ヘッダーを送信するようにクライアント アプリケーションを変更します。
上記の例では、リクエストの本文/ペイロードの一部として長いヘッダー値パラメータを渡すことで、問題を解決できます。
curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'- 望ましい場合で、許可された上限を超えてヘッダーを送信する場合は、次のオプションに進みます。
CwC
オプション 2 : CwC プロパティを使用してリクエスト行の上限を引き上げる
Apigee には、リクエスト ラインのサイズ上限を引き上げることができる CwC プロパティが用意されています。詳細については、 Message Processor のリクエスト行の制限を設定するをご覧ください。
上限
Apigee は、クライアント アプリケーションとバックエンド サーバーが、Apigee Edge の上限でリクエスト/レスポンス ヘッダー サイズの上限として記載されている上限を超えるリクエスト/レスポンス ヘッダーを送信しないことを想定しています。
- パブリック クラウド ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーの最大サイズは、Apigee Edge の上限のリクエスト ヘッダーとレスポンス ヘッダーのサイズに記載されているとおりです。
- Private Cloud ユーザーの場合、 リクエスト ヘッダーとレスポンス ヘッダーのサイズのデフォルトの最大制限を変更している可能性があります(推奨される方法ではありません)。最大リクエスト ヘッダー サイズの上限は、現在の上限を確認する方法の手順に沿って確認できます。
現在の制限を確認する方法
このセクションでは、Message Processor でプロパティ HTTPRequest.headers.limit が新しい値で更新されたことを確認する方法について説明します。
- Message Processor マシンで、
/opt/apigee/edge-message-processor/confディレクトリのHTTPRequest.headers.limitプロパティを検索し、次のように設定されている値を確認します。grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
- 上記のコマンドの出力例は次のとおりです。
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
上記の出力例では、
HTTPRequest.headers.limitプロパティがhttp.propertiesの値25kで設定されています。これは、Apigee for Private Cloud で構成されたリクエスト ヘッダーのサイズの上限が 25 KB であることを示します。
仕様
Apigee Edge は、クライアント アプリケーションがリクエストの一部としてサイズの大きいヘッダーを送信しないことを想定しています。リクエストに指定された上限を超えるサイズのヘッダーが含まれている場合、Apigee は次の RFC 仕様に従って 431 Request Header Fields Too Large をスローします。
| 仕様 |
|---|
| RFC 6585、セクション 5: 431 Request Header Fields Too Large |
Apigee サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
431エラーを再現するために使用される完全なcurlコマンド- API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認されたエラー メッセージの全文
- 組織名
- 環境名
- API プロキシ バンドル
- 失敗した API リクエストのトレース ファイル
431エラーを再現するために使用される完全な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