現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください。 情報
内容
クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 431 Request Header Fields Too
Large
とエラーコード protocol.http.TooBigHeaders
を受け取ります。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
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] ページに移動します。
- エラーが発生した期間を選択します。
- [Time] に [Fault Code] をプロットします。
- 次のように、障害コード
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 が X-Apigee-fault-code の値と一致する
431
エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。上記の NGINX アクセスログのエントリ例では、X-Apigee-fault-code と X-Apigee-fault-code に次の値が入っています。
レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source MP
リクエストの長さに注意してください:
40159
(40 KB は Apigee Edge でのリクエスト ヘッダーの上限である 25 KB を超えています)上記のサンプル ログエントリでは、X-Apigee-fault-source の値は
apigee
またはMP
、X-Apigee-fault-code の値はprotocol.http.TooBigHeaders
、Request Length は 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,000 文字を超える 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
をスローし、431
ステータス コードと障害コードprotocol.http.TooBigHeaders
をクライアント アプリケーションに返します。
解像度
サイズを修正
オプション 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 Edge の上限にあるリクエスト/レスポンス ヘッダーのサイズ制限に記載されている許容上限を超えるサイズのリクエスト/レスポンス ヘッダーが、クライアント アプリケーションとバックエンド サーバーから送信されないことが想定されています。
- Public Cloud ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーのサイズの上限は、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、section 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