【WordOps/Ubuntu】 放っておくとディスクを食い潰す!Nginx・WordOpsのログを自動圧縮・世代管理する完全ガイド

この記事は約10分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

「UbuntuでWordOpsを使ってサイトを運用し始めて、しばらく経つけど順調!」 ……と安心していませんか?

実は、何も設定せずにサーバーを放置していると、NginxやWordOpsが吐き出す「アクセスログ」や「エラーログ」が日に日に肥大化し、最悪の場合はディスク容量を完全に食いつぶしてサーバーが突然クラッシュしてしまうことがあります。
さらに、ログが肥大化するとFail2banなどのセキュリティツールの動作が重くなり、サイトのレスポンス悪化を引き起こす原因にも……。

「でも、手動で定期的にログを消すなんて面倒くさい……😖💦」

ご安心ください!この記事では、ログの「自動圧縮」と「世代管理(古いログの自動削除)」を仕組み化し、サーバーを放置しても快適・安全に保つための設定手順を分かりやすく解説します。
単にコピペで使える設定コードを載せるだけでなく、「なぜその一行を書くのか」「各パラメータがどんな意味を持つのか」という解説もバッチリ盛り込みました。
誤って大事なファイルを消さないための安全な事前テスト(dry-run)の方法までセットで紹介しますので、仕組みをしっかり理解しながら、一緒に設定を済ませておきましょう!

1. 放置するとヤバい!ログ肥大化が引き起こす3つのトラブル

WordOpsやUbuntuでWebサイトを構築すると、標準でNginxなどのWebサーバーが稼働します。Nginxはアクセスがあるたびに「いつ、誰が、どのページにアクセスしたか」をログファイル(access.logerror.log)に記録し続けます。
このログ機能、アクセス解析やセキュリティ対策には欠かせない存在ですが、何もしないとファイルサイズが無制限に大きくなり続けるという罠があります。
ログを放置することで発生する主なトラブルは、以下の3点です。

① ディスク容量100%でサーバーやデータベースが突然停止

最も多い事故がこれです。ディスク容量が100%に達すると、新しいデータを書き込めなくなります。
すると、WordPressのデータベース(MySQL/MariaDB)がクラッシュしたり、Nginx自体が立ち上がらなくなったりして、Webサイトが完全に閲覧不能(ダウン)になります。

② ログ検索・パース処理が重くなりFail2ban等の動作に支障

WordOpsではセキュリティ対策として「Fail2ban(不正アクセスを自動ブロックするツール)」などが導入されています。
Fail2banはアクセスログをリアルタイムで監視・読み込み(パース)しているため、ログファイルが数GB単位まで巨大化するとCPUやメモリを激しく消費し、サーバー全体の動作が重くなってしまいます。

③ 必要な時の障害調査(トラブルシューティング)が難航

「サイトでエラーが発生したから原因を調べたい」と思ったとき、数千万行もある巨大な単一テキストファイルから特定のログを探し出すのは至難の業です。
日ごとにファイルを分割・圧縮(世代管理)しておけば、目的の日のログだけをサクッと確認できるようになります。

2. ログ自動圧縮&世代管理の全体像(どうやって仕組み化する?)

「ログの自動圧縮や世代管理って、特別なスクリプトを書かないといけないの?」と思うかもしれませんが、その必要はありません。
UbuntuなどのLinux系OSには、標準で 「logrotate(ログローテーション)」 という強力な仕組みが備わっています。

logrotateがやってくれること

  1. ローテーション(世代交代):
    指定した周期(毎日・毎週など)で、現在のログファイルを別の名前にリネームして新しい空ログを作成する。
  2. 圧縮(gzip):
    過去のログファイルを自動的に .gz 形式へ圧縮し、ディスク容量を数分の一〜数十分の一に軽量化する。
  3. 世代管理(自動削除):
    設定した保存期間(例:7世代分、14日分など)を超えた古いログを自動で削除する。

今回は、この logrotate の仕組みを使って、WordOpsやNginxのログをスマートに管理する設定ファイルを作成していきます。

3. 【実践】Nginx・WordOps用の設定コードと書き方解説

それでは実際に設定ファイルを作成していきましょう。

設定ファイルの作成・編集

Ubuntuでは /etc/logrotate.d/ というディレクトリ内に設定ファイルを置くことで、自動的に定期実行されるようになります。

まずはターミナルで以下のコマンドを実行し、Nginx/WordOps用の設定ファイルを作成(編集)します。

Bash
sudo nano /etc/logrotate.d/nginx-wordops

コピペでOK!設定コード

ファイルが開いたら、以下の設定内容をそのまま貼り付けて保存(Ctrl + OEnterCtrl + X)してください。

Plaintext
/var/log/nginx/*.log /var/log/nginx/*/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript
}

【徹底解説】各パラメータ(一行一行)の意味と役割

「コピペしたけど、結局なにが書いてあるの?」を解消するために、主要なパラメータの意味を詳しく解説します!ここを理解しておくと、自分のサーバー環境に合わせてカスタマイズもできるようになります。

設定項目(パラメータ)役割・意味なぜこの設定にするの?
/var/log/nginx/*.log ...対象となるログファイルのパスを指定。Nginx直下だけでなく、WordOpsで作成した各サイト(サブディレクトリ)のログも一括で対象にします。
daily毎日ローテーションを実行する。アクセスが多いサイトでもログが肥大化する前に毎日リセットするため。(週単位なら weekly
missingokログファイルが存在しなくてもエラーを出さない。サイト削除などでログが見つからなくても、処理を途中で止めずに正常終了させるため。
rotate 1414世代(14日分) 保存する。15日以上前の古いログは自動削除されます。ディスク容量と過去ログの確認期間のバランスが良い設定です。
compress過去のログを gzip自動圧縮する。テキスト形式のログは圧縮率が高く、容量を約80〜90%カットできるため必須の設定です!
delaycompress1世代前(昨日分)のログ圧縮を一日遅らせるローテーション直後はまだNginxが古いファイルに書き込んでいる可能性があるため、安全策として最新の過去ログのみ非圧縮で残します。
notifemptyログが空(0バイト)ならローテーションしないアクセスがないサイトの無駄なファイル生成を防ぎます。
create 0640 www-data adm新しい空ログを作成する際の「権限・所有者・グループ」。Nginx(www-data)が書き込める適切なセキュリティ権限で新規作成します。
sharedscripts複数のログがあっても、後述のスクリプトを1回だけ実行する。ログファイルごとにNginxへシグナルを送ると負荷がかかるため、まとめて1回で処理します。
postrotate ~ endscriptローテーション完了後に実行するコマンドkill -USR1 を送ることで、Nginxに「ログファイルを新しく切り替えたよ!」と通知し、新しいファイルへ書き込み先をスムーズに移行させます。

4. 設定に失敗しないための「事前テスト(dry-run)」手順

設定ファイルの作成が終わったら、いきなり本番運用するのではなく「正しく動作するか」を必ず事前テストしておきましょう。

設定ファイルの記述ミス(タイポなど)があると、ログがローテーションされずに放置されたり、最悪の場合エラーを出してログの書き込みが止まってしまう原因になります。

テストコマンド(dry-run)の実行

ターミナルで以下のコマンドを実行します。

Bash
sudo logrotate -d /etc/logrotate.d/nginx-wordops
  • -d(または --debug)オプションの意味
    デバッグ(試行)モードで実行します。実際にはファイルの移動や圧縮、削除を行わず、「もし実行したらどうなるか」のシミュレーション結果を表示してくれます。

確認するポイント

コマンドを実行すると画面にズラッと処理ログが表示されます。以下の点を確認してください。

  1. エラーメッセージが出ないか error: から始まる行がなければ記述文法(構文)は問題ありません。
  2. 対象ログファイルが認識されているか reading config file /etc/logrotate.d/nginx-wordops のあとに、対象のログファイルパスが正しく読み込まれているか確認します。
  3. ローテーション対象かの判定 considering log ... の部分で、各ログが処理対象としてチェックされているかが分かります。

問題がなさそうであれば、これで設定は完了です!翌日以降、cron(自動スケジューラー)によって自動でこの設定が実行されるようになります。

テスト後に手動で「今すぐ本番実行」したい場合

「デバッグテストもOKだったし、溜まりに溜まった今のログを今すぐ手動でローテーション&圧縮してディスク容量を空けたい!」という場合は、以下のコマンドを実行します。

Bash
sudo logrotate -f /etc/logrotate.d/nginx-wordops
  • -f(または --force)オプションの意味強制実行(Force)モードです。本来は「1日経過していない」などの理由でスキップされるログであっても、強制的に今すぐローテーションと圧縮を実行します。

実行後に /var/log/nginx/ を確認して、.gz ファイルが作成されていれば本番実行も大成功です!

【放置でOK】自動実行(cron)の仕組み

手動実行をしなくても、Linuxでは標準で毎日決まった時間(Ubuntuでは通常深夜3時〜6時頃)に cron という自動スケジューラーが logrotate を裏で自動実行してくれます。

そのため、設定ファイルを置いて -d のデバッグテストが成功していれば、あとは何もせず放置しておくだけで毎日自動で本番処理が走るようになります!

5. まとめ

今回は、WordOps(Ubuntu)環境で肥大化しやすいNginxのログファイルを、logrotateを使って自動圧縮&世代管理する手順と設定値の意味を解説しました。

最後に、今回設定したポイントを振り返っておきましょう。

  • ログ放置のリスク:
    ディスク容量100%によるサーバー停止やFail2banの動作遅延を引き起こす。
  • logrotateの活用:
    標準ツールを使い「毎日ローテーション」「14世代保存」「gzip圧縮」を仕組み化。
  • パラメータの意味を知る:
    dailycompressなど、役割を理解することで自社・自身の環境に合わせたカスタマイズが可能になる。
  • 事前のテスト実行:
    -d オプションで安全に動作確認を行ってから運用を開始する。

サーバー運用において、ログ管理は「地味だけど絶対に外せない必須の保守作業」です。

一度設定してしまえば、あとはOSが全自動でクリーンな状態を保ち続けてくれます。まだ設定していない方は、ぜひこの記事を参考にサクッと設定を済ませておいてくださいね!

コメント

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