502 Bad Gateway - TooBigHeaders

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

症状

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

エラー メッセージ

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

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. 障害コード時間をプロットします。
  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. 失敗したリクエストのいずれかを選択し、トレースを確認します。
  3. トレースのさまざまなフェーズを移動して、障害が発生した場所を特定します。
  4. 通常、このエラーは、次の図に示すように、ターゲット サーバーに送信されたリクエスト フェーズの直後の エラーという名前のフローに表示されます。

    大きい画像を表示

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

    • エラー: 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(分析データ記録)フェーズに移動してクリックすると、関連する詳細が表示されます。

    大きい画像を表示

    次の値をメモします。

    エラー ヘッダー
    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 protocol.http.TooBigHeaders の値と一致する 502 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

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

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

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

原因: レスポンスのヘッダーのサイズが許容上限を超えている

診断

  1. 一般的な診断手順で説明したように、API モニタリング、Trace ツール、NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースレスポンス ペイロード サイズを特定します。
  2. Fault Source の値が target の場合、ターゲット/バックエンド サーバーから Apigee に送信されたレスポンスに、Apigee Edge で許可されている上限を超えるサイズのヘッダーが含まれていることを示します。
  3. 次のいずれかの方法で、ターゲット/バックエンドからのレスポンスに、許可された上限を超えるサイズのヘッダーが含まれていることを検証できます。

    エラー メッセージ

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

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

    エラー メッセージの例:

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

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

    実際のリクエスト

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

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

    1. パブリック クラウド/プライベート クラウドのユーザーの場合は、バックエンド サーバー自体から、またはバックエンド サーバーへのリクエストを許可されている他のマシンから、バックエンド サーバーに直接リクエストを行います。
    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 のログを使用して、レスポンス ヘッダーのサイズが 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

      これは、合計ヘッダー サイズが 25 KB を超えていることを意味します。Apigee は、サイズが 25 KB の上限を超え始めると、障害コード protocol.http.TooBigHeaders でエラーをスローします。

解決策

サイズを固定

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

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

CwC

オプション 2 : CwC プロパティを使用してレスポンス ヘッダー サイズの上限を引き上げる

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

上限

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

  1. パブリック クラウド ユーザーの場合、リクエスト ヘッダーとレスポンス ヘッダーの最大サイズは、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.limit プロパティが http.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