502 Bad Gateway - 重複ヘッダー

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

症状

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

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

考えられる原因

このエラーは、Apigee で重複が許可されていない特定の HTTP ヘッダーがある場合に発生します。 によって送信された HTTP レスポンスの一部として、同じ値または異なる値で複数回出現します。 Apigee Edge に送信します。

<ph type="x-smartling-placeholder"></ph>によると RFC 7230、セクション 3.2.2: Field Order送信者は複数のヘッダーを生成してはなりません メッセージ内に同じフィールド名を持つフィールドがあっても、そのフィールド値全体が ヘッダー フィールドはカンマ区切りのリストとして定義されています(例:#(values)] または header フィールド 既知の例外です。Apigee Edge が特定の同じヘッダーを検出した場合、それは許可されません。 が重複している場合、API 呼び出しによって送信された HTTP レスポンス で複数回 使用する場合は、 502 Bad Gateway とエラーコードを返します。 protocol.http.DuplicateHeader

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

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

原因 説明 トラブルシューティングの実施対象
レスポンスのヘッダーが重複している バックエンド サーバーからのレスポンスに重複したヘッダーが含まれています。 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. [プロキシ] フィルタが [すべて] に設定されていることを確認します。
  6. 障害コードTime に対してプロットします。
  7. 以下のように、障害コード protocol.http.DuplicateHeader が含まれるセルを選択します。

    大きい画像を表示

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

    大きい画像を表示

  9. 上の例に示すように、[Status Code] が 502 であることを確認します。
  10. [ログを表示] をクリックし、失敗したリクエストの行を開きます。
  11. [ログ] ウィンドウで、次の情報をメモします。

    • ステータス コード: 502
    • 障害の発生元: target
    • 障害コード: protocol.http.DuplicateHeader
  12. [Fault Source] が target の場合、バックエンド サーバーからのレスポンスに重複したヘッダーが含まれていました。

Trace ツール

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

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションを有効にし、以下のいずれかを行います。 <ph type="x-smartling-placeholder">
      </ph>
    1. 502 Bad Gateway エラーが発生するのを待つ、または
    2. 問題を再現できる場合は、API 呼び出しを行い、 502 Bad Gateway 件のエラー
  2. [Show all Flow Infos] が有効になっていることを確認します。

  3. 失敗したリクエストのいずれかを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを移動して、エラーが発生した場所を特定します。
  5. このエラーは通常、Request sent to target の後のフローで発生します。 server フェーズで実行します。

    大きい画像を表示

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

    上記のサンプル トレースでは、エラーが Duplicate Header "Expires" と表示されます。以降 リクエストがバックエンド サーバーに送信された後に Apigee によってエラーが発生した場合、 バックエンド サーバーがヘッダー Expires を複数回送信したことを示しています。

  7. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
  8. [Phase Details - Response Headers] セクションまで下にスクロールし、 次のように、X-Apigee-fault-codeX-Apigee-fault-source の値を設定します。

    大きい画像を表示

  9. X-Apigee-fault-codeX-Apigee-fault-source の値が表示されます。 protocol.http.DuplicateHeadertarget として定義され、 このエラーは、バックエンド サーバーによって重複したヘッダーが レスポンス ヘッダー Expires
    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. 以下について プロキシ チェーン つまり、ターゲット サーバーまたはターゲット エンドポイントが Apigee の別のプロキシを呼び出している場合です。

    1. これを判断するには、Request sent to target サーバー フェーズに戻ります。 [Show Curl] をクリックします。

    2. [Curl for Request Sent to Target Server] ウィンドウが開き、ここから次のことができます。 ターゲット サーバーのホスト エイリアスを指定します。

    3. ターゲット サーバーのホスト エイリアスが仮想ホストのエイリアスを指している場合、そのエイリアスはプロキシ チェーン化します。この場合、次の時点まで、チェーンされたプロキシに対して上記のすべての手順を繰り返す必要があります。 502 Bad Gateway エラーの原因を特定します。
    4. ターゲット サーバーのホスト エイリアスがバックエンド サーバーを指している場合、 バックエンド サーバーがレスポンスで重複するヘッダーを Apigee に送信しています。

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.DuplicateHeader の値と一致する場合は、 X-Apigee-fault-source. の値を確認します。

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

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

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

原因: レスポンスのヘッダーが重複している

診断

  1. API を使用して、観測されたエラーの障害コード障害ソースを特定します。 Monitoring または NGINX のアクセスログについては、一般的な診断手順の説明をご覧ください。
  2. [Fault Source] の値が target の場合、レスポンスが ヘッダーが重複しています。
  3. レスポンスの一部として複数回送信される実際のヘッダーを判別できる 次のいずれかの方法を使用します。

    エラー メッセージ

    エラー メッセージを使用する。

    1. Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、 faultstring に送信します。faultstring には、Pod で使用するヘッダー名が 複数回送信されています。

      エラー メッセージの例:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 上記のエラー メッセージでは、ヘッダー Expires が送信されたことがわかります。 faultstring のように複数回実行されています。

    実際のリクエスト

    実際のリクエストを使用する場合:

    1. ターゲット サーバーに対して行われた実際のリクエストにアクセスできない場合は、 対応する curl コマンドを Trace ツールの使用のステップ 10.a から ステップ 10.b.
    2. ターゲット サーバー アプリケーションに対して行われた実際のリクエストにアクセスできる場合は、 次の操作を行います。

      1. ターゲット サーバーを呼び出します。

        この例で使用されているターゲット サーバーのリクエストの例:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. レスポンスに含まれているヘッダーのリストを確認します。

        この例で使用されているターゲット サーバーからのレスポンスの例:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        上記のリクエスト例では、ヘッダー Expires がさらに送信されます。 あります。したがって、このリクエストは 502 Bad Gateway で失敗します。 エラーとエラーコード: protocol.http.DuplicateHeader

        <ph type="x-smartling-placeholder">
      3. faultstring に名前が出現するヘッダーがある場合 複数回出現する場合、これが問題の原因です。 エラーが発生します。上記のケースでは、ヘッダー Expires が複数回送信されます。

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

解決策

重複を修正する

オプション 1 [推奨される方法] 重複したヘッダーが含まれないようにバックエンド サーバーを修正する

<ph type="x-smartling-placeholder">
  1. 特定のバックエンド サーバーが重複ヘッダーを送信する理由を分析する Expires を実行し、API プロキシがそれを受け入れられるかどうかを確認します。イン HTTP 仕様上、これは望ましいことではありません。 RFC7230
  2. これが望ましくない場合は、重複したヘッダーを送信しないようにターゲット サーバー アプリケーションを変更します。 上記の例では、ヘッダー Expires が送信されています。 同じ値で 2 回実行されるため、これは望ましいことではありません。この問題を解決するには、 ターゲット サーバーが Expires ヘッダーを 1 回だけ渡すようにします。
  3. これが望ましく、ヘッダーの重複を許可する場合は、 オプション #2 CwC プロパティを使用する

CwC

オプション #2 CwC プロパティを使用する

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

Apigee には CwC プロパティが用意されています。 HTTPHeader.<HeaderName>: クライアント アプリケーションとターゲット Apigee Edge の API プロキシに重複するヘッダーを送信します。

CwC プロパティ
HTTPHeader.<HeaderName> allowDuplicates,multivalued

たとえば、Message Processor で次のプロパティを設定して、重複を許可することができます。 ヘッダー Expires に複数の値を設定します。

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud ユーザーは、プロパティを構成して Apigee を阻止できます。 リクエストに 502 Bad Gateway エラーが含まれている場合でも、エッジが 502 Bad Gateway エラーを発生させない 複製ヘッダーを使用します。 <ph type="x-smartling-placeholder"></ph> 重複ヘッダーを使用するように Message Processor を構成するの入門ガイドを参照してください。
  2. Public Cloud ユーザーの場合は、Apigee Edge サポートに連絡して、この構成を依頼してください。 おすすめします。

仕様

Apigee は、サービスが中断することを想定した場合、502 Bad Gateway エラー レスポンスを返します。 バックエンド サーバーは、次の RFC 仕様に従って動作します。

仕様
<ph type="x-smartling-placeholder"></ph> RFC 7230、セクション 3.2.2: Field Order
<ph type="x-smartling-placeholder"></ph> RFC 7230、セクション 3.2: Header Fields

Apigee サポートのサポートが必要な場合は、にアクセスしてください。 診断情報の収集が必要な場合

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

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

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

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

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

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