<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 がタイムアウトします。
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 を使用してエラーを診断するには:
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
5xx
エラーでフィルタし、期間を選択します。- Status Code と Time をプロットします。
-
504
件のエラーが表示されているセルをクリックすると、詳細と内容が表示されます これらのエラーに関するログが次のように表示されます。504 エラーを示す例
- 右側のペインで、[View logs] をクリックします。
[トラフィック ログ] ウィンドウで、一部の
504
エラーについて次の詳細をメモします。- リクエスト: 呼び出しに使用するリクエスト メソッドと URI を確認できます。
- レスポンス 時間: リクエストの合計経過時間です。
上記の例では タイプエラーの分析情報は
- リクエスト が
GET /test-timeout
を指しています。 - 応答時間 は
57.001
秒です。これは、ルーターが 値が非常に近いため、Message Processor が応答する前にタイムアウトした Router で設定されたデフォルトの I/O タイムアウトである 57 あります。
API Monitoring を使用してすべてのログを取得することもできます。 GET ログ API。 たとえば、
org
、env
、timeRange
のログをクエリすると、 とstatus
の場合、次の条件を満たすトランザクションのすべてのログをダウンロードできます。 クライアントがタイムアウトになりました。API Monitoring は、これらの
504
に対してプロキシを-
(未設定)に設定するため API(ログとロギング)を使用して API など)を使用して、仮想ホストとパスの関連プロキシを取得します。For example :
<ph type="x-smartling-placeholder">curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- [Response Time](応答時間)でその他の
504
エラーを確認し、 応答時間(ルーターで設定された I/O タイムアウト値)が一致しているかどうかを確認します。 (57 秒)が、すべての504
エラーにわたって表示されます。
NGINX アクセスログ
<ph type="x-smartling-placeholder">NGINX アクセスログを使用してエラーを診断するには:
- NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 特定の期間に
504
エラーがないか検索する (過去に発生した場合)か、引き続き失敗するリクエストがあるかどうかを504
。 - 一部の
504
エラーについては、次の点に注意してください。 <ph type="x-smartling-placeholder">- </ph>
- 応答時間
- リクエスト URI
この例では、次の情報が表示されます。
-
リクエスト時間:
<ph type="x-smartling-placeholder">57.001
秒。これは、この値が ルーターは 57.001 秒後にタイムアウトしました。 - リクエスト:
GET /test-timeout
- ホスト エイリアス:
myorg-test.apigee.net
-
[リクエスト時間] が I/O タイムアウトと同じかどうかを確認します。 構成されます。「はい」の場合、ルーターが この時間内に Message Processor から応答がありませんでした。
上記の NGINX Access Log エントリの例では、Request 時間が
57.001
秒で、デフォルトの I/O タイムアウト設定に非常に近くなっています 設定されます。これは、メッセージの前に Router がタイムアウトしたことを明確に示しています。 プロセッサが応答する可能性があります。 - リクエストの対象の API プロキシを、 リクエスト フィールド。
原因: Router のタイムアウト構成が正しくない
診断
- Router が以前にタイムアウトしたことが
504
エラーの原因かどうかを確認する Message Processor からレスポンスが返されます。これを行うには、 API Monitoring の Response Time/Router の Request Time(両方のフィールド) は、同じ情報を表すが、異なる名前で呼び出される)は、 ルーター/仮想ホストに構成された I/O タイムアウトと、[Fault Source]、[Fault] フィールド プロキシと障害コードは、API Monitoring または NGINX Access を使用して-
に設定されます 一般的な診断手順で説明されているとおりにログに記録されます。 -
Router または特定の仮想ホストで構成されている I/O タイムアウト値が設定されているかどうかを確認する Message Processor または特定の API プロキシで構成されているものよりも低くなります。
これは、このセクションの手順に沿って行うことができます。
仮想ホストの I/O タイムアウトの確認
<ph type="x-smartling-placeholder">をご覧ください。Edge UI
Edge UI を使用して仮想ホストのタイムアウトを確認するには、次の操作を行います。
- Edge UI にログインします。
- [管理] >仮想ホスト。
- タイムアウトの問題が発生している特定の環境を選択します。
- I/O タイムアウト値を確認する特定の仮想ホストを選択します。
- [Properties] で、[Proxy Read Timeout] の値(秒単位)を表示します。
上の例では、[Proxy Read Timeout ] の値が
120
。つまり、この仮想ホストで構成されている I/O タイムアウトは 120 秒です。
Management API
次の管理 API を使用してプロキシ読み取りタイムアウトを確認することもできます。
-
次のコマンドを実行します。 <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 は、仮想ホストの名前です。
-
プロパティ
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">- Router マシンにログインします。
- 次の場所でプロパティ
proxy_read_timeout
を検索します。/opt/nginx/conf.d
ディレクトリに移動して、新しい値が設定されているかどうかを確認します。 次のとおりです。grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
特定の仮想環境のプロパティ
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 タイムアウトを表示する
- Edge UI で、I/O を表示する特定の API プロキシを選択します。 設定します。
- 確認する特定のターゲット エンドポイントを選択します。
- [
io.timeout.millis
プロパティ] で、TargetEndpoint
の<HTTPTargetConnection>
要素 できます。たとえば、次のコードでは I/O タイムアウトが 120 秒に設定されています。
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
API プロキシの ServiceCallout ポリシーで I/O タイムアウトを表示する
- Edge UI で、新しい I/O を表示する特定の API プロキシを選択します。 ServiceCallout ポリシーのタイムアウト値。
- 確認する ServiceCallout ポリシーを選択します。
-
次の要素で、適切な値が設定された
<Timeout>
要素を確認します。<ServiceCallout>
の設定。たとえば、次のコードの場合、I/O タイムアウトは 120 秒になります。
<Timeout>120000</Timeout>
Message Processor での I/O タイムアウトの確認
<ph type="x-smartling-placeholder">- Message Processor マシンにログインします。
-
次の場所でプロパティ
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
- 上記の出力例では、プロパティの値が
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 タイムアウトを構成するには、次の操作を行います。 プロセッサ。
- 詳しくは、 <ph type="x-smartling-placeholder"></ph> I/O タイムアウトを構成するためのベスト プラクティスをご覧ください。 Apigee Edge を介した API リクエスト フローに関連するさまざまなコンポーネントで設定する必要があります。
- 上記の例で、より大きなタイムアウト値を設定する必要があることが確実な場合
バックエンド サーバーでの待機時間が長くなり、タイムアウトの設定が増えているためです。
値を 120 秒に設定してから、120 秒ほどのタイムアウト時間を
例: Router に対する
123 seconds
。すべての API プロキシに影響を与えないようにするため 新しいタイムアウト値があるため、123 seconds
の値を 特定の API プロキシで使用されている特定の仮想ホスト。 - 以下の手順に従います。 <ph type="x-smartling-placeholder"></ph> ルーターの I/O タイムアウトの構成を参照して、仮想ホストのタイムアウトを設定する。