504 Gateway timeout - ルーターのタイムアウト

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

症状

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

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

エラー メッセージ

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

HTTP/1.1 504 Gateway Time-out

cURL またはウェブブラウザを使用してこのようなプロキシを呼び出すと、次のエラーが発生することがあります。

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

タイムアウトの原因

Edge プラットフォームを経由する API リクエストの一般的なパスは、次の図に示すように、クライアント > Router > Message Processor > バックエンド サーバーです。

クライアント、Router、Message Processor、バックエンド サーバーなど、Apigee Edge ランタイム フローのすべてのコンポーネントは、API リクエストの完了に時間がかかりすぎないように、適切なデフォルトのタイムアウト値で設定されています。フロー内のコンポーネントが、タイムアウト構成で指定された期間内に上流コンポーネントからレスポンスを取得しない場合、そのコンポーネントはタイムアウトし、通常は 504 Gateway Timeout エラーを返します。

このプレイブックでは、Router のタイムアウト時に発生する 504 エラーのトラブルシューティングと解決方法について説明します。

Router のタイムアウト

Apigee Edge の Router で構成されているデフォルトのタイムアウトは 57 秒です。これは、Edge で API リクエストが受信されてからレスポンスが返送されるまでの API プロキシの最大実行時間です。これには、バックエンド レスポンスと実行されるすべてのポリシーが含まれます。デフォルトのタイムアウトは、 Router の I/O タイムアウトを構成するで説明されているように、Router/仮想ホストでオーバーライドできます。

考えられる原因

Edge で、ルーターのタイムアウトが原因で発生する 504 Gateway Timeout エラーの一般的な原因は次のとおりです。

原因 説明 トラブルシューティングの実施対象
Router のタイムアウト構成が正しくない これは、ルーターが正しくない I/O タイムアウト期間で構成されている場合に発生します。 Edge Public Cloud と Private Cloud のユーザー

共通の診断手順

次のいずれかのツールまたは手法を使用して、このエラーを診断します。

  • API モニタリング
  • NGINX アクセスログ

API Monitoring

API Monitoring を使用してエラーを診断するには:

  1. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  2. 5xx エラーでフィルタし、期間を選択します。
  3. ステータス コードと時間をプロットします。
  4. 504 エラーが表示されている特定のセルをクリックすると、次の図のように、エラーの詳細とエラーに関するログが表示されます。

    504 エラーを示す例

  5. 右側のペインで、[ログを表示] をクリックします。

    [トラフィック ログ] ウィンドウで、一部の 504 エラーについて次の詳細を確認します。

    • リクエスト: 呼び出しに使用されるリクエスト メソッドと URI を提供します。
    • 応答時間: リクエストの合計経過時間を示します。

    上記の例では

    • リクエスト が GET /test-timeout を指している。
    • 応答時間 は 57.001 秒です。これは、値が Router に設定されたデフォルトの I/O タイムアウト(57 秒)に非常に近いため、Message Processor が応答する前に Router がタイムアウトしたことを示しています。

    API Monitoring の GET logs API を使用して、すべてのログを取得することもできます。たとえば、org、env、timeRange、status のログをクエリすると、クライアントがタイムアウトしたトランザクションのすべてのログをダウンロードできます。

    API Monitoring では、これらの 504 エラーのプロキシが -(not set)に設定されるため、API(Logs API)を使用して、仮想ホストとパスに関連付けられたプロキシを取得できます。

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. レスポンス時間で追加の 504 エラーを確認し、すべての 504 エラーでレスポンス時間が一致しているか(Router に設定されている I/O タイムアウト値である 57 秒)を確認します。

NGINX アクセスログ

NGINX アクセスログを使用してエラーを診断するには:

  1. NGINX アクセスログを確認します。
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 特定の期間に 504 エラーが発生したかどうか(問題が過去に発生した場合)、または 504 で失敗しているリクエストがまだあるかどうかを検索します。
  3. 一部の 504 エラーについては、次の点に注意してください。
    • 応答時間
    • リクエスト URI

    この例では、次の情報が表示されます。

    • リクエスト時間: 57.001 秒。これは、Router が 57.001 秒後にタイムアウトしたことを示します。

    • リクエスト: GET /test-timeout
    • ホスト エイリアス: myorg-test.apigee.net
  4. リクエスト時間が、Router/仮想ホストで構成されている I/O タイムアウトと同じかどうかを確認します。この場合、Message Processor がこの期間内に応答しなかったため、Router がタイムアウトしたことを意味します。

    上記の NGINX アクセスログ エントリの例では、リクエスト時間の 57.001 秒は、Router に設定されたデフォルトの I/O タイムアウトに非常に近い値です。これは、Message Processor が応答する前に Router がタイムアウトしたことを明確に示しています。

  5. リクエスト フィールドのベースパスを使用して、リクエストが行われた API プロキシを特定します。

原因: Router のタイムアウト構成が正しくない

診断

  1. Message Processor が応答する前に Router がタイムアウトしたことが原因で 504 エラーが発生したかどうかを判断します。これを行うには、API モニタリングのレスポンス時間と Router のリクエスト時間(両方のフィールドは同じ情報を表しますが、名前が異なります)が、Router / 仮想ホストで構成された I/O タイムアウトと同じであり、障害の原因、障害プロキシ、障害コードの各フィールドが - に設定されていることを確認します。これには、 一般的な診断手順で説明されているように、API モニタリングまたは NGINX アクセスログを使用します。
  2. Router または特定の仮想ホストで構成された I/O タイムアウト値が、Message Processor または特定の API プロキシで構成された値よりも小さいかどうかを確認します。

    この操作は、このセクションの手順に沿って行うことができます。

仮想ホストの I/O タイムアウトを確認する

Edge UI

Edge UI を使用して仮想ホストのタイムアウトを確認する手順は次のとおりです。

  1. Edge UI にログインします。
  2. [Admin] > [Virtual Hosts] に移動します。
  3. タイムアウトの問題が発生している特定の環境を選択します。
  4. I/O タイムアウト値を確認する特定の仮想ホストを選択します。
  5. [プロパティ] で、[プロキシ読み取りタイムアウト] の値(秒単位)を確認します。

    上記の例では、プロキシの読み取りタイムアウト が 120 の値で構成されています。つまり、この仮想ホストで構成された I/O タイムアウトは 120 秒です。

Management API

次の管理 API を使用して、プロキシの読み取りタイムアウトを確認することもできます。

  1. 仮想ホストの取得 API を実行して、次のように virtualhost 構成を取得します。

    パブリック クラウド ユーザー

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Private Cloud ユーザー

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    ここで

    ORGANIZATION_NAME は組織の名前です

    ENVIRONMENT_NAME は、環境の名前です。

    VIRTUALHOST_NAME は仮想ホストの名前です。

  2. プロパティ proxy_read_timeout に構成されている値を確認します。

    仮想ホストの定義例

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }

    上記の例では、proxy_read_timeout は 120 の値で構成されています。つまり、この仮想ホストで構成された I/O タイムアウトは 120 秒です。

router.properties ファイルの I/O タイムアウトを確認する

  1. Router マシンにログインします。
  2. /opt/nginx/conf.d ディレクトリでプロパティ proxy_read_timeout を検索し、次のように新しい値が設定されているかどうかを確認します。
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. 特定の仮想ホスト構成ファイルで、プロパティ proxy_read_timeout に設定された値を確認します。

    grep コマンドのサンプル結果

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;

    上記の出力例では、デフォルトの仮想ホストの構成ファイルである 0-default.conf で、プロパティ proxy_read_timeout が新しい値 57 で設定されていることがわかります。これは、Router のデフォルトの仮想ホストで I/O タイムアウトが 57 秒に構成されていることを示します。複数の仮想ホストがある場合は、それぞれの情報が表示されます。504 エラーで失敗した API 呼び出しに使用した特定の仮想ホストの proxy_read_timeout の値を取得します。

API プロキシでの I/O タイムアウトの確認

I/O タイムアウトは次の場所で確認できます。

  • API プロキシのターゲット エンドポイント
  • API プロキシの ServiceCallout ポリシー
API プロキシのターゲット エンドポイントで I/O タイムアウトを表示する
  1. Edge UI で、I/O タイムアウト値を表示する特定の API プロキシを選択します。
  2. 確認する特定のターゲット エンドポイントを選択します。
  3. TargetEndpoint 構成の <HTTPTargetConnection> 要素に、適切な値の io.timeout.millis プロパティがあることを確認します。

    たとえば、次のコードの I/O タイムアウトは 120 秒に設定されています。

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
API プロキシの ServiceCallout ポリシーで I/O タイムアウトを表示する
  1. Edge UI で、ServiceCallout ポリシーの新しい I/O タイムアウト値を表示する特定の API プロキシを選択します。
  2. 確認する特定の ServiceCallout ポリシーを選択します。
  3. <ServiceCallout> 構成の下に適切な値を持つ要素 <Timeout> があることを確認します。

    たとえば、次のコードの I/O タイムアウトは 120 秒になります。

    <Timeout>120000</Timeout>

Message Processor の I/O タイムアウトを確認する

  1. Message Processor マシンにログインします。
  2. 次のコマンドを使用して、/opt/apigee/edge-message-processor/conf ディレクトリでプロパティ HTTPTransport.io.timeout.millis を検索します。

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    出力例

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
  3. 上記の出力例では、http.properties の HTTPTransport.io.timeout.millis プロパティが 55000 の値で設定されていることに注意してください。これは、Message Processor で I/O タイムアウトが 55 秒に正常に構成されたことを示します。

Router と Message Processor で構成されたタイムアウトを特定したら、Router/仮想ホストが Message Processor/API プロキシよりも低いタイムアウト値で構成されているかどうかを確認します。

下の表に示すように、すべてのレイヤに設定された値をメモします。

Router のタイムアウト(秒) 仮想ホストのタイムアウト(秒) Message Processor のタイムアウト(秒) API プロキシのタイムアウト(秒)
57 - 55 120

この例では

  • デフォルト値の 57 秒は Router で構成されます。
  • 特定の仮想ホストにタイムアウト値が設定されていません。つまり、ルーター自体に構成されているデフォルト値の 57 秒が使用されます。
  • Message Processor では、デフォルト値の 55 秒が構成されています。
  • ただし、特定の API プロキシでは 120 秒の値が構成されています。

タイムアウト値が大きいのは API プロキシのみで、Router は引き続き 57 秒で構成されます。そのため、Message Processor/バックエンドがリクエストを処理している間、Router は 57 秒でタイムアウトします。これにより、Router はクライアント アプリケーションに 504 Gateway Timeout エラーで応答します。

解決策

この問題を解決するには、次の手順で Router と Message Processor の適切な I/O タイムアウトを構成します。

  1. Apigee Edge を介した API リクエスト フローに関与するさまざまなコンポーネントに設定するタイムアウト値については、 I/O タイムアウトの構成に関するベスト プラクティスをご覧ください。
  2. 上記の例で、バックエンド サーバーでより長い時間が必要なため、タイムアウト値を大きくする必要があると判断し、Message Processor のタイムアウト値を 120 秒に増やした場合は、Router でより大きなタイムアウト値(123 seconds など)を設定します。新しいタイムアウト値がすべての API プロキシに影響しないようにするには、特定の API プロキシで使用される特定の仮想ホストでのみ 123 seconds の値を設定します。
  3. Router の I/O タイムアウトを構成するの手順に沿って、仮想ホストのタイムアウトを設定します。