何が起きたのか?
504 は「中継役のサーバーが、上流の本体サーバーからの返事を待ちきれずに諦めた」というサインです。 教室で言えば、廊下に立つ伝令係が、隣の校舎の先生に質問を持ち込んだまま、いつまで経っても戻ってこない——そんな状況に近いかもしれません。中継役は仕方なく、教室に「今回は答えがありませんでした」と返します。
502 と似ていますが、性質が違います。502 が「壊れた返事が返ってきた」なら、504 は「返事自体が来なかった」。前者は上流の応答内容の問題、後者は上流の応答時間の問題です。
黒板からのひとこと
授業で「他の先生に聞いてくる」と言って出ていったきり、戻ってこない——生徒たちはずっと待つわけにはいきません。やがて誰かが「今日は無理そう」と判断する。これが 504 です。
判断が早いほうが、教室全体の混乱は小さくなります。だからプロキシは時間制限を持って、上流が応答を返さなければ「ここまで」と区切る。原因は、たいてい上流側にあります。
解決への歩み
大丈夫、次はこうしてみよう:
- 時間を置いて再アクセス:上流側の一時的な詰まりが解消することがある
- 重い操作を軽くする:ページネーション、フィルタ、必要最小限のデータ取得に切り替える
- 状況を管理者に伝える:時刻、URL、毎回再現するか、特定パラメータで起きるか
- 上流アプリのレイテンシを調査(管理者向け):APM のスロークエリ、外部 API の応答時間、タイムアウト値の整合性を順に
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 504 Gateway Timeout
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>504 Gateway Timeout</h1></body></html>