414 Request-URI Too Long - TooBigLine(414 リクエスト URI が長すぎる - TooBigLine)

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 414 Request-URI Too Long とエラーコード protocol.http.TooBigLine を受け取ります。

エラー メッセージ

クライアント アプリケーションが次のレスポンス コードを受け取ります。

HTTP/1.1 414 Request-URI Too Long

また、次のエラー メッセージが表示される場合があります。

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

上記のエラー メッセージの faultstring には、Apigee Edge のリクエスト行に対して許可されている上限が 7168 bytes(7 KB)です。

考えられる原因

このエラーは、HTTP リクエストの一部としてクライアント アプリケーションから Apigee Edge に送信されたリクエスト行のサイズが、Apigee Edge で許容される上限を超えている場合に発生します。

このエラーの考えられる原因を確認する前に、リクエスト行の意味とサイズの確認方法を理解しましょう。

リクエスト行について

一般的な HTTP リクエストは、次の 3 つの部分で構成されます。

  1. Request-Line
  2. (HTTP ヘッダーのセット)
  3. [ 本文 ]

リクエスト行は、次に示すように 3 つの部分で構成されます。

Request-Line = <Method> <Request-URI> <HTTP-Version>

クライアント アプリケーションからサーバーに HTTP リクエストが行われると、サーバーに到達する最初の行に上記の Request-Line が含まれます。その後に、ヘッダーとリクエスト本文/ペイロードが続きます。

次のサンプル スクリーンショットは、一般的な curl リクエスト、Request 部分(Request-Line を含む)、Response 部分を示しています。

Request-Line のサイズについて

  1. 上記の例では、リクエストの start 行(最初の行)(Request-Line とも呼ばれます)は次のようになります。
    GET /test/ HTTP/1.1
    

    Request-Line のサイズは、19 ASCII characters を含むため ~19 bytes です。これは Apigee Edge の上限の範囲内であるため、リクエストはエラーなしで処理され、正常なレスポンスが返されます。

  2. 同様に、上記の エラー メッセージfaultstring には "request line size exceeding 7,168" が含まれています。これは、クライアントから送信された HTTP リクエストの Request-Line が 7,168 バイトを超えたことを示します。

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

原因 説明 トラブルシューティングの実施対象
リクエストのペイロード サイズが上限を超えています クライアント アプリケーションによって Apigee Edge への HTTP リクエストの一部として送信される Request-URI のサイズが、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.TooBigLine とステータス コード 414 のセルを選択します。

    拡大画像を表示

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

    拡大画像を表示

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

    拡大画像を表示

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

    • ステータス コード: 414
    • 障害ソース: apigee
    • 障害コード: protocol.http.TooBigLine
    • リクエストの長さ(バイト): 7244 (> 7KB)
  10. [Fault Source] の値が apigee または MP の場合、[Fault Code] の値は protocol.http.TooBigLine で、Request-Length は 7 KB を超えています。これは、クライアントからの HTTP リクエストのリクエスト URI が Apigee で許可されている上限より大きいことを示します。

Trace ツール

NGINX

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

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

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

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

  3. 特定の期間に 414 エラーが発生しているかどうか(問題が過去に発生した場合)、または 414 で失敗しているリクエストがあるかどうかを検索します。
  4. X-Apigee-fault-code X-Apigee-fault-code の値と一致する 414 エラーが見つかった場合は、X-Apigee-fault-code の値を特定します。

    上記の NGINX アクセスログのエントリ例では、X-Apigee-fault-code X-Apigee-fault-code に次の値が入っています。

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source policy

    リクエストの長さ: 7244(7.244 KB > 上限)

原因: リクエストのペイロード サイズが上限を超えています。

診断

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

    エラー メッセージ

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

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

    エラー メッセージの例:

    "faultstring":"request line size exceeding 7,168"
    

    実際のリクエスト

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

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

    1. リクエストで渡された URI のサイズを確認します。
    2. URI のサイズが Apigee Edge で許容される上限を超えている場合、それが問題の原因です。

      リクエストの例:

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      この場合、クエリ パラメータ qparam の値は 7 KB を超えています。つまり、7,000 個以上の ASCII 文字が含まれています。

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

    Message Processor のログ

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

    Private Cloud ユーザーの場合は、Message Processor のログを使用して、Request-Line のサイズが Apigee Edge の上限を超えているかどうかを検証できます。

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

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

    2. 特定の期間に 414 エラーがあったかどうか(問題が過去に発生していた場合)、または 414 で失敗しているリクエストがあるかどうかを検索します。次の検索文字列を使用できます。
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. system.log から次のような行が表示されます。
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)
      

      上記のエラー メッセージにある message = request line size exceeding 7,168 というテキストは、リクエスト URI のサイズが 7 KB を超えていることを示しています。したがって、Apigee Edge は例外 com.apigee.errors.http.user.RequestURITooLong をスローし、414 ステータス コードと障害コード protocol.http.TooBigline をクライアント アプリケーションに返します。

解像度

サイズを修正

方法 1 [推奨]: リクエスト URI のサイズが上限を超えないようにクライアント アプリケーションを修正する

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

    上記の例では、long クエリ パラメータをリクエスト URL の一部として渡すのではなく、次のようにリクエスト本文またはペイロードの一部として渡すことでこの問題を解決できます。

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. もし可能で、許容される上限を超える URI を送信する場合は、次のオプションに進みます。

CwC

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

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

上限

クライアント アプリケーションとバックエンド サーバーは、Apigee Edge の上限リクエスト/レスポンス ラインの上限に記載されている許容上限より大きいリクエスト/レスポンス ラインを送信しないことを想定しています。

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

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

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

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

    これは、Apigee for Private Cloud で構成された Request-Line サイズの上限が 7 KB であることを示しています。

Apigee サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

次の診断情報を収集して、Apigee Edge サポートに連絡してください。

Public Cloud ユーザーの場合は、次の情報を入力します。

  • 組織の名前
  • 環境名
  • API プロキシ名
  • 414 エラーを再現するための完全な curl コマンド
  • API リクエストのトレース ファイル

Private Cloud ユーザーの場合は、次の情報を入力します。

  • 失敗したリクエストについて確認された完全なエラー メッセージ
  • 組織の名前
  • 環境名
  • API プロキシ バンドル
  • 失敗した API リクエストのトレース ファイル
  • 414 エラーを再現するための完全な 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