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

<ph type="x-smartling-placeholder"></ph> 現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント
詳細

症状

クライアント アプリケーションは、次の HTTP ステータス コード 414 Request-URI Too Long を取得します。 API 呼び出しのレスポンスとしてエラーコード 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)です。

考えられる原因

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

このエラーの考えられる原因を確認する前に、リクエスト行が何であるかを理解しておきましょう。 サイズの確認方法を説明します。

リクエスト行について

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

  1. <ph type="x-smartling-placeholder"></ph> リクエスト行
  2. ( HTTP ヘッダーのセット)
  3. [本文 ]

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

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

クライアント アプリケーションからサーバーに対して HTTP リクエストが送信されると、最初の行は サーバーには上記の Request-Line が含まれています。その後に リクエスト本文/ペイロードの 3 つです

次のサンプル スクリーンショットは、一般的な curl リクエストであるリクエストを示しています。 (Request-Line とともに)と Response パートがあります。

リクエスト ラインのサイズについて

  1. 上記のサンプルでは、リクエストの start 行(最初の行)も、 リクエスト行と呼ばれるすべての行を以下に示します。
    GET /test/ HTTP/1.1
    

    リクエスト行のサイズは、次を含むため ~19 bytes です。 19 ASCII characters。これは 内にあるため、 場合、リクエストはエラーなしで処理されます。 成功のレスポンスが返されます

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

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

原因 説明 トラブルシューティングの実施対象
リクエストのペイロード サイズが上限を超えている HTTP の一部としてクライアント アプリケーションが送信するリクエスト URI のサイズ。 Apigee Edge へのリクエストが Apigee Edge で許可されている上限を超えています。 Edge Public Cloud ユーザーと Edge Private Cloud ユーザー

共通の診断手順

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

API Monitoring

<ph type="x-smartling-placeholder">

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

  1. <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインするユーザーとして、 付与します
  2. 問題を調査する組織に切り替えます。

  3. [Analyze] >API モニタリング >Investigate ページをご覧ください。
  4. エラーが発生した期間を選択します。
  5. 障害コードTime に対してプロットします。
  6. 障害コードが protocol.http.TooBigLine であるセルを選択し、 次のようにステータス コード 414 を指定します。

    ( 拡大画像を表示

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

    ( 拡大画像を表示

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

    ( 拡大画像を表示

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

    • ステータス コード: 414
    • 障害の発生元: apigee
    • 障害コード: protocol.http.TooBigLine
    • リクエストの長さ(バイト): 7244 (> 7KB)
  10. [Fault Source] の値が apigee または MP の場合、 障害コードの値は protocol.http.TooBigLine です。 Request-Length が 7 KB を超えている場合、これは HTTP リクエストが の値のリクエスト URI が、 Apigee で許容される上限

Trace ツール

<ph type="x-smartling-placeholder">

NGINX

<ph type="x-smartling-placeholder">

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 で 414 エラーが見つかった場合 protocol.http.TooBigLine の値と一致するもの)を求め、 X-Apigee-fault-source. の値。

    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. [Fault Code]、[Fault Source]、[Request-Length size] の値を決定します。 API Monitoring、Trace Tool、または NGINX Access のログを使用して確認されたエラー 一般的な診断手順
  2. [Fault Source] の値が apigee または MP の場合、 は、クライアント アプリケーションから Apigee に送信されたリクエスト サイズが Apigee Edge で許可されている上限
  3. 次のいずれかを使用して、リクエスト行のサイズが上限の 7 KB を超えていることを確認できます。 次のメソッドを使用します。

    エラー メッセージ

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

    Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、 faultstring をご覧ください。faultstring は、 リクエスト ラインのサイズが上限の 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 ログを使用して検証するには:

    <ph type="x-smartling-placeholder">

    Private Cloud ユーザーは、Message Processor のログを使用して リクエスト ラインのサイズが 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 ステータス コードをクライアント アプリケーションに送信します。

解決策

<ph type="x-smartling-placeholder">

サイズを修正

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

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

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. 許容される上限を超える URI を送信することが望ましい場合は、 説明します。

CwC

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

<ph type="x-smartling-placeholder">

Apigee では、 CwC プロパティ: リクエスト行のサイズ上限を増やすことができます。 詳しくは、 <ph type="x-smartling-placeholder"></ph> Message Processor でリクエスト行の上限を設定する

<ph type="x-smartling-placeholder">

上限

Apigee では、クライアント アプリケーションとバックエンド サーバーがリクエスト/レスポンス行を送信しないことを想定している サイズが、リクエスト/レスポンス ラインの上限に記載されている上限より大きい場合。 (Apigee Edge 制限内)をご覧ください。

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

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

<ph type="x-smartling-placeholder">

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

  1. Message Processor マシンで、次のプロパティを検索します。 HTTPRequest.line.limit/opt/apigee/edge-message-processor/conf ディレクトリを作成し、 次のように設定されている値を確認します。
    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 で構成されたリクエスト ライン サイズの上限を示しています。 クラウドは 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