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

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。
情報

症状

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

エラー メッセージ

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

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))が含まれています。

考えられる原因

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

このエラーの原因を調べる前に、リクエスト行の意味とサイズを確認する方法について説明します。

Request-Line について

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

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

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

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

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

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

Request-Line サイズについて

  1. 上記の例では、リクエストの start 行(1 行目)は 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. 障害コード時間をプロットします。
  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 protocol.http.TooBigLine の値と一致する 414 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    上記の NGINX アクセスログのサンプル エントリには、X-Apigee-fault-codeX-Apigee-fault-source に次の値が設定されています。

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

    リクエストの長さを確認します。 7244(7.244 KB > 許容上限)

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

診断

  1. 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースリクエスト長のサイズを特定します。
  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 K を超える 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 をスローし、障害コード protocol.http.TooBigline を含む 414 ステータス コードをクライアント アプリケーションに返します。

解決策

サイズを固定

オプション 1 [推奨]: 許可された上限を超えるリクエスト URI サイズを送信しないようにクライアント アプリケーションを修正する

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

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. 上限を超えて URI を送信する必要がある場合は、次のオプションに進みます。

CwC

オプション 2 : CwC プロパティを使用してリクエスト行の上限を引き上げる

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

上限

Apigee は、クライアント アプリケーションとバックエンド サーバーが、Apigee Edge の上限リクエスト/レスポンス ラインの上限で説明されているように、許可されている上限を超えるサイズのリクエスト/レスポンス ラインを送信しないことを想定しています。

  1. パブリック クラウド ユーザーの場合、リクエストとレスポンスの行の最大サイズは、Apigee Edge の上限リクエスト/レスポンスの行のサイズで説明されているとおりです。
  2. プライベート クラウドのユーザー の場合、リクエストとレスポンスの行サイズのデフォルトの最大制限を変更している可能性があります(推奨される方法ではありませんが)。最大リクエスト行サイズの上限は、現在の上限を確認する方法の手順に沿って確認できます。

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

このセクションでは、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.limit プロパティが http.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