504 Gateway Timeout
使い方
504 Gateway Timeout ステータスコードは、サーバーが上流サーバーのプロキシまたはゲートウェイとして動作していることを意味します。HTTP リクエストを受け取ったあと、サーバーはそのリクエストを上流サーバーへ転送しようとしましたが、許容された時間内に応答を受け取れませんでした。
これは 502 Bad Gateway ステータスコードに関連します。502 は上流サーバーが無効なレスポンスを返したことを示し、504 は応答がまったく受信されなかったことを示します。
プラットフォーム固有のタイムアウトはさまざまです。Shopify の API は 10 秒のリクエストタイムアウトを適用し、その時間内にレスポンスの準備ができない場合に 504 Gateway Timeout を返します。Shopify API を扱う開発者は、クエリを最適化し、この制限を超える操作にはバックグラウンド処理を使う必要があります。
SEO への影響
Googlebot は 5xx エラーを、サイト全体のクロール頻度を一時的に低下させるシグナルとして扱います。以前にインデックスされていた URL は当初は保持されますが、ダウンタイムが長引くと Google はそれらをインデックスから削除します。504 レスポンスとともに返されたコンテンツは無視されます。Google はドキュメントの中で、500、502、503 を明示的にサーバーエラーとしてひとまとめにしています。504 も同じ一般的な 5xx エラーに含まれます。robots.txt ファイルでの 5xx エラーははるかに深刻で、サイトの他のすべてのページが 200 を返していても同様です。Google は最大 12 時間クロールを停止し、その後最大 30 日間はキャッシュされたコピーにフォールバックします。エラーが続くと、Google はサイトを完全にインデックスから除外します。Bingbot も 5xx レスポンスをクロールの失敗として扱います。5xx エラーが継続すると、Bing でのインデックス登録が妨げられます。
例
クライアントがリソースを要求し、上流サーバーが HTTP レスポンスを返さなかったため、サーバーは 504 Gateway Timeout ステータスコードで応答します。
リクエスト
GET /news HTTP/1.1
Host: example.com
レスポンス
HTTP/1.1 504 Gateway Timeout
Content-Type: text/html; charset=UTF-8
Content-Length: 128
<html>
<head>
<title>Gateway Timeout</title>
</head>
<body>
<p>The server is not responding.</p>
</body>
</html>
対処方法
プロキシがバックエンドの応答を待ってタイムアウトしました。対処は、タイムアウトを引き上げるか、バックエンドを高速化するかのいずれかです。
プロキシのタイムアウトを引き上げます。
nginx では、デフォルトのタイムアウトは 60 秒です。server または location のブロックで該当するディレクティブを引き上げます。
Apache では、仮想ホストまたはグローバルの設定で ProxyTimeout 300 を設定します。mod_proxy_fcgi を使う場合は、ProxyPassMatch ディレクティブの timeout パラメーターが待機時間を制御します。
バックエンドのタイムアウトをそろえます。バックエンドのプロセスには、同等かそれ以上のタイムアウトが必要です。PHP では、php.ini の max_execution_time と PHP-FPM プール設定の request_terminate_timeout を引き上げます。Node.js では server.timeout を設定します。Gunicorn では —timeout を使います。
遅いバックエンドの処理を最適化します。タイムアウトは処理が遅いことの症状です。ボトルネックを見つけるためにリクエストをプロファイリングします。
プラットフォームが課すタイムアウトを尊重します。ホスティングされたプラットフォームは、一般的なプロキシのデフォルトより短いハードリミットを適用します。Shopify は 10 秒の上限を課します。プラットフォームの制限を超える操作については、作業をバックグラウンドジョブへオフロードし、HTTP リクエストをブロックするのではなく結果をポーリングします。
ネットワーク経路を確認します。curl や telnet でプロキシとバックエンド間の接続性を検証します。パケットロス、DNS の遅延、中間ホップでのファイアウォールのルールは、いずれもタイムアウトの一因になります。遅いネットワーク区間を特定するために traceroute を実行します。
キャッシュを追加します。冪等なリクエストについては、プロキシ層でレスポンスをキャッシュすることで、遅いバックエンドへの呼び出しの繰り返しを避けられます。nginx の proxy_cache_path と Apache の mod_cache は、いずれも上流の負荷を軽減します。
コードリファレンス
.NET
HttpStatusCode.GatewayTimeout
Rust
http::StatusCode::GATEWAY_TIMEOUT
Rails
:gateway_timeout
Go
http.StatusGatewayTimeout
Symfony
Response::HTTP_GATEWAY_TIMEOUT
Python3.5+
http.HTTPStatus.GATEWAY_TIMEOUT
Java
java.net.HttpURLConnection.HTTP_GATEWAY_TIMEOUT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_GATEWAY_TIMEOUT
Angular
@angular/common/http/HttpStatusCode.GatewayTimeout