現在、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-Length
、Content-Encoding
、Transfer-Encoding
などのレスポンス ヘッダーは、レスポンス ペイロードのサイズ、種類、形式を示します。
したがって、次のような状況では、Apigee Edge は 502 Bad Gateway
ステータス コードとエラーコード protocol.http.ResponseWithBody
をクライアントに返します。
バックエンド サーバーのステータス コード | ||
---|---|---|
バックエンド サーバーからのレスポンスには以下が含まれます: | 204 No Content(コンテンツなし) | 205 コンテンツのリセット |
レスポンスの本文 | エラー | エラー |
(ゼロ以外に設定) |
エラー | エラー |
|
エラー | エラーなし |
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 を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題を調査する組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した期間を選択します。
- [Time] に [Fault Code] をプロットします。
次のように、障害コード
protocol.http.ResponseWithBody
を含むセルを選択します。( 拡大画像を表示)
次のように、障害コード
protocol.http.ResponseWithBody
に関する情報が表示されます。( 拡大画像を表示)
[ログを表示] をクリックし、失敗したリクエストの行を開きます。
( 拡大画像を表示)
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
502
- 障害ソース:
target
- 障害コード:
protocol.http.ResponseWithBody
。
- ステータス コード:
- [Fault Source] の値が
target
、[Fault Code] の値がprotocol.http.ResponseWithBody
の場合、バックエンド サーバーが204 No Content
または205 Reset Content
のステータス コードを、レスポンスの本文や考えられる原因セクションに記載されているヘッダーのいずれかとともに送信したために、エラーが発生したことを示します。
Trace ツール
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
502 Bad Gateway
エラーが発生するまで待ちます。- 問題を再現できる場合は、API 呼び出しを行い、
502 Bad Gateway
エラーを再現します。
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストの 1 つを選択し、トレースを調べます。
- トレースのさまざまなフェーズを確認し、エラーが発生した場所を特定します。
通常、エラーは、次のように [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
- エラー:
- トレースの AX(Analytics Data Recorded)フェーズに移動し、クリックします。
[Phase Details]、[Error Headers] セクションまで下にスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を確認します。
( 拡大画像を表示)
- 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 アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合、NGINX アクセスログを使用して HTTP
502 Bad Gateway
に関する重要な情報を特定できます。 NGINX のアクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
ここで、ORG、ENV、PORT# は実際の値に置き換えられます。
- 特定の期間にエラーコード
protocol.http.ResponseWithBody
の502
エラーがあったかどうか(問題が過去に発生していた場合)、または502
で失敗するリクエストがあるかどうかを検索します。 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
- X-Apigee-fault-code と X-Apigee-fault-source の値は、それぞれ
protocol.http.ResponseWithBody
とtarget
です。これは、バックエンド サーバーが204 No Content
または205 Reset Content
ステータス コードをレスポンスの本文や考えられる原因に記載されたヘッダーとともに送信したためにエラーが発生したことを示します。
原因: バックエンド サーバーからのレスポンスの本文またはヘッダー
診断
- 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、または NGINX アクセスログを使用して確認されたエラーの障害コードと障害ソースを特定します。
- 障害コードが
protocol.http.ResponseWithBody
で、[Fault Source] の値がtarget
の場合、バックエンド サーバーが204 No Content
または205 Reset Content
のステータス コードで、レスポンスの本文や考えられる原因に記載されているヘッダーのいずれかまたは両方で応答したことを示します。 バックエンド サーバーが実際にレスポンス ペイロードの本文や考えられる原因に記載されている 1 つ以上のヘッダーを送信したかどうかを確認するには、次の操作を行います。
Public Cloud ユーザーで、任意のシステムから直接バックエンド サーバーに同じ API リクエストを送信できる場合。
- Private Cloud ユーザーの場合、エラーが発生した特定の組織や環境に関連付けられた Message Processor のいずれかから、バックエンド サーバーに直接同じ API リクエストを送信できます。
バックエンド サーバーから受信したレスポンスを確認し、レスポンス ペイロードの本文や上記の 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.
を返します。- 上記の例ではいずれも、バックエンド サーバーが
204 No Content
または205 Reset Content
ステータス コードを、レスポンスの本文や考えられる原因に記載されているヘッダーとともに送信しました。 - このため、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
レスポンスの一部として送信してはなりません。
- レスポンス ペイロードの本文
- 次のいずれかのヘッダーが含まれている。
Content-Length
Content-Encoding
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-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 コンテンツをリセットする内容を遵守することです。
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