現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください。 情報
内容
API プロキシ呼び出しの後、クライアント アプリケーションが HTTP レスポンス ステータス 503
とメッセージ Service Unavailable
を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
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 Details] セクションを下にスクロールして、リクエストのメッセージ ID(
X-Apigee.Message-ID
)を確認します。
NGINX アクセスログ
このセクションの手順は、Edge Private Cloud ユーザーのみを対象としています。NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を確認するには:
503
エラーのメッセージ ID を確認するには、NGINX のアクセスログを参照します。
これは、過去に発生した問題の場合、または問題が断続的に発生し UI でトレースをキャプチャできない場合に特に役立ちます。NGINX のアクセスログからこの情報を確認するには、次の操作を行います。
- NGINX のアクセスログを確認します(
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
)。 - 特定の期間に特定の API プロキシで
503
エラーが発生しているかどうか(問題が過去に発生した場合)、または503
で失敗するリクエストがあるかどうかを検索します。 - X-Apigee-fault-codemessaging.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
の state プロパティの直後に [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 ログでメッセージ ID を検索します(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)。 - 次のいずれかの例外が表示されます。
例外 1: java.io.IOException: チャネル 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 例外: {}
java.io.IOException: 壊れたパイプ2021-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
で、バックエンド サーバーは Message Processor から受信したリクエスト ペイロードの一部に対してACK
で応答しました。 - ただし、パケット
12
では、バックエンド サーバーは受信したアプリデータ パケットに対してACK
で応答し、その後にレスポンス ペイロードで応答する代わりに、FIN ACK
で応答して接続の終了を開始します。 - この結果から、Message Processor がリクエスト ペイロードを送信している間に、バックエンド サーバーが接続を早期に閉じたことがわかります。
- これにより、Message Processor はエラーを記録し、
IOException: Broken Pipe
クライアントに503
を返します。
- パケット
解像度
- アプリケーション チームやネットワーキング チームのいずれかまたは両方と協力して、バックエンド サーバー側での早すぎる切断の問題を分析し、修正します。
- リクエスト ペイロード全体を受信する前に、バックエンド サーバー アプリケーションがタイムアウトしたり、接続をリセットしたりしていないことを確認します。
- Apigee とバックエンド サーバーの間に中間ネットワーク デバイスまたはレイヤがある場合は、リクエスト ペイロード全体を受信する前にタイムアウトしていないことを確認します。
問題が解決しない場合は、診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
上記の手順でも問題が解決しない場合は、次の診断情報を収集して Apigee Edge サポートに連絡してください。
Public Cloud ユーザーの場合は、次の情報を入力します。
- 組織の名前
- 環境名
- API プロキシ名
curl
コマンドを完了して503
エラーを再現する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
エラーが発生したときのタイムゾーン情報の期間- エラー発生時に Message Processor とバックエンド サーバーで
Tcpdumps
が収集されます。