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

<ph type="x-smartling-placeholder"></ph> 現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント
詳細

症状

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

このエラー レスポンスは、クライアントが 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 など、Apigee Edge ランタイム フローのすべてのコンポーネント プロセッサとバックエンド サーバーに適切なデフォルトのタイムアウト値を設定して、 API リクエストの完了に時間がかかりすぎないようにするプロジェクトのコンポーネントが 指定された期間内にアップストリーム コンポーネントからレスポンスを その特定のコンポーネントはタイムアウトし、通常は 504 Gateway Timeoutエラーが発生します。

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

<ph type="x-smartling-placeholder">

Router のタイムアウト

Apigee Edge のルーターに構成されているデフォルトのタイムアウトは 57 秒です。これが最大数です Edge で API リクエストを受信してから、API プロキシが実行できる時間。 バックエンド レスポンスと実行されたすべてのポリシーを含むレスポンスが返されます。 デフォルトのタイムアウトは、ルーター/仮想ホストでオーバーライドできます。詳細については、 <ph type="x-smartling-placeholder"></ph> ルーターの I/O タイムアウトの構成をご覧ください。

考えられる原因

Edge における 504 Gateway Timeout エラーの典型的な原因は、 ルーターのタイムアウトは次のとおりです。

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

共通の診断手順

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

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

API Monitoring

<ph type="x-smartling-placeholder">

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

  1. [Analyze] >API モニタリング >Investigate ページをご覧ください。
  2. 5xx エラーでフィルタし、期間を選択します。
  3. Status CodeTime をプロットします。
  4. 504 件のエラーが表示されているセルをクリックすると、詳細と内容が表示されます これらのエラーに関するログが次のように表示されます。

    504 エラーを示す例

  5. 右側のペインで、[View logs] をクリックします。

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

    • リクエスト: 呼び出しに使用するリクエスト メソッドと URI を確認できます。
    • レスポンス 時間: リクエストの合計経過時間です。

    上記の例では タイプエラーの分析情報は

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

    API Monitoring を使用してすべてのログを取得することもできます。 GET ログ API。 たとえば、orgenvtimeRange のログをクエリすると、 と status の場合、次の条件を満たすトランザクションのすべてのログをダウンロードできます。 クライアントがタイムアウトになりました。

    API Monitoring は、これらの 504 に対してプロキシを -(未設定)に設定するため API(ログとロギング)を使用して API など)を使用して、仮想ホストとパスの関連プロキシを取得します。

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
    <ph type="x-smartling-placeholder">
  6. [Response Time](応答時間)でその他の 504 エラーを確認し、 応答時間(ルーターで設定された I/O タイムアウト値)が一致しているかどうかを確認します。 (57 秒)が、すべての 504 エラーにわたって表示されます。

NGINX アクセスログ

<ph type="x-smartling-placeholder">

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

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

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

    • リクエスト時間: 57.001 秒。これは、この値が ルーターは 57.001 秒後にタイムアウトしました。

      <ph type="x-smartling-placeholder">
    • リクエスト: GET /test-timeout
    • ホスト エイリアス: myorg-test.apigee.net
  4. [リクエスト時間] が I/O タイムアウトと同じかどうかを確認します。 構成されます。「はい」の場合、ルーターが この時間内に Message Processor から応答がありませんでした。

    上記の NGINX Access Log エントリの例では、Request 時間57.001 秒で、デフォルトの I/O タイムアウト設定に非常に近くなっています 設定されます。これは、メッセージの前に Router がタイムアウトしたことを明確に示しています。 プロセッサが応答する可能性があります。

  5. リクエストの対象の API プロキシを、 リクエスト フィールド。

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

診断

  1. Router が以前にタイムアウトしたことが 504 エラーの原因かどうかを確認する Message Processor からレスポンスが返されます。これを行うには、 API Monitoring の Response Time/Router の Request Time(両方のフィールド) は、同じ情報を表すが、異なる名前で呼び出される)は、 ルーター/仮想ホストに構成された I/O タイムアウトと、[Fault Source]、[Fault] フィールド プロキシ障害コードは、API Monitoring または NGINX Access を使用して-に設定されます 一般的な診断手順で説明されているとおりにログに記録されます。
  2. Router または特定の仮想ホストで構成されている I/O タイムアウト値が設定されているかどうかを確認する Message Processor または特定の API プロキシで構成されているものよりも低くなります

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

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

<ph type="x-smartling-placeholder">をご覧ください。
Edge UI

Edge UI を使用して仮想ホストのタイムアウトを確認するには、次の操作を行います。

  1. Edge UI にログインします。
  2. [管理] >仮想ホスト
  3. タイムアウトの問題が発生している特定の環境を選択します。
  4. I/O タイムアウト値を確認する特定の仮想ホストを選択します。
  5. [Properties] で、[Proxy Read Timeout] の値(秒単位)を表示します。

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

Management API

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

  1. 次のコマンドを実行します。 <ph type="x-smartling-placeholder"></ph> 次に示すように、仮想ホスト 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_timeout の値は 120。これは、この仮想ホストに構成された I/O タイムアウトが 120 であることを意味します。 秒です。

で確認できます。

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

<ph type="x-smartling-placeholder">
  1. Router マシンにログインします。
  2. 次の場所でプロパティ proxy_read_timeout を検索します。 /opt/nginx/conf.d ディレクトリに移動して、新しい値が設定されているかどうかを確認します。 次のとおりです。
    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;
    

    上記の出力例では、プロパティ proxy_read_timeout に次のように設定されています。 0-default.conf に新しい値 57 が設定されました。これは、 構成ファイルを作成します。これは、I/O タイムアウトが Router で、default 仮想ホストの 57 秒に構成されています。既存の 仮想ホストごとに、この情報が表示されることになります。価値を引き出す proxy_read_timeout: API の作成に使用した特定の仮想ホスト 件の呼び出しが 504 エラーで失敗しました。

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

I/O タイムアウトは、以下で確認できます。

  • API プロキシのターゲット エンドポイント
  • API プロキシの ServiceCallout ポリシー
API プロキシのターゲット エンドポイントで I/O タイムアウトを表示する
  1. Edge UI で、I/O を表示する特定の API プロキシを選択します。 設定します。
  2. 確認する特定のターゲット エンドポイントを選択します。
  3. [io.timeout.millis プロパティ] で、 TargetEndpoint<HTTPTargetConnection> 要素 できます。

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

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

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

    <Timeout>120000</Timeout>
    

Message Processor での I/O タイムアウトの確認

<ph type="x-smartling-placeholder">
  1. Message Processor マシンにログインします。
  2. 次の場所でプロパティ HTTPTransport.io.timeout.millis を検索します。 次のコマンドを使用して、/opt/apigee/edge-message-processor/conf ディレクトリを作成します。

    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.millis の値は 55000 に設定されています http.properties。これは、I/O タイムアウトが正常に構成され、 Message Processor で 55 秒。

Router と Message Processor で構成されたタイムアウトがわかったら、 ルーターまたは仮想ホストのタイムアウト値が、 Message Processor/API プロキシ。

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

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

この例では

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

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

解決策

Router と Message で適切な I/O タイムアウトを構成するには、次の操作を行います。 プロセッサ。

  1. 詳しくは、 <ph type="x-smartling-placeholder"></ph> I/O タイムアウトを構成するためのベスト プラクティスをご覧ください。 Apigee Edge を介した API リクエスト フローに関連するさまざまなコンポーネントで設定する必要があります。
  2. 上記の例で、より大きなタイムアウト値を設定する必要があることが確実な場合 バックエンド サーバーでの待機時間が長くなり、タイムアウトの設定が増えているためです。 値を 120 秒に設定してから、120 秒ほどのタイムアウト時間を 例: Router に対する 123 seconds。すべての API プロキシに影響を与えないようにするため 新しいタイムアウト値があるため、123 seconds の値を 特定の API プロキシで使用されている特定の仮想ホスト
  3. 以下の手順に従います。 <ph type="x-smartling-placeholder"></ph> ルーターの I/O タイムアウトの構成を参照して、仮想ホストのタイムアウトを設定する。