ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API プロキシの呼び出しの後に、メッセージ
Service Unavailable 付きの HTTP レスポンス ステータス 503 を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 503 Service Unavailable
さらに、次のエラー メッセージも確認できます。
{
"fault": {
"faultstring": "The Service is temporarily unavailable",
"detail": {
"errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
}
}
}考えられる原因
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| ターゲット サーバーが接続を早期に閉じる | Message Processor がリクエスト ペイロードを送信している間に、ターゲット サーバーが接続を早期に終了します。 | Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
失敗したリクエストのメッセージ ID を特定する
Trace ツール
Trace ツールを使用して、失敗したリクエストのメッセージ ID を特定するには:
- 問題が引き続き発生する場合は、影響を受けている API に対して トレース セッションを有効にします。
- API 呼び出しを行い、
503 Service Unavailableエラーコードmessaging.adaptors.http.flow.ServiceUnavailable.の問題を再現します。 - 失敗したリクエストのいずれかを選択します。
- [AX phase] に移動し、次の図に示すように [Phase Details] セクションを下にスクロールして、リクエストのメッセージ ID(
X-Apigee.Message-ID)を特定します。
NGINX アクセスログ
NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を特定するには:
NGINX アクセスログを参照して、503 エラーのメッセージ ID を特定することもできます。
これは、過去に発生した問題の場合、または問題が断続的に発生し、UI でトレースをキャプチャできない場合に便利です。
以下の手順に従って、NGINX のアクセスログから発生元を特定します。
- NGINX アクセスログ(
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)を確認します。 - 特定の期間(過去に問題が発生した場合)に特定の API プロキシに対して
503エラーがあるかどうか、または503で失敗しているリクエストがまだあるかどうかを検索します。 - X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable で
503エラーが発生している場合は、次の例に示すように、1 つ以上のリクエストのメッセージ ID をメモします。エラーを示すサンプル エントリ
503
原因: ターゲット サーバーが接続を早期に閉じる
診断
- Public Cloud または Private Cloud ユーザーの場合:
- Trace ツール(共通の診断手順で説明)を使用して、[Analytics Data Recorded] ペインに次の両方が設定されていることを確認します。
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable - X-Apigee.fault-source:
target

- X-Apigee.fault-code:
- Trace ツール(共通の診断手順で説明)
を使用して、`TARGET_REQ_FLOW`
TARGET_REQ_FLOWstate プロパティの直後の [Error] ペインに次の両方が設定されていることを確認します。- error.class:
com.apigee.errors.http.server.ServiceUnavailableException - error.cause:
Broken pipe

- error.class:
- 詳細な調査を行うには、tcpdump を使用するに移動します。
- Trace ツール(共通の診断手順で説明)を使用して、[Analytics Data Recorded] ペインに次の両方が設定されていることを確認します。
- Private Cloud ユーザーの場合:
- 失敗したリクエストのメッセージ ID を特定します。
- Message Processor ログ
(
/opt/apigee/var/log/edge-message-processor/logs/system.log)でメッセージ ID を検索します。 - 次のいずれかの例外が表示されます。
例外 1: java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel
2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy rev:1 messageid:myorg-opdk-test-1-30312-13747-1 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.io.IOException: Broken pipe occurred while writing to channel ClientOutputChannel(ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1 bytesRead=0 bytesWritten=76295 age=2012ms lastIO=2ms isOpen=false)
または
例外 2: onExceptionWrite exception: {}
java.io.IOException: Broken pipe2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() : ClientChannel[Connected: Remote:IP:PORT Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms lastIO=2 ms isOpen=false.onExceptionWrite exception: {} java.io.IOException: Broken pipe
- これらの例外はどちらも、Message Processor がリクエスト ペイロードをバックエンド サーバーに書き込んでいる間に、バックエンド サーバーによって接続が早期に閉じられたことを示しています。そのため、Message Processor は例外
java.io.IOException: Broken pipeをスローします。 Remote:IP:PORTは、解決されたバックエンド サーバーの IP アドレスとポート番号を示します。- 上記のエラー メッセージの属性
bytesWritten=76295は、接続が早期に閉じられたときに Message Processor が76295バイトのペイロードをバックエンド サーバーに送信したことを示しています。 - 属性
bytesRead=0は、Message Processor がバックエンド サーバーからデータ(レスポンス)を受信していないことを示しています。 - この問題をさらに調査するには、バックエンド
サーバーまたは Message Processor で
tcpdumpを収集し、以下で説明するように分析します。
tcpdump を使用する
-
次のコマンドを使用して、バックエンド サーバーまたは Message Processor で
tcpdumpをキャプチャします。バックエンド サーバーで
tcpdumpを収集するコマンド:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
Message Processor で
tcpdumpを収集するコマンド:tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
- キャプチャした
tcpdumpを分析します。tcpdump の出力例(Message Processor で収集):

上記の
tcpdumpでは、次のことがわかります。- パケット
4で、Message Processor がバックエンド サーバーにPOSTリクエストを送信しました。 - パケット
5、8、9、10、11で、Message Processor はリクエスト ペイロードをバックエンド サーバーに送信し続けました。 - パケット
6と7で、バックエンド サーバーはACKで Message Processor から受信したリクエスト ペイロードの一部に対して応答しました。 - ただし、パケット
12では、受信したアプリケーション データ パケットに対してACKで応答し、その後レスポンス ペイロードで応答する代わりに、バックエンド サーバーはFIN ACKで応答して 接続の終了を開始します。 - これは、Message Processor がリクエスト ペイロードを送信している間に、バックエンド サーバーが接続を早期に閉じていることを明確に示しています。
- これにより、Message Processor は
IOException: Broken Pipeエラーを記録し、クライアントに503を返します。
- パケット
解決策
- アプリケーション チームまたはネットワーク チーム(またはその両方)と協力して、バックエンド サーバー側での早期切断の問題を分析して修正します。
- バックエンド サーバー アプリケーションが、リクエスト ペイロード全体を受信する前にタイムアウトしたり、接続をリセットしたりしないようにします。
- Apigee とバックエンド サーバーの間に中間ネットワーク デバイスまたはレイヤがある場合は、 リクエスト ペイロード全体を受信する前にタイムアウトしないようにしてください。
問題が解決しない場合は、診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の 診断情報を収集してApigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
503エラーを再現するための完全なcurlコマンド503 Service Unavailableエラーを含むリクエストが記録されているトレース ファイル503エラーが現在発生していない場合は、過去に503エラーが発生した期間と タイムゾーン情報を提供してください。
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認されたエラー メッセージ全文
- エラー
503が発生している組織、環境名、API プロキシ名 - API プロキシ バンドル
503 Service Unavailableエラーを含むリクエストが記録されているトレース ファイル- NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Message Processor ログ
/opt/apigee/var/log/edge-message-processor/logs/system.log 503エラーが発生した期間とタイムゾーン情報Tcpdumpsエラー発生時に Message Processor とバックエンド サーバーで収集された