502 Bad Gateway - ResponseWithBody

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

症状

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

エラー メッセージ

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

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 であるのに、レスポンスの本文や次のヘッダーが含まれている場合に発生します。

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

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

そのため、Apigee Edge は次の状況で、エラーコード protocol.http.ResponseWithBody を含むステータス コード 502 Bad Gateway をクライアントに返します。

バックエンド サーバーからのステータス コード
バックエンド サーバーからのレスポンスに 204 No Content(コンテンツなし) 205 Reset Content
レスポンスの本文 エラー エラー

Content-Length ヘッダー

(ゼロ以外に設定)

エラー エラー

Content-Encoding

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

エラー NO ERROR
Transfer-Encoding エラー エラー

このエラーの原因として、次のことが考えられます。

原因 説明 トラブルシューティングの実施対象
バックエンド サーバーからの 204 レスポンスを含むレスポンス本文またはヘッダー バックエンド サーバーが、レスポンスの本文や 1 つ以上のヘッダー Content-Type、Content-Encoding、Transfer-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. 障害コードと時間をプロットします。
  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. 失敗したリクエストのいずれかを選択し、トレースを確認します。
  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-code と X-Apigee-fault-source の値を確認します。

    ( 大きい画像を表示)

  8. X-Apigee-fault-code と X-Apigee-fault-source の値は、それぞれ are protocol.http.ResponseWithBody と target になります。これは、バックエンド サーバーがレスポンスの本文や考えられる原因で説明したヘッダーのいずれかとともに 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

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

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

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

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

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

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

診断

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

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

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

      サンプル 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
      

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

    4. 上記のすべての例で、バックエンド サーバーはレスポンス ボディと、考えられる原因で説明したヘッダーのいずれかとともに、204 No Content または 205 Reset Content ステータス コードを送信しました。
    5. そのため、Apigee Edge はエラーコード protocol.http.ResponseWithBody で 502 Bad Gateway ステータス コードを送信しました。

解決策

バックエンド サーバーが 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、セクション 6.3.5: 204 No Content
RFC 7231、セクション 6.3.6: 205 Reset Content

重要なポイント

推奨される解決策は、バックエンド サーバーを修正して、レスポンス本文とヘッダー(Content-Length、Content-Encoding、Transfer-Encoding)なしで 204 No Content と 205 Reset Content のステータス コードを送信し、 RFC 7231、セクション 6.3.5: 204 No Content と RFC 7231、セクション 6.3.6: 205 Reset Content の仕様に準拠することです。

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

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

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