「502 Bad Gateway」の画面を前に、nginxのエラーログを開いてどこから原因を追うか落ち着いて考えている一人運用の保守担当者

502・504エラーの切り分け|nginx・php-fpm・上流の順に見る

「サイトが見られない」と連絡が来て開いてみたら、画面には502 Bad Gateway。あるいは、しばらく待たされた末に504 Gateway Timeout——。 保守運用をしていると、この2つのエラーには何度も出くわしますよね。しかもたちが悪いのは、エラーを返しているnginxそのものは元気に動いていること。だから「どこを直せばいいのか」が一見わからず、あちこち再起動して回りたくなります。

でも、502も504も、実はnginxが「後ろにいる相手」とうまくやり取りできなかったというサインです。犯人はnginxの奥にいます。原因の場所さえ順番に絞れれば、やみくもに全部を再起動するより、ずっと早く・安全に落ち着けます。

この記事では、502・504が出たときに、nginxのエラーログを起点に、手前(Webサーバー)から奥(アプリ→上流)へ順番に切り分ける手順を一緒に整理します。構成(Apache+mod_php、nginx+php-fpm、ロードバランサー+アプリサーバーなど)で細部は変わりますが、「手前から奥へ」の考え方はそのまま使えます。

結論:まずエラーコードで大きく当たりをつけます502は「後ろが応答を返せなかった/落ちている」、504は「後ろが時間内に返してこなかった=遅い」が基本の見分けです。そのうえで、①nginxのエラーログを見る(一次情報)→ ②アプリ(php-fpm等)の生死とログ → ③上流(DB・外部API)の遅延・詰まりの順に、手前から一段ずつ確かめます。いきなり再起動すると「たまたま直った」だけで原因が残り、また再発します。まずログで「どこで止まったか」を1つに絞るのが、結果的に一番早いです。

何が起きているか:nginxは「取次ぎ役」で、後ろが応えないと5xxを返す

502と504は、5xx=サーバー側のエラーの仲間です。ここで大事なのは、nginx(フロントのWebサーバー)は多くの場合、リクエストを受け取って後ろのアプリに取り次ぐ役だということです。後ろのアプリ(php-fpm、アプリケーションサーバー、別のnginx/Apacheなど)が正しく応えてくれて初めて、ページを返せます。

その「取次ぎ」がうまくいかないと、nginxは状況に応じて5xxを返します。ざっくり分けると次の通りです。

つまり必要なのは、「後ろの誰が、どんなふうにダメだったか」を1つに絞る目です。次から、その順番を見ていきます。

手前から奥へ、3つの層で切り分ける

nginx・アプリ(php-fpm等)・上流(DB/外部API)の3つの層を手前から順にたどって502/504を切り分ける流れ図
「nginx→アプリ→上流」の手前から順に。どの層で止まったかを一つに絞る

ポイントは、エラーを返しているnginxの一次情報から始めて、手前から奥へ進むことです。奥(DBなど)からいきなり触ると、原因でない層まで再起動して回ることになります。

① まず nginx のエラーログを読む(一次情報)

再起動よりも先にやるのは、nginxのエラーログを開くことです。502・504のときは、ここに「後ろとのやり取りで何が起きたか」がかなり具体的に残っています。

ここで「connection refused(つなげない)」系なら、犯人は②アプリの生死の可能性が高いです。「timed out(遅い)」系なら、③上流の遅延を疑います。ログが指し示す方向へ進みます。

ここで一呼吸。ログを開くのは遠回りに感じるかもしれませんが、「どこで止まったか」を先に知るための一番の近道です。焦って再起動する前にログを見た、その判断がすでに落ち着いた一歩です。

② アプリ(php-fpm 等)の生死とログを見る

nginxのログが「つなげない(refused)」系だったり、502が続くなら、取り次ぐ先のアプリが動いているかを確かめます。

再起動して直ったとしても、②で見た「落ちた理由・詰まった理由」を残すこと。理由が分からないままだと、同じ時間帯にまた再発します。

③ 上流(DB・外部API)の遅延・詰まりを見る

504が中心だったり、アプリは生きているのにレスポンスが返ってこないなら、アプリのさらに奥を疑います。アプリは「上流の返事待ち」で固まっていることが多いです。

この層は影響範囲が大きいので、設定値やSQLを触る前に、いまの値と状態をメモしてから動きます。「元に戻せる状態」を保ったまま、一段ずつ確かめます。

具体例:「昼の時間帯だけ504が出る」を追う

よくある報告で、順番に切り分けてみます。

もし最初に「とりあえずnginxとphp-fpmを再起動」をしていたら、一時的にワーカーが空いて直ったように見えても、昼になればまた同じ504が出ていたはずです。ログから「遅い(504)→ 上流が重い」とたどれたからこそ、次に活きる原因にたどり着けました。

影響:切り分けの順番を持つと、何が変わるか

502・504の切り分け順を1枚持っておくと、直す力そのものより先に、焦りと手戻りが減ります

逆に、毎回いきなり全部を再起動していると、直った日と、原因が残って半日溶かす日の差が大きくなります。順番は、その日の自分を助ける道具です。

明日やること:自分の現場の「取次ぎ地図」を1枚書く

立派な資料は要りません。明日できる、いちばん小さな一歩はこれです。

  1. 自分が担当するサイトで、リクエストがユーザー→どこ→どこと流れるかを書き出す(例:nginx → php-fpm → MySQL、途中に外部API)。
  2. それぞれの層について、「ログの場所」と「生死の確認コマンド」を1行メモする(nginxのerror.log、php-fpmのstatus確認、DBのプロセス確認など)。
  3. proxy_read_timeout / fastcgi_read_timeout などのいまのタイムアウト値を控えておく。504のとき「実態と合っているか」をすぐ照らせます。
  4. 次に502/504が出たら、この地図を手前(nginxログ)から順にたどる。
  5. 実際に効いた層と原因を書き足し、「この時間帯はここが詰まりやすい」を言語化する。

きれいに描かなくて大丈夫です。「どこを経由して、どこで止まりうるか」の地図が1枚あるだけで、次の自分(や引き継ぐ人)が、やみくも再起動のループに迷い込まずに済みます。

502・504切り分けチェックリスト

切り分けに着手するとき、これだけ確認できているかを見る項目です。コピーして、自分のメモに当ててみてください。全部を毎回そろえる必要はありません。

まず外せない最低ラインはこの3つです。急いでいても、ここだけは押さえます。

次の項目は、手前で片づかないとき・原因が奥にありそうなときに追加で確認します。当てはまらなければ飛ばして大丈夫です。

全部に○が付かなくても大丈夫です。最低ラインの3つ、とくに「再起動の前にnginxのログを開いたか」さえ押さえられれば、やみくもに再起動して消耗するより、ずっと確かな一歩になります。

よければ、こちらも

502・504の切り分けは、落ち着いて動くための「順番」と「見る場所」があるほど楽になります。ログの見方と、遅さ・詰まりの調べ方をセットにしておくと、次の5xxがだいぶ軽くなります。

502エラーの原因が上流の遅いSQLだと突き止め、正常に戻ったサイトの画面を見て肩の力が抜けた保守運用の担当者

502・504がこわいのは、エラーを返しているnginxは元気なのに、原因がどこにいるのか見えないからです。でも、「後ろの誰かが応えられなかっただけ」と考えて、ログを手前から順にたどると決めるだけで、霧はかなり晴れます。多くの場合、あなたの設定が全部おかしいわけではなく、ただ後ろのどこか一段で止まっていただけです。 今日は、自分の現場の「取次ぎ地図」を1枚描いてみるところからで十分です。その1枚が、次の5xxを、迷路ではなく手順に変えてくれます。

ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。

関連用語