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 リクエストの一般的なパスは、[Client] > [Router] > [Message Processor] > [Backend Server] です。

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

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

ルーターでタイムアウトが発生しました

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

考えられる原因

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

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

共通の診断手順

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

  • API Monitoring
  • NGINX アクセスログ

API Monitoring

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

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

    504 エラーを示す例

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

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

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

    上記の例では、

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

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

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

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. [Response Time] でその他の 504 エラーを確認し、すべての 504 エラーで [Response Time] が一貫しているかどうか(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. Request Time(リクエスト時間)が、Router/仮想ホストで構成されている I/O タイムアウトと同じかどうかを確認します。「はい」の場合、Message Processor がこの時間内に応答する前に Router がタイムアウトしたことを意味します。

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

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

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

診断

  1. 504 エラーの原因が、Message Processor が応答する前に Router がタイムアウトしたことが原因であるかどうかを判断します。これを行うには、Router の API Monitoring の [Response Time] / [Request Time] が、Router/仮想ホストに構成された I/O タイムアウトと同じかどうか(両方のフィールドは同じ情報を表しますが、異なる名前で呼ばれます)が、API Monitoring または NGINX アクセスログで API Monitoring または NGINX アクセスログを使用して Fault SourceFault ProxyFault Code フィールドが - に設定されているかどうかを確認します。
  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. [Properties] で、[Proxy Read Timeout] の値を秒単位で表示します。

    上記の例では、[Proxy Read Timeout ] は値 120 に構成されています。この仮想ホストに構成されている I/O タイムアウトは 120 秒です。

Management API

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

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

    Public Cloud ユーザー

    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_timeout120 の値で構成されています。この仮想ホストに構成されている 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 で新しい値 57 がプロパティ proxy_read_timeout に設定されています。これは、default 仮想ホストの 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. 上の出力例では、プロパティ HTTPTransport.io.timeout.millishttp.properties の値 55000 で設定されています。これは、Message Processor で I/O タイムアウトが 55 秒に正常に構成されていることを示します。

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

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

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

この例では

  • Router ではデフォルト値である 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 タイムアウトの構成の手順に沿って、仮想ホストのタイムアウトを設定します。