502 Bad Gateway - TooBigLine

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

症状

クライアント アプリケーションが HTTP ステータス コードと 502 Bad Gateway エラーコードを取得する protocol.http.TooBigLine を API 呼び出しのレスポンスとして使用します。

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

考えられる原因

このエラーは、Response-Line サイズが ターゲット/バックエンド サーバーを Apigee に HTTP レスポンスの一部であるエッジが、許容される最大値を超えている Apigee Edge の制限をご覧ください。

このエラーの考えられる原因を確認する前に、レスポンス ラインが何であるかを理解して サイズの確認方法を説明します。

レスポンス ラインについて

一般的な HTTP レスポンスは、次の 3 つの部分で構成されます。

  1. <ph type="x-smartling-placeholder"></ph> ステータス ライン(Apigee ではレスポンス ラインと呼ばれます)
  2. ( HTTP ヘッダーのセット)
  3. [本文 ]

Response-Line は、プロトコル バージョン と数値 という 3 つの部分で構成されます。 ステータスコード関連するテキストフレーズを以下のように返します。

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

ターゲット/バックエンド サーバー アプリケーションから HTTP レスポンスが送信されると、 sent は、前述の Response-Line を表します。その後に レスポンスの本文/ペイロードが含まれます。次のサンプル スクリーンショットは、 curl リクエスト、Request パート、Response パート( Response-Line)。

レスポンス ラインのサイズについて

  1. 上記のサンプルでは、レスポンスの start 行(1 行目)も、 Response-Line と呼ばれるものは、次のとおりです。

    HTTP/1.1 200 OK
    

    このレスポンス行には 15 ASCII characters が含まれているため、~15 bytes のサイズになります。これは 内にあるため、 Apigee Edge で許可されている上限を超えると、レスポンスは何も変更せずにクライアントに返送されます。 エラーが表示されます。

  2. 同様に、faultstring の 上記のエラー メッセージ"response line size exceeding 2,048" が含まれています。これは、HTTP レスポンスの Response-Line が 2,048 バイトを超えています。

大きなレスポンス ラインについて

定義によると、 <ph type="x-smartling-placeholder"></ph> Status-Line(ここでは Response-Line と表記)と一般的な HTTP リクエストおよび レスポンスの場合、サイズは Apigee Edge に定義されているデフォルトの上限である 2,000 よりもはるかに小さくなります。 ですから、 上限に達します。ただし、次のような場合にこの上限を超える可能性があります。

  1. ターゲット/バックエンド サーバーが HTTP システムではありません。非 HTTP レスポンスで応答している可能性があります。 レスポンスが返されます。
  2. ターゲット/バックエンド サーバーに問題があり、HTTP の一部として長いレスポンス行を送信している レスポンスが返されます。

詳しくは、 <ph type="x-smartling-placeholder"></ph> エラー プロトコル.http.TooBigLine、「response line size too 2,048」(レスポンス行のサイズが 2,048 を超えています)が表示される

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

原因 説明 トラブルシューティングの実施対象
レスポンス行のサイズが上限を超えています トラフィックの一部としてターゲット/バックエンド サーバーによって送信される Response-Line のサイズ。 Apigee Edge への HTTP レスポンスが 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. [Proxy] フィルタを選択して、障害コードを絞り込むことができます。
  6. 障害コードTime に対してプロットします。
  7. 障害コード protocol.http.TooBigLine を持つセルを選択します。 下に示します。

    ( 拡大画像を表示

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

    ( 拡大画像を表示

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

  10. [ログ] ウィンドウで、次の詳細をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    • ステータス コード: 502
    • 障害の発生元: target
    • 障害コード: protocol.http.TooBigLine
  11. [Fault Source] の値が target で、[Fault Source] の値が Code の値は protocol.http.TooBigLine であり、 ターゲット/ バックエンド サーバーからの HTTP レスポンスの Response-Line サイズが Apigee Edge での上限の上限があります。

Trace ツール

<ph type="x-smartling-placeholder">
  1. トレース セッションを有効にする および次のいずれかです。 <ph type="x-smartling-placeholder">
      </ph>
    1. 502 Bad Gateway エラーが発生するまで待ちます。または
    2. 問題を再現できる場合は、API 呼び出しを行って 502 Bad Gateway エラーを再現してください。
  2. 失敗したリクエストのいずれかを選択し、トレースを調べます。
  3. トレースのさまざまなフェーズを順に確認し、障害が発生している場所を特定する 発生しました。
  4. 通常、エラーは flowinfo [Error] に表示されます。 「Request sent to target server」フェーズの後、次のようになります。

    トレースのエラーの値をメモします。

    • エラー: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    これは、Apigee Edge(Message Processor コンポーネント)がエラーを Response Line のサイズの関係により、バックエンド サーバーからのレスポンスを受信するとすぐに 超えています。

  5. クライアントに送信されたエラー メッセージは、[Response Sent to クライアント フェーズを以下に示します。

    ( 拡大画像を表示

  6. トレースのエラーの値をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    • エラー: 502 Bad Gateway
    • エラーの内容: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. トレースの AXAX(Analytics Data Recorded)フェーズに移動することもできます。 クリックするとエラーの詳細が表示されます。

    ( 拡大画像を表示

    次の値に注意してください。

    リクエスト ヘッダー
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    エラー コンテンツ : 本文 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

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

  1. Private Cloud ユーザーは、NGINX アクセスログを使用して次のことを行えます。 HTTP 502 エラーに関する重要な情報を確認する。
  2. NGINX アクセスログを確認します。

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

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

  3. 特定の期間に 502 エラーがないか検索して確認できます (過去に発生した場合)か、引き続き失敗するリクエストがあるかどうかを 502
  4. X-Apigee-fault-code で 502 エラーが見つかった場合 protocol.http.TooBigLine の値と一致するもの)を求め、 X-Apigee-fault-source. の値。

    NGINX アクセスログの上記のサンプル エントリには、X- Apigee-fault-code X-Apigee-fault-source:

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

原因: レスポンス行のサイズが許可された上限を超えている

診断

  1. API を使用して、観測されたエラーの障害コード障害ソースを特定します。 Monitoring、Trace ツール、または NGINX アクセスログ( 一般的な診断手順
  2. [Fault Source] の値が target の場合は、 ターゲット/バックエンド サーバー アプリケーションから Apigee に送信されたレスポンス ラインのサイズが Apigee Edge で許可される上限
  3. 1 つのメッセージを使用して、レスポンス行のサイズが 2 KB の上限を超えていることを確認できます。 次のメソッドを使用できます。

    エラー メッセージ

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

    Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、 faultstring

    エラー メッセージの例:

    "faultstring":"response line size exceeding 2,048"
    

    上の faultstring は、レスポンス行のサイズが許容値を超えたことを示します。 サイズの上限は 2 KB です。

    実際のリクエスト

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

    ターゲット/バックエンド サーバーに対する実際のリクエストにアクセスできる場合 次の手順を実施します

    1. レスポンス行のサイズを確認する
    2. URI のサイズが Apigee Edge で許可されている上限を超えている場合、これが 解決します。

      ターゲット/バックエンド サーバーからのレスポンスの例:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      上記のケースでは、レスポンス行の HTTP/1.1 200 1111…<trimmed>...11111111 が 2 KB を超えています。つまり、次が含まれています 2,000 文字以下の ASCII 文字を使用してください。

      他のクライアントを使用している場合は、クライアント ログを確認して、 Apigee Edge に送信される Response-Line のサイズを確認します。

    Message Processor のログ

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

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

    Private Cloud ユーザーは、Message Processor ログを使用して次のことができます。 応答行のサイズが Apigee Edge で許可されている上限をご覧ください。

    1. 失敗したリクエストのメッセージ ID を、API Monitoring、Trace ツール、 または NGINX アクセスログを作成する必要があります。詳しくは、一般的な診断手順をご覧ください。
    2. Message Processor ログでメッセージ ID を検索します。

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

    3. system.log から次のような行が表示されます。

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      上記のテキスト message = response line size exceeding 2,048 レスポンス ラインのサイズが 2 KB を超えていることを示すエラー メッセージ。したがって、 Apigee Edge は例外をスローし、次の内容を含むステータス コード 502 を返します。 クライアント アプリケーションに送信します。protocol.http.TooBigline

解決策

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

サイズを修正

オプション 1 [推奨]: ターゲット/バックエンド サーバー アプリケーションが送信されないように修正する レスポンス - サイズが上限を超えるレスポンス行

<ph type="x-smartling-placeholder">
  1. 特定のクライアントがサイズの大きな回答行を送信すべき理由を分析する 制限で定義されている上限を超えています。
  2. これが望ましくない場合は、ターゲット/バックエンド サーバー アプリケーションを修正して、 許可された制限より小さいサイズの Response-Line を送信。
  3. 望ましく、24 文字を超えるサイズの Response-Line を送信する 次のオプションに進みます。

CwC

オプション 2: CwC プロパティを使用して回答行の上限を引き上げる

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

Apigee は CwC を提供します。 プロパティを使用して、Response-Line サイズの上限を引き上げることができます。 詳しくは、 <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">

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

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

    これは、Apigee for Private で構成されたレスポンス ラインのサイズの上限を示しています。 クラウドは 2 KB です。

Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合

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

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

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

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

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

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