504 Gateway Timeout from Backend Server(バックエンド サーバーからのゲートウェイ タイムアウト)

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動します。
情報

症状

クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、HTTP ステータス コード 504 とメッセージ「Gateway Timeout」を受け取ります。

このエラー レスポンスは、API 呼び出しの実行中にクライアントが Apigee Edge またはバックエンド サーバーからタイムリーなレスポンスを受信しなかったことを示します。

エラー メッセージ

クライアント アプリケーションは、次のレスポンス コードを受け取ります。

HTTP/1.1 504 Gateway Timeout

このコードの後に、次のようなエラー メッセージが表示されることがあります。

<html>
<head><title>504 Gateway Timeout</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Timeout</h1></center>
</body>
</html>

ゲートウェイ タイムアウトの原因

Apigee Edge 経由で送信される API リクエストの一般的なパスは、下の図に示すように、クライアント -> Router -> Message Processor -> バックエンド サーバーです。

API リクエストパス

クライアント アプリケーション、Router、Message Processor は、適切なタイムアウト値で構成されます。Apigee Edge では、タイムアウト値に基づいて、すべての API リクエストに対して特定の期間内にレスポンスが送信されることを前提としています。指定した期間内にレスポンスが受信されない場合は、504 Gateway Timeout レスポンスが返されます。

考えられる原因

Apigee Edge で、バックエンド サーバーからの 504 Gateway Timeout レスポンスの一般的な原因は次のとおりです。

原因 説明 トラブルシューティングの手順
バックエンド サーバーが 504 Gateway Timeout で応答している バックエンド サーバーがタイムアウトし、504 Gateway Timeout レスポンスを Message Processor に返します。 Edge Private Cloud と Public Cloud のユーザー

バックエンド サーバーが 504 Gateway Timeout で応答している

バックエンド サーバーは、HTTP レスポンス コード 504 Gateway Timeout で応答することがあります。

診断

このセクションでは、504 Gateway Timeout を正しく診断する方法について説明します。Private Cloud ユーザーと Public Cloud ユーザーの両方に適用される手順を記載します。

手順 1: トレースを使用する(Private Cloud と Public Cloud のユーザー)

  1. 影響を受ける API の Apigee UI で Trace を有効にします。
  2. バックエンド サーバーにリクエストを送信します。
  3. 失敗した API リクエストのトレースにバックエンド サーバーからの 504 レスポンスが表示されている場合、504 Gateway Timeout の原因はバックエンド サーバーです。
  4. レスポンス時間を特定するには、Trace の [Response received from target server] フェーズをクリックします。この例では、経過時間は 60004 ミリ秒です。

    UI からのフェーズの詳細

    [Phase Details] セクションには、次の追加情報が表示されます。

    • バックエンド サーバーから受信した 504 Gateway Timeout レスポンスがハイライト表示されます。
    • [Response Content] セクションには、バックエンド サーバーからのレスポンスの本文全体が表示されます。前述のように、レスポンス ペイロードの形式と内容は、バックエンド サーバーの実装によって異なる場合があります。
    • [Response Header > Server] セクションには、レスポンスの送信元が表示されることがあります。
  5. アナリティクス データを表示して診断を確認するには、下の図に示すように、トレースの [Analytics Data Recorded] フェーズをクリックします。

    トレースからの分析情報の詳細

    次の図に示すように、[Phase Details] の [Response Headers] セクションに X-Apigee-fault-code と X-Apigee-fault-source の値が表示されます。

    UI からの分析フェーズの詳細

    これらのフィールドに次の表に示す値が含まれている場合、504 エラー レスポンスはバックエンド サーバーから送信されています。

    レスポンス ヘッダー 値
    X-Apigee-fault-source target
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
  6. プロキシ チェーンを確認します。バックエンド サーバーが Apigee で別のプロキシを呼び出しているかどうかを確認する手順は次のとおりです。
    1. [Request sent to target server] フェーズに戻り、[Show Curl] ボタンをクリックしてバックエンド サーバーのホスト エイリアスを表示します。
    2. バックエンド サーバーのホスト エイリアスが仮想ホスト エイリアスを指している場合、プロキシ チェーンが設定されています。チェーンされたプロキシごとに上記の手順を繰り返し、504 Gateway Timeout エラー レスポンスの原因を診断します。リクエスト/レスポンス サイクルの他の段階でチェーン プロキシで発生する 504 Gateway Timeout は、 このプレイブックを使用して診断できます。
    3. バックエンド サーバー ホスト エイリアスがバックエンド サーバーを指している場合は、解決策に進みます。

手順 2: バックエンド サーバー API を直接呼び出す(Public Cloud ユーザーと Private Cloud ユーザー)

バックエンド サーバーを直接呼び出して、Apigee Edge を介してリクエストが行われたときに発生した 504 Gateway Timeout レスポンスの動作と同じであることを確認します。

  1. リクエストの一部としてバックエンド サーバーに渡すために必要なヘッダー、クエリ パラメータ、認証情報がすべて揃っていることを確認します。
  2. バックエンド サービスが一般公開されている場合は、curl コマンド、Postman、その他の REST クライアントを使用して、バックエンド サーバー API を直接呼び出すことができます。
  3. バックエンド サーバーに Message Processor からのみアクセスできる場合は、curl コマンド、Postman、またはその他の REST クライアントを使用して、Message Processor からバックエンド サーバー API を直接呼び出します。
  4. バックエンド サービスが 504 Gateway Timeout レスポンスを返した場合は、解決策に進みます。

手順 3: NGINX アクセスログを確認する(Private Cloud ユーザーのみ)

NGINX アクセスログは、504 エラー レスポンスがバックエンド サーバーから送信されたかどうかを判断するのに役立ちます。これは、過去に発生した問題の場合、または問題が断続的に発生し、トレースでキャプチャできない場合に便利です。NGINX アクセスログを確認する手順は次のとおりです。

  1. 次のコマンドを使用して、NGINX アクセスログを表示します。
    /opt/apigee/var/log/edge-router/nginx/ ORG ~ENV.PORT# _access_log 
  2. 影響を受ける API プロキシの 504 エラー レスポンスを確認します。特定期間を確認して、過去に問題が発生したかどうかを調べたり、リクエストが 504 エラー レスポンスで失敗し続けているかどうかを判断したりできます。
  3. 504 エラー レスポンスがある場合は、そのエラー レスポンスがバックエンド サーバーから発生しているかどうかを判断します。
  4. 次の図は、ターゲット サーバーが原因で 504 エラー レスポンスが発生したことを示す NGINX ログエントリの例です。

    nginx のサンプルログ

    X-Apigee-fault-source フィールドと X-Apigee-fault-code フィールドに次の表に示す値が含まれている場合、504 レスポンスはバックエンド サーバーから送信されます。

    レスポンス ヘッダー 値
    X-Apigee-fault-source target
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
  5. 影響を受ける API プロキシを確認して、プロキシ チェーン(バックエンド サーバー/ターゲット エンドポイントが Apigee で別のプロキシを呼び出している)がないか確認します。API プロキシがプロキシ チェーン を使用している場合は、チェーン内の各プロキシに対して上記の手順を繰り返し、504 Gateway Timeout エラー レスポンスの原因を診断します。他のステージでチェーン プロキシで発生する 504 Gateway Timeout は、このプレイブックを使用して診断できます。
  6. プロキシ チェーンがなく、504 エラー レスポンスがバックエンド サーバーから発生した場合は、解決策に進みます。

手順 4: API Monitoring の使用(パブリック クラウド ユーザーのみ)

API Monitoring を使用すると、問題領域を迅速に切り分けて、エラー、パフォーマンス、レイテンシの問題とその発生元(デベロッパー アプリ、API プロキシ、バックエンド ターゲット、API プラットフォームなど)を診断できます。

API Monitoring を使用して API での 5xx 問題をトラブルシューティングする方法を説明するサンプル シナリオに従ってください。たとえば、504 ステータス コードの数が特定のしきい値を超えたときに管理者に通知するアラートを設定します。

解決策

上記の診断手順に沿って、バックエンド サーバー チームと協力してバックエンド サーバーの問題を解決できます。これには、バックエンド サーバーのタイムアウトや、ターゲット サーバーの前に配置されたロードバランサのタイムアウトの調整が含まれる場合があります。

診断情報を収集する

問題が解決しない場合は、次の診断情報を Apigee サポートと共有してください。

Public Cloud をご利用の場合は、次の情報を提供してください。

  • 組織名
  • 環境名
  • API プロキシ名
  • 504 エラー レスポンスを再現するために使用される完全な curl コマンド
  • 504 Gateway Timeout エラー レスポンスを受け取った API リクエストを含むトレース ファイル

Private Cloud をご利用の場合は、次の情報を提供してください。

  • 失敗したリクエストで確認されたエラー メッセージの全文
  • 環境名
  • API プロキシ バンドル
  • 504 Gateway Timeout エラー レスポンスを受け取った API リクエストを含むトレース ファイル
  • 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