【保存版Vol.2】サーバーが重い・落ちる・容量不足…Ubuntu運用で遭遇する「見えない不具合」の完全解決ガイド

Linux

【怪奇現象】サーバーが「勝手に」死んでいる…?

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回の記事で、SSH接続や権限周りのトラブルは解決できたでしょうか?

サーバー構築の恐ろしいところは、やっと動いた!と思って安心した数日後、あるいは数ヶ月後に「第2の波」がやってくるところです。
それは、接続エラーのような明確な拒絶ではなく、もっと陰湿で、原因が分かりにくい不具合です。

コウ君

先生、聞いてください…。
この前作ったWordPressのサイト、朝起きたら「データベース接続確立エラー」になって止まっていたんです。
再起動したら直ったんですけど、数日経つとまた止まるんです。
誰も触っていないのに、幽霊でもいるんでしょうか…?(怖)

リナックス先生

それは幽霊じゃないわ。
Linuxの中に住んでいる「暗殺者(Killer)」の仕業よ。
今回は、サーバーが稼働し始めた後に直面する「リソース不足」「プロセス異常」「Webサーバーのエラー」といった、より実践的なトラブルシューティングを伝授するわ。

この記事では、以下の5つの「運用トラブル」を深掘りします。

  1. 【メモリ編】 アプリが勝手に落ちる犯人「OOM Killer」とSwap対策
  2. 【ディスク編】 「容量不足」の本当の恐怖と、見えないゴミファイルの掃除
  3. 【負荷編】 サーバーが激重! top コマンドで犯人を特定する技術
  4. 【Web編】 502 Bad Gateway / 403 Forbidden の正体
  5. 【自動化編】 Cronが動かない時に見るべき「環境変数」の罠

これを読めば、あなたのサーバー管理スキルは「初心者」を卒業し、トラブルを未然に防ぐ「運用者」の領域へと足を踏み入れることができます。


第1章:メモリ不足と「OOM Killer」の暗躍

「何もしていないのにMySQLが落ちている」。
低スペックのVPS(メモリ512MB〜1GB)を使っている場合、原因の9割はメモリ不足です。

1-1. 犯行現場の証拠を押さえる

Linuxには、メモリが物理的に足りなくなった時、システム全体が共倒れするのを防ぐために、「メモリを食っている行儀の悪いプロセスを強制的に殺す」という機能が備わっています。
これが「OOM Killer (Out of Memory Killer)」です。

まずは、本当に彼が犯人なのか、システムログ(dmesg)を確認しましょう。

# OOM Killerの痕跡を探す(iは大小文字区別なし)
sudo dmesg | grep -i oom

もし以下のような赤い文字が出てきたら、確定です。

Out of memory: Killed process 1234 (mysqld) total-vm:...

「mysqld(データベース)」がメモリ不足のために殺害されたことが記録されています。

1-2. 解決策:Swap(スワップ)領域を作る

メモリを増設(プラン変更)するのが一番ですが、コストがかかります。
無料で行える対策として、ディスクの一部をメモリ代わりにする「Swapファイル」を作成しましょう。
多くのVPSの初期設定ではSwapが無効(0GB)になっています。

【Swap作成の3ステップ】

ここでは安全な「2GB」のSwapファイルを作成します。

# 1. 空のファイルを作成(2G = 2048MB)
sudo fallocate -l 2G /swapfile

# 2. 権限を「rootのみ」に制限(セキュリティ必須)
sudo chmod 600 /swapfile

# 3. Swap領域としてフォーマットし、有効化
sudo mkswap /swapfile
sudo swapon /swapfile

これで応急処置は完了です。free -h コマンドを打って、Swap: 2.0Gi と表示されれば成功です。
※再起動後も有効にするには /etc/fstab への追記が必要ですが、まずはこれで落ちなくなるか様子を見ましょう。

リナックス先生

Swapはあくまで「保険」よ。
もしSwapを使っても頻繁に落ちるなら、それはサーバーのスペック不足が明白ね。
その時は、メモリ容量の大きい上位プランや、他社のハイスペックなVPSへの引っ越しを検討するタイミングよ。

▼ハイスペックでも安い!おすすめVPSはこちら

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

第2章:ディスク容量不足(Disk Full)のミステリー

「No space left on device」
このエラーが出ると、ファイルの保存はおろか、Tabキーによるコマンド補完すら効かなくなります。

2-1. 犯人探しの基本コマンド

まずはどこがパンパンなのか調べます。

# 全体の使用率を確認
df -h

/ (ルート) が100%になっていたら緊急事態です。
次に、どのディレクトリが容量を食っているか特定します。

# ルート直下のディレクトリごとの容量を表示(計算に少し時間がかかります)
sudo du -sh /*

多くの場合、犯人は以下のいずれかに潜んでいます。

  • /var/log:ログファイルの肥大化
  • /var/lib/mysql:データベースのバイナリログ
  • /home:ユーザーがアップロードしたファイル

2-2. 「消したはずなのに容量が減らない」怪奇現象

コウ君

先生!巨大なログファイルを見つけて削除(rm)したんです。
でも df -h で見ると、まだ「使用率100%」のままなんです!
どうなってるんですか!?

リナックス先生

これは初心者が必ずハマる罠ね。
Linuxでは、「プロセスが掴んでいるファイルを削除しても、ディスク領域は解放されない」という仕様があるの。
例えば、Webサーバーが書き込み中のログファイルを無理やり消しても、Webサーバー自体を再起動するまで、そのファイルは「亡霊」として容量を食い続けるわ。

【亡霊ファイルの探し方】

lsof コマンドで、削除されたのに掴まれているファイル(deleted)を探します。

# 削除済み(deleted)なのに開かれているファイルを探す
sudo lsof / | grep deleted

もしここで巨大なログファイルが出てきたら、そのファイルを掴んでいるプロセス(NginxやApacheなど)を再起動してください。
sudo systemctl restart nginx などを実行した瞬間、嘘のように空き容量が戻ってきます。

2-3. journalログの掃除

Ubuntuでは systemd-journald という機能がログを溜め込んでおり、これが数GBになっていることがよくあります。

# ジャーナルログの容量確認
journalctl --disk-usage

# 1秒で掃除(古いログを捨てて100MBまで縮小)
sudo journalctl --vacuum-size=100M

第3章:サーバーが激重!負荷の正体を見破れ

「サイトの表示が遅い」「コマンドの反応が鈍い」。
そんな時は top コマンドでサーバーの健康診断を行います。

3-1. Load Average(ロードアベレージ)を見る

top を実行し、右上の 「load average: 0.50, 1.20, 2.00」 という数字に注目してください。
これは左から「1分間、5分間、15分間」の平均負荷を表します。

【危険信号の目安】
CPUのコア数(nprocコマンドで確認)が基準です。

  • 1コアのVPSの場合: 「1.0」を超えると行列ができ始めている。「3.0」を超えると操作困難。
  • 2コアのVPSの場合: 「2.0」が基準線。

3-2. %CPU と %WA の違い

負荷が高い時、CPUが何をしているかが重要です。

  • %us (User) が高い:
    プログラム(PHPやPythonなど)が計算処理で忙しい状態。コードの効率化やCPU増強が必要。
  • %wa (IO Wait) が高い:
    CPUは暇なのに、ディスクの読み書き(I/O)が遅すぎて待たされている状態。DBへのアクセス過多や、ディスク故障の可能性があります。

第4章:Webサーバーの「50x」「40x」エラー

ブラウザに表示されるエラーコードは、問題の切り分けに役立つ最大のヒントです。

4-1. 502 Bad Gateway(Nginx)

WordPress環境で最も多いエラーです。
これは「Nginx(受付係)は元気だけど、後ろにいるPHP(処理係)が返事をしない」という意味です。

【対策】
PHP-FPMが落ちている可能性が高いです。

# PHPの状態確認
sudo systemctl status php8.1-fpm  # バージョンは環境に合わせて

# 再起動
sudo systemctl restart php8.1-fpm

それでも直らない場合、Nginxの設定ファイル(/etc/nginx/sites-available/...)で指定しているソケットパス(unix:/run/php/...)と、実際のPHPの設定が食い違っていることがよくあります。

4-2. 403 Forbidden(閲覧禁止)

「権限がありません」というエラーです。
Webサーバーの実行ユーザー(通常は www-data)が、ファイルやディレクトリを読み取れない状態です。

【対策】
公開ディレクトリの所有権を www-data に渡します。

# 所有者を変更(-Rで再帰的に)
sudo chown -R www-data:www-data /var/www/html

# ディレクトリは755、ファイルは644に修正
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;

4-3. 設定ファイルの構文エラーチェック

設定ファイルをいじった後、再起動したら動かなくなった時は、必ず「構文チェック」を行います。

# Nginxの場合
sudo nginx -t

# Apacheの場合
sudo apache2ctl configtest

「Syntax OK」と出れば安心ですが、エラーが出た場合は「何行目の記述が間違っているか」を教えてくれます。

第5章:Cron(自動実行)が動かない罠

「コマンドラインで手動実行すると動くのに、Cronに登録すると動かない」。
これはLinux七不思議の一つと言われるほど多発するトラブルです。

原因:環境変数(PATH)が違う

私たちがターミナルでログインしている時は、便利な「環境変数(PATH)」が読み込まれていますが、Cronは「裸の状態」で実行されます。
つまり、単に php と書いても、「phpコマンドがどこにあるか知らないよ」となってしまうのです。

【対策:絶対パスを使う】

Cronに記述する際は、必ずコマンドをフルパス(絶対パス)で書きます。

# × ダメな例
0 4 * * * php /var/www/backup.php

# ○ 正しい例(which php で場所を確認)
0 4 * * * /usr/bin/php /var/www/backup.php

また、Cronの実行ログはデフォルトでは表示されません。
トラブル時は syslog を確認するか、標準出力をファイルに書き出す設定にしてデバッグします。

# エラー内容をファイルに吐き出させるデバッグ術
0 4 * * * /usr/bin/php /var/www/backup.php > /tmp/cron_debug.log 2>&1

まとめ:トラブルは「サーバーの健康診断」

いかがでしたか?
今回紹介した「メモリ」「ディスク」「負荷」「Webエラー」「Cron」の5つは、サーバーを長く運用していれば必ず出くわす壁です。

しかし、これらのトラブルシューティングを経験するたびに、あなたは「OSがどうやってリソースを管理しているか」「Webサーバーがどう連携しているか」という深い理解を得ることができます。

エラーが出たら、まずはログを見る。そして、この記事の対処法を試してみてください。
もし「設定をいじりすぎて修復不可能になった…」という場合は、潔く「サーバー再構築」をするのも一つの手です。
VPSなら数分で新品の環境が手に入りますからね。

▼失敗しても安心!何度でも再構築できるVPSはこちら

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント