431 リクエスト ヘッダー フィールドが大きすぎる - TooBigHeaders

現在、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 LargeApigee Edge の許容上限を超えている場合に発生します。

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

原因 説明 トラブルシューティングの実施対象
リクエスト ヘッダーのサイズが上限を超えています クライアント アプリケーションによって Apigee Edge への HTTP リクエストの一部として送信されたすべてのヘッダーの合計サイズが、Apigee Edge で許容される上限を超えている。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

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

API Monitoring

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

  1. 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
  2. 問題を調査する組織に切り替えます。

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [Time] に [Fault Code] をプロットします。
  6. 次のように、障害コード protocol.http.TooBigHeaders とステータス コード 431 のセルを選択します。

    拡大画像を表示

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

    拡大画像を表示

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

    拡大画像を表示

  9. [ログ] ウィンドウで、次の詳細をメモします。

    • ステータス コード: 431
    • 障害ソース: apigee
    • 障害コード: protocol.http.TooBigHeaders
    • リクエストの長さ(バイト): 32150 (> 25 KB)
  10. [Fault Source] の値が apigee または MP の場合、[Fault Code] の値は protocol.http.TooBigHeaders で、[Request Length] は 25 KB を超えています。これは、HTTP リクエストの一部としてクライアント アプリケーションから送信されたすべてのリクエスト ヘッダーの合計サイズが Apigee の上限を超えていることを示します。

Trace ツール

NGINX

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

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

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

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

  3. 特定の期間に 431 エラーが発生しているかどうか(問題が過去に発生した場合)、または 431 で失敗しているリクエストがあるかどうかを検索します。
  4. 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 または MPX-Apigee-fault-code の値は protocol.http.TooBigHeadersRequest Length は 40 KB で、Apigee の上限である 25 KB を超えています。これは、HTTP リクエストの一部としてクライアント アプリケーションから送信されたすべてのリクエスト ヘッダーの合計サイズが、Apigee Edge で許容される上限の 25 KB を超えていることを示しています。

原因: リクエスト ヘッダーのサイズが上限を超えています

診断

  1. 一般的な診断手順で説明されているように、API Monitoring または NGINX アクセスログを使用して確認されたエラーの Fault CodeFault SourceRequest-Length size を決定します。
  2. [Fault Source] の値が apigee または MP、[Fault Code] の値が protocol.http.TooBigHeaders で、[Request Length] が 25 KB を超えている場合、クライアント アプリケーションから Apigee に送信されたリクエスト サイズが Apigee Edge で許容される上限を超えていることを示します。
  3. リクエスト ヘッダーのサイズが上限の 25 KB を超えていることを確認するには、次のいずれかの方法を使用します。

    エラー メッセージ

    エラー メッセージを使用して検証するには:

    Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、faultstring を参照してください。faultstring は、リクエスト ヘッダーの合計サイズが 25 KB の上限を超えていることを示します。

    エラー メッセージの例:

    "faultstring":"request headers size exceeding 25,600"
    

    実際のリクエスト

    実際のリクエストを使用して検証するには:

    クライアント アプリケーションによって行われた実際のリクエストにアクセスできる場合は、次の手順を行います。

    1. リクエストで渡されたヘッダーのサイズを確認します。
    2. ヘッダーの合計サイズが 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>"
      

      この場合、ヘッダー header0header1header2header3 の合計サイズが 25 KB を超えています。つまり、25,000 文字を超える ASCII 文字(バイト)が含まれています。

      他のクライアントを使用している場合は、クライアント ログを確認して、Apigee Edge に送信されるリクエスト行のサイズを調べることができます。

    Message Processor のログ

    Message Processor のログを使用して検証するには:

    Private Cloud ユーザーの場合は、Message Processor のログを使用して、リクエスト ヘッダーのサイズが Apigee Edge の上限を超えているかどうかを検証できます。

    1. Message Processor のログを確認します。

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. 特定の期間に 431 エラーがあったかどうか(問題が過去に発生していた場合)、または 431 で失敗しているリクエストがあるかどうかを検索します。次の検索文字列を使用できます。
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. 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 [推奨]: 合計サイズが上限を超えるリクエスト ヘッダーを送信しないようにクライアント アプリケーションを修正する

  1. 特定のクライアントがリクエスト ヘッダーを送信する理由を分析します。リクエスト ヘッダーのサイズが大きく、ヘッダーの合計サイズが上限で定義されている上限を超える場合があります。
  2. 望ましくない場合は、サイズの上限より小さいリクエスト ヘッダーを送信するようにクライアント アプリケーションを修正します。

    上記の例では、リクエスト本文/ペイロードの一部として長いヘッダー値パラメータを渡すことで、この問題を解決できます。

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. もし可能で、上限を超えるヘッダーを送信したい場合は、次のオプションに進みます。

CwC

方法 2 : CwC プロパティを使用してリクエスト行数の上限を引き上げる

Apigee には、リクエスト行サイズの上限を増やすことができる CwC プロパティが用意されています。詳細については、 Message Processor のリクエスト行数の上限を設定するをご覧ください。

上限

Apigee Edge の上限にあるリクエスト/レスポンス ヘッダーのサイズ制限に記載されている許容上限を超えるサイズのリクエスト/レスポンス ヘッダーが、クライアント アプリケーションとバックエンド サーバーから送信されないことが想定されています。

  1. Public Cloud ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーのサイズの上限は、Apigee Edge の制限リクエスト/レスポンス ヘッダーのサイズに記載されています。
  2. Private Cloud ユーザー の場合、リクエスト ヘッダーとレスポンス ヘッダーのサイズに関するデフォルトの上限を変更した可能性があります(推奨される方法ではありませんが)。リクエスト ヘッダーのサイズの上限は、現在の上限を確認する方法の手順に沿って決定できます。

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

このセクションでは、Message Processor のプロパティ HTTPRequest.headers.limit が新しい値で更新されていることを確認する方法について説明します。

  1. Message Processor マシンで、/opt/apigee/edge-message-processor/conf ディレクトリでプロパティ HTTPRequest.headers.limit を検索し、次のように設定されている値を確認します。
    grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. 上記のコマンドのサンプル結果は次のとおりです。
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
    
  3. 上の出力例では、プロパティ HTTPRequest.headers.limithttp.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

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

  • Message Processor のシステムログ /opt/apigee/var/log/edge-message-processor/logs/system.log