【Ubuntu】Nginx/Apacheのログ場所と見方:access/errorで何が分かる?(原因特定の最短ルート)

Nginx/Apacheログ調査 - access/error

この記事で解決できること

  • Ubuntuで Nginx / Apache のログファイルの場所が分かります
  • 「500/502/503/504」「403」「404」などの原因を ログから切り分け できるようになります
  • ログ調査の"型"(見る順番・絞り込み・再現・確認)が身につきます
  • ログ肥大(ディスク逼迫)にも繋がるので、再発防止の観点も押さえられます

結論(最短)

Webが壊れたら、まずこの順番で見れば迷いません。

  1. systemctlで生死確認systemctl status nginx|apache2
  2. error log を見るtail -n 200 .../error.log
  3. access log で発生箇所/ステータスを特定grep " 500 " .../access.log
  4. 時間を絞って再現→直後のログを見る(これが最強)
  5. 502/503系なら upstream(アプリ側)へ波及

目次

  1. どっちを使っているか確認(Nginx? Apache?)
  2. ログの場所(Ubuntuの典型パス)
  3. まず "error log" を見る
  4. access log で「どのリクエストが死んだか」特定する
  5. ステータスコード別:切り分けの型
  6. "ログ場所が違う"時の見つけ方
  7. 絞り込みのコツ
  8. 失敗例と読み解き
  9. やってはいけないこと

前提(対象環境)

  • OS:Ubuntu
  • Webサーバ:Nginx または Apache
  • sudo 可能
  • "新人が迷わない" ために、手順を固定化して書きます

1. まずどっちを使っているか確認(Nginx? Apache?)

既に分かっているなら飛ばしてOKです。

1-1. サービス状態で確認

$ sudo systemctl status nginx
$ sudo systemctl status apache2
  • nginx が active → Nginx を見ればOK
  • apache2 が active → Apache を見ればOK
  • 両方 active → リバプロ構成の可能性(まず外側のログから)

1-2. ポート待受で確認(補助)

$ sudo ss -lntp | grep ':80 '
$ sudo ss -lntp | grep ':443 '

2. ログの場所(Ubuntuの典型パス)

Ubuntuではだいたいここです。

2-1. Nginx

  • error log:/var/log/nginx/error.log
  • access log:/var/log/nginx/access.log
$ ls -la /var/log/nginx

2-2. Apache(apache2)

  • error log:/var/log/apache2/error.log
  • access log:/var/log/apache2/access.log
$ ls -la /var/log/apache2

3. まず "error log" を見る(ここが最短)

アクセスログ(access.log)は「何が起きたか」を見つけるのに良いですが、原因(スタックトレース/設定エラー/上流死) が出るのは error.log です。

3-1. 直近200行を見る(最初の一手)

# Nginx
$ sudo tail -n 200 /var/log/nginx/error.log

# Apache
$ sudo tail -n 200 /var/log/apache2/error.log

3-2. 再現しながらリアルタイム追跡(最強)

# Nginx
$ sudo tail -f /var/log/nginx/error.log

# Apache
$ sudo tail -f /var/log/apache2/error.log

これを開いたまま、別タブでブラウザ/curl で再現すると、原因に直行できます。「ログ見たけど分からない」は、再現とセットにしていないことが多いです。

4. access log で「どのリクエストが死んだか」特定する

4-1. 500だけ拾う

$ sudo grep " 500 " /var/log/nginx/access.log | tail -n 50

4-2. 404だけ拾う

$ sudo grep " 404 " /var/log/nginx/access.log | tail -n 50

4-3. 特定パスだけ拾う(例:/api/)

$ sudo grep " /api/" /var/log/nginx/access.log | tail -n 50

5. ステータスコード別:だいたいこう切り分ける

5-1. 500(Internal Server Error)

  • アプリ内部エラー(PHP/Node/Ruby等)
  • 設定ミス(FastCGI設定など)
  • 権限/パス(Permission denied)の可能性も

次に見る:error.log(最優先)、アプリログ、journalctl -u

5-2. 502 / 503 / 504(Bad Gateway / Service Unavailable / Gateway Timeout)

  • Nginx/Apache が 上流(upstream) に繋げない/応答が遅い/死んでる

次にやる:

$ nc -vz 127.0.0.1 3000
$ curl -I http://127.0.0.1:3000

5-3. 403(Forbidden)

  • Basic認証、IP制限、WAF、ディレクトリ権限、ファイル権限

次に見る:error.log に "permission denied" や "client denied" が出る

5-4. 404(Not Found)

  • ルーティング/ファイルが存在しない
  • SPAのリライト設定不足

6. "ログ場所が違う"時の見つけ方

6-1. Nginxの実設定を全部出す

$ sudo nginx -T 2>&1 | grep -E "access_log|error_log" | head -n 50

6-2. Apacheの構成確認

$ sudo apache2ctl -S

7. 調査を速くする「絞り込みのコツ」

7-1. 今この瞬間に起きているものだけ見たい

最強は「再現→tail -f」です。

7-2. キーワードで絞る(例:upstream)

$ sudo grep -i "upstream" /var/log/nginx/error.log | tail -n 50

8. 失敗例と読み解き(error.logでよく出るやつ)

8-1. connect() failed (111: Connection refused) while connecting to upstream

意味:upstream先が待ち受けていない/落ちている

$ nc -vz 127.0.0.1 <upstream-port>
$ sudo systemctl status <app-service>

8-2. upstream timed out (110: Connection timed out)

意味:upstreamが遅い/詰まっている(負荷・DB・I/Oなど)

8-3. permission denied

意味:ファイル/ディレクトリ権限、SELinux/APPArmor絡みもあり得る

8-4. client intended to send too large body

意味:アップロードサイズ制限(nginxのclient_max_body_size等)

9. やってはいけないこと

やってはいけない1:ログ見ずに restart を連打する

ログを見ない再起動は、原因を隠すだけで時間を溶かします。まず error.log / journalctl を見てから。

やってはいけない2:access.logだけ見て満足する

原因が出るのはだいたい error.log です。accessは「どのリクエストか」特定用。

やってはいけない3:ログ肥大を放置する

アクセスが増えるとログは増えます。ディスク逼迫(No space left)に繋がるので、容量監視やローテーション(logrotate)は必須。

コピペ用:ログ調査テンプレ(Nginx例)

# サービス生死
sudo systemctl status nginx

# エラー(まずここ)
sudo tail -n 200 /var/log/nginx/error.log

# 再現しながら追う(最強)
sudo tail -f /var/log/nginx/error.log

# どのリクエストが死んだか
sudo grep " 500 " /var/log/nginx/access.log | tail -n 50
sudo grep " 502 " /var/log/nginx/access.log | tail -n 50
sudo grep " 403 " /var/log/nginx/access.log | tail -n 50
sudo grep " 404 " /var/log/nginx/access.log | tail -n 50

まとめ

  • まず error.log、次に access.log
  • 再現しながら tail -f が最短
  • 502/503/504 は upstream(アプリ)へ。ポート疎通の型に戻る
  • ログはディスクを食う。No space left の原因にもなる

検証環境

本記事のコマンドは Ubuntu 24.04 LTS / bash 5.2 で動作確認済みです。

次に読む