502 Bad Gateway - TooBigLine

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します。
info

症状

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

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

さらに、次のエラー メッセージも確認できます。

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

考えられる原因

このエラーは、HTTP レスポンスの一部としてターゲット/バックエンド サーバーから Apigee Edge に送信された Response-Line のサイズが、Apigee Edge で許可されている上限 limit in Apigee Edge を超えている場合に発生します。

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

Response-Line について

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

  1. Status-Line(Apigee では Response-Line と呼ばれます)
  2. (HTTP ヘッダーのセット)
  3. [ Body ]

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

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

ターゲット/バックエンド サーバー アプリケーションから HTTP レスポンスが送信されると、送信される最初の行は、上記のResponse-Lineを表します。その後に ヘッダーとレスポンス本文/ペイロードが続きます。次のサンプル スクリーンショットは、一般的な curl リクエスト、[Request] 部分、[Response] 部分( Response-Line を含む)を示しています。

Response-Line のサイズについて

  1. 上記のサンプルでは、レスポンスの開始行(最初の行)は Response-Lineとも呼ばれ、次のようになります。

    HTTP/1.1 200 OK

    この Response-Line には 15 ASCII characters が含まれているため、サイズは ~15 bytes です。これは Apigee Edge で許可されている上限内であるため、Apigee Edge はエラーなしでレスポンスをクライアントに返します。

  2. 同様に、上記の エラー メッセージの faultstring には、"response line size exceeding 2,048" が含まれています。これは、ターゲット/バックエンド サーバーから送信された HTTP レスポンスのResponse-Line が 2,048 バイトを超えていることを示しています。

大きな Response-Line について

Status-Line(ここではResponse-Lineと呼ばれます)の定義と一般的な HTTP リクエストとレスポンスに従うと、サイズは Apigee Edge で定義されているデフォルトの上限である 2 K よりもはるかに小さくなるため、上限に達することはないと考えられます。ただし、この上限を超える可能性があるシナリオがいくつかあります。

  1. ターゲット/バックエンド サーバーが HTTP システムではない。HTTP 以外の レスポンスで応答している可能性があります。
  2. ターゲット/バックエンド サーバーに問題があり、HTTP レスポンスの一部として長い Response-Line を送信している。

詳細については、 エラー protocol.http.TooBigLine, "response line size exceeding 2,048 を取得するをご覧ください。

このエラーの原因として考えられるのは次のとおりです。

原因 説明 トラブルシューティングの実施対象
Response-Line のサイズが許可されている上限を超えている ターゲット/バックエンド サーバーから Apigee Edge への HTTP レスポンスの一部として送信された Response-Line のサイズが、Apigee Edge で許可されている 上限 を超えている Edge Public Cloud と Private Cloud のユーザー

共通の診断手順

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

API Monitoring

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

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

  3. [分析 > API Monitoring > 調査] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. [プロキシ] フィルタを選択して、障害コードを絞り込むことができます。
  6. [障害コード] を [時間] に対してプロットします。
  7. 次の図に示すように、障害コード protocol.http.TooBigLine を含むセルを選択します。

    ( 大きい画像を表示)

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

    ( 大きい画像を表示)

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

  10. [ログ] ウィンドウで、次の詳細を確認します。
    • ステータス コード: 502
    • 障害の発生元: target
    • 障害コード: protocol.http.TooBigLine。
  11. If the [Fault Source] has the value target and the [Fault Code] has the value protocol.http.TooBigLine, then that indicates that the HTTP レスポンス from the target/ バックエンド サーバー has a Response-Line size greater than the maximum allowed limit in Apigee Edge.

Trace ツール

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

    トレースからエラーの値を確認します。

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

    これは、Apigee Edge(Message Processor コンポーネント)が、Response-Line のサイズが許可されている上限を超えているため、バックエンド サーバーからレスポンスを受信するとすぐにエラーをスローすることを示しています。

  5. [Response Sent to Client] フェーズでクライアントに送信されたエラー メッセージが表示されます。

    ( 大きい画像を表示)

  6. トレースからエラーの値を確認します。
    • エラー: 502 Bad Gateway。
    • エラー コンテンツ: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. トレースの [AX](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

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

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

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

    説明: ORG、ENV、PORT# は実際の値に置き換えます。

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

原因: Response-Line のサイズが許可されている上限を超えている

診断

  1. 共通の診断手順の説明に従って、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード と障害の発生元 を特定します。
  2. [障害の発生元] の値が target の場合、ターゲット/バックエンド サーバー アプリケーションから Apigee に送信された Response-Line のサイズが、Apigee Edge で許可されている上限を超えていることを示します。
  3. Response-Line のサイズが 2 KB の上限を超えていることを確認するには、次のいずれかの方法を使用します。

    エラー メッセージ

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

    Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、 faultstring を参照してください。

    エラー メッセージの例:

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

    上記の faultstring は、Response-Line のサイズが 2 KB の上限を超えていることを示しています。

    実際のリクエスト

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

    ターゲット/バックエンド サーバー アプリケーションに対して行われた実際のリクエストにアクセスできる場合は、次の手順を行います。

    1. Response-Line のサイズを確認します。
    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

      上記の場合、Response-Line HTTP/1.1 200 1111…<trimmed>...11111111 は 2 KB より大きく、2 K を超える ASCII 文字が含まれています。

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

    Message Processor ログ

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

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

    1. 共通の診断手順の説明に従って、API Monitoring、Trace ツール、 または NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を特定します。
    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 は、Response-Line のサイズが 2 KB を超えていることを示しています。そのため、 Apigee Edge は例外をスローし、障害コード protocol.http.TooBigline の 502 ステータス コードをクライアント アプリケーションに返します。

解決策

サイズを修正する

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

  1. 上限で定義されているように、特定のクライアントが許可されている上限を超えるサイズの Response-Line を送信する理由を分析します。
  2. 望ましくない場合は、許可されている上限未満のサイズの Response-Line を送信するようにターゲット/バックエンド サーバー アプリケーションを変更します。
  3. 望ましく、許可されている上限を超えるサイズの Response-Line を送信する場合は、次のオプションに進みます。

CwC

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

Apigee には、Response-Line のサイズ上限を引き上げるための CwC プロパティが用意されています。 詳細については、 Message Processor の Response-Line の上限を設定するをご覧ください。

上限

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

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

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

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

  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.limit が http.properties で値 2k に設定されていることに注意してください。

    これは、Apigee for Private Cloud で構成された Response-Line のサイズの上限が 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

    説明: ORG、ENV、PORT# は実際の値に置き換えます。

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