502 Bad Gateway - ResponseWithBody

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

内容

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

エラー メッセージ

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

HTTP/1.1 502 Bad Gateway

加えて、次のいずれかのエラー メッセージが表示される場合があります。

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

考えられる原因

このエラーは、バックエンド サーバーから Apigee Edge への HTTP レスポンスが 204 No Content または 205 Reset Content であるのに、レスポンスの本文や次のヘッダーの 1 つ以上を含む場合に発生します。

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

RFC 7231、section 6.3.5: 204 No Content RFC 7231、section 6.3.6: 205 Reset Content の仕様に従い、送信元サーバーによって、ステータス コード 204 No Content または 205 Reset Content のレスポンス ペイロードの本文の一部として追加のコンテンツを送信しないことが想定されています。Content-LengthContent-EncodingTransfer-Encoding などのレスポンス ヘッダーは、レスポンス ペイロードのサイズ、種類、形式を示します。

したがって、次のような状況では、Apigee Edge は 502 Bad Gateway ステータス コードとエラーコード protocol.http.ResponseWithBody をクライアントに返します。

バックエンド サーバーのステータス コード
バックエンド サーバーからのレスポンスには以下が含まれます: 204 No Content(コンテンツなし) 205 コンテンツのリセット
レスポンスの本文 エラー エラー

Content-Length ヘッダー

(ゼロ以外に設定)

エラー エラー

Content-Encoding

Apigee Edge でサポートされているエンコードに設定)

エラー エラーなし
Transfer-Encoding エラー エラー

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

原因 説明 トラブルシューティングの実施対象
バックエンド サーバーからの 204 レスポンスを含むレスポンス本文またはヘッダー バックエンド サーバーは、レスポンス本文や 1 つ以上のヘッダー(Content-TypeContent-EncodingTransfer-Encoding)を含む 204 No Content または 205 Reset Content レスポンスを送信します。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

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

API Monitoring

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

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

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [Time] に [Fault Code] をプロットします。
  6. 次のように、障害コード protocol.http.ResponseWithBody を含むセルを選択します。

    拡大画像を表示

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

    拡大画像を表示

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

    拡大画像を表示

  9. [ログ] ウィンドウで、次の詳細をメモします。
    • ステータス コード: 502
    • 障害ソース: target
    • 障害コード: protocol.http.ResponseWithBody
  10. [Fault Source] の値が target、[Fault Code] の値が protocol.http.ResponseWithBody の場合、バックエンド サーバーが 204 No Content または 205 Reset Content のステータス コードを、レスポンスの本文や考えられる原因セクションに記載されているヘッダーのいずれかとともに送信したために、エラーが発生したことを示します。

Trace ツール

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

  1. トレース セッションを有効にして、次のいずれかを行います。
    1. 502 Bad Gateway エラーが発生するまで待ちます。
    2. 問題を再現できる場合は、API 呼び出しを行い、502 Bad Gateway エラーを再現します。
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストの 1 つを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
  5. 通常、エラーは、次のように [Request sent to target server] フェーズの直後の [flowinfo Error] に表示されます。

    シナリオ #1

    シナリオ 1: バックエンド サーバーが、レスポンスの本文や考えられる原因にリストされているヘッダーのいずれかを含むステータス コード 204 No Content で応答します。

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

    • エラー: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    シナリオ #2

    シナリオ 2: バックエンド サーバーが、レスポンスの本文や考えられる原因に記載されているヘッダーのいずれかを含むステータス コード 204 No Content で応答します。

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

    • エラー: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. トレースの AX(Analytics Data Recorded)フェーズに移動し、クリックします。
  7. [Phase Details]、[Error Headers] セクションまで下にスクロールし、次のように X-Apigee-fault-codeX-Apigee-fault-source の値を確認します。

    拡大画像を表示

  8. X-Apigee-fault-codeX-Apigee-fault-source の値は、それぞれ are protocol.http.ResponseWithBodytarget です。これは、バックエンド サーバーが 204 No Content または 205 Reset Content ステータス コードをレスポンスの本文や考えられる原因に記載されたヘッダーとともに送信したためにエラーが発生したことを示します。
    エラー
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

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

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

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

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. X-Apigee-fault-codeX-Apigee-fault-source の値は、それぞれ protocol.http.ResponseWithBodytarget です。これは、バックエンド サーバーが 204 No Content または 205 Reset Content ステータス コードをレスポンスの本文や考えられる原因に記載されたヘッダーとともに送信したためにエラーが発生したことを示します。

原因: バックエンド サーバーからのレスポンスの本文またはヘッダー

診断

  1. 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、または NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースを特定します。
  2. 障害コードprotocol.http.ResponseWithBody で、[Fault Source] の値が target の場合、バックエンド サーバーが 204 No Content または 205 Reset Content のステータス コードで、レスポンスの本文や考えられる原因に記載されているヘッダーのいずれかまたは両方で応答したことを示します。
  3. バックエンド サーバーが実際にレスポンス ペイロードの本文や考えられる原因に記載されている 1 つ以上のヘッダーを送信したかどうかを確認するには、次の操作を行います。

    1. Public Cloud ユーザーで、任意のシステムから直接バックエンド サーバーに同じ API リクエストを送信できる場合。

    2. Private Cloud ユーザーの場合、エラーが発生した特定の組織や環境に関連付けられた Message Processor のいずれかから、バックエンド サーバーに直接同じ API リクエストを送信できます。
    3. バックエンド サーバーから受信したレスポンスを確認し、レスポンス ペイロードの本文や上記の 1 つ以上のヘッダーが含まれていることを確認します。可能な場合、それがこのエラーの原因です。

      サンプル 1

      サンプル #1: Content-Encoding ヘッダーを含むバックエンド サーバー応答 204

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      このサンプルでは、バックエンド サーバーは 204 No Content ステータス コードと Content-Encoding: gzip を返します。

      サンプル 2

      サンプル 2: Content-Length ヘッダーを含むバックエンド サーバー応答 204

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      このサンプルでは、バックエンド サーバーは 204 No Content ステータス コードと Content-Length: 48 を返します。

      サンプル 3

      サンプル 3: バックエンド サーバー レスポンス 205 とレスポンス本文

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      このサンプルでは、バックエンド サーバーは、205 Reset Content ステータス コードでレスポンス本文が This is a sample Response. を返します。

    4. 上記の例ではいずれも、バックエンド サーバーが 204 No Content または 205 Reset Content ステータス コードを、レスポンスの本文や考えられる原因に記載されているヘッダーとともに送信しました。
    5. このため、Apigee Edge が 502 Bad Gateway ステータス コードとエラーコード protocol.http.ResponseWithBody を送信しました。

解像度

204 No Content または 205 Reset Content レスポンスを Apigee Edge に送信するときは、バックエンド サーバーが仕様 RFC 7231、セクション 6.3.6: 205 Reset Content を常に遵守するようにしてください。つまり、バックエンド サーバーは、次のものを 204 No Content または 205 Reset Content レスポンスの一部として送信してはなりません

  1. レスポンス ペイロードの本文
  2. 次のいずれかのヘッダーが含まれている。
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

仕様

バックエンド サーバーが 204 No Content または 205 Reset Content レスポンスを送信するが、次の RFC 仕様に準拠していない場合、Apigee Edge は 502 Bad Gateway ステータス コードとエラーコード protocol.http.ResponseWithBody を返します。

仕様
RFC 7231、section 6.3.5: 204 No Content
RFC 7231、セクション 6.3.6: 205 Reset Content

重要なポイント

推奨される解決策は、バックエンド サーバーを修正して、レスポンス本文と任意のヘッダー(Content-LengthContent-EncodingTransfer-Encoding)なしでステータス コード 204 No Content205 Reset Content を送信し、 RFC 7231、セクション 6.3.5: 204 No Content RFC 7231、セクション 6.3.6: 205 コンテンツをリセットする内容を遵守することです。

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