504 Gateway Timeout

プロキシが時間内に応答を受け取れませんでした。

使いどころ

上流のアプリが遅すぎるか、応答しません。

よくある原因と対処法

プロキシが上流からの応答を待ちきれずにあきらめました。典型的な原因は、遅いデータベースクエリや外部 API 呼び出し、デッドロックしたワーカー、トラフィックに対してワーカーが少なすぎる、ファイアウォールが黙ってパケットを破棄している、などです。タイムアウトは何層にも重なっており、最も短いものが優先されます。nginx の proxy_read_timeout のデフォルトは 60 秒、AWS ALB は 60 秒、API Gateway は 29 秒でアイドルタイムアウトになり、Cloudflare は 100 秒後に独自の 524 を表示します。

時間がどこにかかっているかを突き止めます。アプリのログでリクエストの処理時間を確認し、遅いクエリを探し、プロキシを経由せずにオリジンへ直接同じリクエストを送って計測します。タイムアウトを延ばしても問題を隠すだけです。長い処理はバックグラウンドワーカーに移し、ステータス URL 付きの 202 を返しましょう。504 の後でも処理が完了することがあるので、冪等でないリクエストを再試行すると処理が重複する可能性があります。

サーバーエラー (5xx)

5xx はサーバーエラーです。リクエストに問題がなくても、サーバーやその背後の何かが失敗しています。アラートを設定しておく価値があります。

レスポンスでの表示

HTTP/1.1 504 Gateway Timeout

返し方

Node.js / Expressres.status(504).end()
Python / Flaskreturn '', 504
nginxreturn 504;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く