503 Service Unavailable - バックエンド サーバーによる早期終了

現在、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 を確認するには:

  1. 問題が引き続き発生する場合は、影響を受けている API の トレース セッションを有効にします。
  2. API 呼び出しを行って問題を再現する - 503 Service Unavailable(エラーコード: messaging.adaptors.http.flow.ServiceUnavailable.
  3. 失敗したリクエストのいずれかを選択します。
  4. AX フェーズに移動し、次の図に示すように、[Phase Details] セクションを下にスクロールして、リクエストのメッセージ ID(X-Apigee.Message-ID)を確認します。

    [Phase Details] セクションのメッセージ ID

NGINX アクセスログ

このセクションの手順は、Edge Private Cloud ユーザーのみを対象としています。

NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を確認するには:

503 エラーのメッセージ ID を確認するには、NGINX のアクセスログを参照します。 これは、過去に発生した問題の場合、または問題が断続的に発生し UI でトレースをキャプチャできない場合に特に役立ちます。NGINX のアクセスログからこの情報を確認するには、次の操作を行います。

  1. NGINX のアクセスログを確認します(/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)。
  2. 特定の期間に特定の API プロキシで 503 エラーが発生しているかどうか(問題が過去に発生した場合)、または 503 で失敗するリクエストがあるかどうかを検索します。
  3. X-Apigee-fault-codemessaging.adaptors.http.flow.ServiceUnavailable503 エラーが発生した場合は、次の例に示すように、1 つ以上のリクエストのメッセージ ID をメモします。

    503 エラーを示すサンプル エントリ

    ステータス コード、メッセージ ID、障害ソース、障害コードを示すサンプル エントリ

原因: ターゲット サーバーが接続を途中で終了する

診断

  1. Public Cloud または Private Cloud のユーザーの場合:
    1. Trace ツール(一般的な診断手順を参照)を使用して、[Analytics Data Recorded] ペインで次の両方の設定が完了していることを確認します。
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. Trace ツール(一般的な診断手順を参照)を使用して、TARGET_REQ_FLOWstate プロパティの直後に [Error] ペインで次の両方の設定が設定されていることを確認します。
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. さらに調査するには、tcpdump の使用に進みます。
  2. 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 の使用

  1. 次のコマンドを使用して、バックエンド サーバーまたは 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
    
  2. キャプチャされた tcpdump を分析します。

    tcpdump の出力例(Message Processor で収集):

    alt_text

    上記の tcpdump で、次のことがわかります。

    1. パケット 4 で、Message Processor がバックエンド サーバーに POST リクエストを送信しました。
    2. パケット 58 91011 で、Message Processor はバックエンド サーバーにリクエスト ペイロードを送信し続けました。
    3. パケット 67 で、バックエンド サーバーは Message Processor から受信したリクエスト ペイロードの一部に対して ACK で応答しました。
    4. ただし、パケット 12 では、バックエンド サーバーは受信したアプリデータ パケットに対して ACK で応答し、その後にレスポンス ペイロードで応答する代わりに、FIN ACK で応答して接続の終了を開始します。
    5. この結果から、Message Processor がリクエスト ペイロードを送信している間に、バックエンド サーバーが接続を早期に閉じたことがわかります。
    6. これにより、Message Processor はエラーを記録し、 IOException: Broken Pipeクライアントに 503 を返します。

解像度

  1. アプリケーション チームやネットワーキング チームのいずれかまたは両方と協力して、バックエンド サーバー側での早すぎる切断の問題を分析し、修正します。
  2. リクエスト ペイロード全体を受信する前に、バックエンド サーバー アプリケーションがタイムアウトしたり、接続をリセットしたりしていないことを確認します。
  3. 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 が収集されます。