3GB超でサーバーが突然死!?放置すると危険なストレージの枯渇を完全自動で捩じ伏せる運用術

この記事は約6分で読めます。

「なぜかVPSのディスク容量が急激に減っている…」 「Webサーバーやデータベースは何も増やしていないはずなのに、ストレージ残量アラートが止まらない…」

Linux(Ubuntu)で自宅サーバーやVPSを運用し始めた人が、ある日突然見舞われる怪現象。 その原因の9割は、/var/log に溜まり続ける膨大なログの死骸です。
システムログ、メールの送信ログ、WEBサーバーのアクセスログ、UFW(ファイアウォール)のブロックログ…。Linuxは私たちが寝ている間も、休むことなくログを吐き続けています。
特に、Postfixでメールリレーを構築したり、Cronで定期処理を回し始めたりした環境では、ログの肥大化スピードが格段に跳ね上がります。気付いた時にはログだけで3GB〜10GBオーバー。最悪の場合、ストレージが100%になってサーバーごとクラッシュ(停止)します。
「動く環境を作って満足」で終わらせず、サーバーを数か月・数年とクリーンに稼働させ続けるための「ログ完全自動清掃システム」を今すぐ構築しましょう!

🛑 なぜ /var/log は勝手にパンパンになるのか?

Ubuntuには標準で logrotate(ログの世代管理ツール)や journald(systemdのログ機能)が入っています。
「じゃあ放置しても自動で消してくれるのでは?」と思いきや、初期設定(デフォルト)のままだと以下のような「運用の罠」が潜んでいます。

1. 圧縮ログ(.gz や .1)が何世代も残り続ける

logrotate は過去のログを syslog.1mail.log.2.gz のように番号や圧縮ファイルで残しますが、保持世代数が多く設定されていると、古いログがいつまでもディスクを圧迫します。

2. Journald(バイナリログ)の上限が開放されている

systemd が管理する journald は、テキストではなくバイナリ形式で高速にログを記録しますが、デフォルトでは「ディスク容量の最大10%まで使ってよい」という大食い設定になっています。数GB規模まで膨らむ最大の犯人はだいたいこれです。

3. エラー連発時に一夜で数GB吐き出す

アプリやスクリプトがループ処理でエラーを連投すると、たった1夜で数GB〜十数GBのログが書き込まれ、ストレージを食い尽くします。

🛡️ ログ肥大化を永久に防ぐ「3重の自動防御陣」

これらを防止し、今後二度と /var/log の容量に悩まされないための設定を3ステップで仕込みます。

🧹 STEP 1:Journaldの最大上限を「200MB」に固定する

まずは、無制限に膨らみやすい journald(バイナリログ)に絶対的な上限サイズを設定します。
設定ファイルを開きます。 sudo nano /etc/systemd/journald.conf
ファイル内の [Journal] セクションにある以下の行を探し、コメントアウト(#)を外して上限値を指定します。

Plaintext
[Journal]
SystemMaxUse=200M

※「200M」と指定しておけば、ログが200MBを超えた瞬間に、一番古いログから全自動で削除・上書きしてくれます。
設定を保存して閉じたら、サービスを再起動して反映させます。 sudo systemctl restart systemd-journald

🔄 STEP 2:logrotate の保持世代数を「2世代」に絞る

次に、syslogmail.log などのテキストログの保持ルールを変更します。デフォルトの4週間保持から「2世代(2回分)」まで縮小します。
設定ファイルを開きます。 sudo nano /etc/logrotate.conf
ファイル内の以下の項目を書き換えます。

Plaintext
# ログ保持世代数を「2」に変更(古いものは自動削除)
# Change the log retention count to "2" (older logs will be automatically deleted)
rotate 2

# 過去ログを圧縮して容量を節約
# Compress old log files to save disk space
compress

これで、過去のログが何世代も無限に積み上がるのを防げます。

⏰ STEP 3:月1回、ゴミログを全自動で一括掃除するCronを仕込む

設定から漏れて放置されたサードパーティ製アプリが、変な場所に .gz ログを溜め込むケースもあります。 万が一に備え、「毎月1日の深夜に、古い圧縮ログ(.gz)や世代ログ(.1など)を全自動で一括削除するクリーンアップタスク」 を Cron に登録しておきます。
root の crontab を開きます。 sudo crontab -e
ファイルの最下行に以下の1行を追記します。

Plaintext
# 毎月1日の午前3時に、古い圧縮ログ(.gz / .1等)を完全削除してディスクをクリーンに保つ
# Permanently delete old compressed logs (.gz / .1, etc.) at 3:00 AM on the first day of every month to keep the disk clean
0 3 1 * * /usr/bin/find /var/log -type f \( -name "*.gz" -o -name "*.[0-9]" \) -delete > /dev/null 2>&1

💡 今すぐ手動で数GBの空きを作る緊急避難コマンド

「設定はわかったけど、今まさに /var/log が3GB超えててヤバい!」という場合は、以下のコマンドを実行すれば即座に容量が解放されます。

1. 過去の古い圧縮ログ・世代ログを一括削除(安全)

Bash
sudo rm -f /var/log/*.gz /var/log/*.[0-9] /var/log/*/*.[0-9] /var/log/*/*.gz

過去のバックアップログを消すだけなので、稼働中のシステムには一切影響しません。

2. Journalログを即座に100MBまで縮小

Bash
sudo journalctl --vacuum-size=100M

これだけで、数GBあった /var/log が一瞬で数百MBまでスリム化します!

🏁 まとめ:構築と同じくらい「メンテの自動化」がインフラの肝

  1. journald.conf で上限(200M)を設定する
  2. logrotate.conf で保持世代数(rotate 2)を減らす
  3. cron で古い .gz ログの定期削除を自動化する

インフラ構築の初期は「サービスが無事に動いたかどうか」にばかり意識がいきがちですが、本当に優秀なサーバーとは「運用者が存在を忘れていても勝手に綺麗さを保ち、何年間も落ちずに動き続けるサーバー」です。 最初にこの3ステップを仕込んでおくだけで、「ある日突然ストレージが100%になってサーバーがクラッシュする」というトラブルを未然に防ぎ、ストレスフリーなサーバー運用が実現できます。 まだ設定していない方は、ぜひ今すぐターミナルを開いてコマンドを打ち込んでおきましょう!

コメント

タイトルとURLをコピーしました