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-LengthContent-EncodingTransfer-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 |
| レスポンスの本文 | エラー | エラー |
(ゼロ以外に設定) |
エラー | エラー |
|
エラー | 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 を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
問題の調査対象となる組織に切り替えます。
- [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
- エラーが発生した特定の期間を選択します。
- 障害コードと時間をプロットします。
以下のように、障害コード
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] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを確認します。
- トレースのさまざまなフェーズを移動して、障害が発生した場所を特定します。
通常、エラーは次の図に示すように、Request sent to target server フェーズの直後の
flowinfoError に表示されます。シナリオ #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.ResponseWithBodyX-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.ResponseWithBodyX-Apigee-fault-source target- X-Apigee-fault-code と X-Apigee-fault-source の値は、それぞれ
protocol.http.ResponseWithBodyとtargetです。これは、バックエンド サーバーがレスポンスの本文や考えられる原因で説明したヘッダーのいずれかとともに204 No Contentステータス コードまたは205 Reset Contentステータス コードを送信したためにエラーが発生したことを示します。
原因: バックエンド サーバーからの 204 レスポンスのレスポンス本文またはヘッダー
診断
- 一般的な診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、観測されたエラーの障害コードと障害ソースを特定します。
- 障害コードが
protocol.http.ResponseWithBodyで、障害ソースの値がtargetの場合、バックエンド サーバーが204 No Contentステータス コードまたは205 Reset Contentステータス コードと、レスポンス本文または考えられる原因で説明されているヘッダーのいずれかで応答したことを示します。 バックエンド サーバーが実際にレスポンス ペイロードの本文や、考えられる原因で説明したヘッダーを送信したかどうかを確認するには、次の手順を行います。
Public Cloud ユーザーで、システムからバックエンド サーバーに同じ API リクエストを直接送信できる場合。
- Private Cloud ユーザーは、障害が発生した特定の組織と環境に関連付けられている Message Processor のいずれかから、バックエンド サーバーに同じ API リクエストを直接送信できます。
バックエンド サーバーから受信したレスポンスを確認し、レスポンス ペイロードの本文や上記のヘッダーが含まれていることを確認します。呼び出している場合は、それがエラーの原因です。
サンプル 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を返しました。- 上記のすべての例で、バックエンド サーバーはレスポンス ボディと、考えられる原因で説明したヘッダーのいずれかとともに、
204 No Contentまたは205 Reset Contentステータス コードを送信しました。 - そのため、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 レスポンスの一部として以下を送信してはなりません。
- レスポンス ペイロードの本文
- また、次のいずれかのヘッダー。
Content-LengthContent-EncodingTransfer-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