502 Bad Gateway - TooBigHeaders

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

内容

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

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

考えられる原因

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

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

原因 説明 トラブルシューティングの実施対象
レスポンス内のヘッダーのサイズが上限を超えています 特定のヘッダーのヘッダーサイズ、または Apigee Edge への HTTP レスポンスの一部としてターゲット/バックエンド サーバーから送信されたすべてのヘッダーのサイズの合計が、Apigee Edge で許容される上限を超えています。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

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

API Monitoring

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

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

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [Proxy] フィルタを選択すると、障害コードを絞り込むことができます。
  6. [Time] に [Fault Code] をプロットします。
  7. 次のように、障害コード protocol.http.TooBigHeaders を含むセルを選択します。

    拡大画像を表示

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

    拡大画像を表示

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

    拡大画像を表示

  10. [ログ] ウィンドウで、次の詳細をメモします。
    • ステータス コード: 502
    • 障害ソース: target
    • 障害コード: protocol.http.TooBigHeaders
  11. [Fault Source] の値が target で、[Fault Code] の値が protocol.http.TooBigHeaders の場合、ターゲット/ バックエンド サーバーからの HTTP レスポンスのヘッダーに Apigee Edge で許容される上限より大きいサイズがあることを示します。

Trace ツール

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

    拡大画像を表示

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

    • エラー: response headers size exceeding 25,600
    • error.class: com.apigee.errors.http.server.BadGateway

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

  5. 次のように、Apigee Edge から送信された [Response Sent to Client] エラー レスポンスに失敗が表示されます。

    拡大画像を表示

  6. トレースでエラーの値をメモします。上記のトレース例は次のとおりです。
    • エラー: 502 Bad Gateway
    • エラー内容: {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. トレースの AX(Analytics Data Recorded)フェーズに移動し、クリックして関連する詳細を表示します。

    拡大画像を表示

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

    エラーヘッダー
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    エラー コンテンツ: 本文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

NGINX

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

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

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

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

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

    NGINX のアクセスログの 502 エラーの例:

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

    エラーヘッダー
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

原因: レスポンス内のヘッダーのサイズが上限を超えています

診断

  1. 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して確認されたエラーの [Fault Code]、[Fault Source]、[Response Payload Size] を特定します。
  2. [Fault Source] の値が target の場合、ターゲット/バックエンド サーバーから Apigee に送信されるレスポンスに、サイズが Apigee Edge で許容される上限より大きいヘッダーがあることを示します。
  3. ターゲット/バックエンドからのレスポンスに、サイズが許容される上限より大きいヘッダーがあることを確認するには、次のいずれかの方法を使用します。

    エラー メッセージ

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

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

    エラー メッセージの例:

    "faultstring":"response headers size exceeding 25,600"
    

    上記のエラー メッセージで、faultstringレスポンスに含まれるヘッダーの合計サイズが上限を上限を超えていることに注意してください。

    実際のリクエスト

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

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

    1. Public Cloud/Private Cloud ユーザーは、バックエンド サーバー自体またはバックエンド サーバーへのリクエストを許可されている他のマシンから、バックエンド サーバーに直接リクエストを送信します。
    2. Private Cloud ユーザーは、いずれかの Message Processor からバックエンド サーバーに対してリクエストを行うこともできます。
    3. バックエンド サーバーから受信したレスポンスを調べます。具体的には、レスポンスで渡されたヘッダーの合計サイズを計算して検証します。
    4. レスポンス ペイロードのヘッダーのサイズが Apigee Edge で許可されている上限を超えている場合、それが問題の原因です。

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

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      上記の例では、Testheader1Testheader2 のサイズが大きく、Apigee Edge で許容される上限を超えているため、このエラーの原因となります。

    Message Processor のログ

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

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

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

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

    2. 特定の期間に 502 エラーがあったかどうか(問題が過去に発生していた場合)、または 502 で失敗しているリクエストがあるかどうかを検索します。次の検索文字列を使用できます。
      grep -ri "response headers size exceeding"
      
    3. system.log からの行は次のようになります。レスポンス ヘッダーのサイズは、状況に応じて異なる場合があります。
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
      
    4. Message Processor は、バックエンド/ターゲット サーバーからレスポンスを受け取り、ヘッダーの合計サイズが 25 KB を超えるとすぐに停止してエラーをスローします。

      response headers size exceeding 25,600

      これは、Total Header Size が 25 KB を超えていることを意味しており、サイズが上限の 25 KB を超え始めると、Apigee はエラーをスローします(障害コード: protocol.http.TooBigHeaders)。

解像度

サイズを修正

オプション 1 [推奨]: Apigee の上限を超えるヘッダーのサイズが送信されないようにターゲット サーバー アプリケーションを修正する

  1. 特定のターゲット サーバーが、上限で定義されている上限を超えるレスポンス ヘッダーのサイズを送信する理由を分析します。
  2. 望ましくない場合は、サイズが Apigee Edge で許容される上限より小さいレスポンス ヘッダーを送信するようにバックエンド サーバー アプリケーションを変更します。
  3. ヘッダー情報をレスポンスの本文の一部として送信できるかどうかを確認します。
  4. 可能であれば、レスポンス本文のヘッダーの一部として送信する予定の大きな情報を送信してください。これにより、レスポンス ヘッダーの制限を超えないようにすることができます。

CwC

方法 2 : CwC プロパティを使用してレスポンス ヘッダーのサイズ上限を増やす

Apigee には、レスポンス ヘッダーのサイズ上限を増やすことができる CwC プロパティが用意されています。詳細については、 Message Processor の上限の構成をご覧ください。

上限

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

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

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

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

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

    これは、Apigee for Private Cloud で構成されたレスポンス ペイロード サイズの上限が 25 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