以前、軽量 Web サーバ Nginx を CentOS にインストールしました。
しかし、ログローテーションの設定をしていなかったため、知らないうちにログが肥大化していました。(幸い、サーバにはまだ影響が出ていませんでしたが)
以下、Nginx のログをログローテーションする設定についてです。
0. 前提条件
- OS は CentOS 6.3(32bit) を想定。(ディストリビューションが異なってもそれほど違いはないかと思う)
cron
による処理ではなくlogrotate
による処理を行う。- CentOS に
logrotate
がインストール済みで、/etc/cron.daily
で毎日作動するような設定になっている。
1. 事前情報
まず、 CentOS のlogrotate
について、以下のことを理解しておく。
- 設定ファイル
/etc/logrotate.conf
が/etc/logrotate.d
ディレクトリ内の各種設定ファイルをインクルードする設定になっている。 - 全てに共通する設定は
/etc/logrotate.conf
に記述しておけばよい。
以下は当方の /etc/logrotate.conf
。(設定項目の説明は後述)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
2. Nginx 用の設定ファイル作成
Nginx のログローテション設定ファイル /etc/logrotate.d/nginx
を作成する。(設定項目の説明は後述)
以下は当方の例で、 /etc/logrotate.conf
に設定済みの項目は省略している。(わかりやすくするために再設定してもよい)
File: /etc/logrotate.d/nginx
1 /var/log/nginx/*.log {
2 missingok
3 notifempty
4 sharedscrits
5 postrotate
6 [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
7 endscript
8 }
3. 設定内容について
/etc/logrotate.conf
や /etc/logrotate.d/nginx
内で設定して項目等について説明する。
weekly
… ログローテーションを週毎に行う。rotate 4
… ログを4世代残す。create
… ログローテーション(リネーム)後、ログファイルを作成する。dateext
… ローテーションされたログファイルのサフィックスを日付形式にする。compress
… ローテーションされたログファイルを圧縮する。(コメントアウトで圧縮しない)mmissingok
… ログファイルが見つからなくてもエラーにしない。notifempty
… ログファイルが空ならローテーションしない。sharedscripts
… 以降に記述された処理をワイルドカードの指定に関わらず、1度だけ実行するという宣言文。postrotate
-endscript
… ログローテーション実施後に実行される部分。
【今回の最重要ポイント】
プロセスIDnginx.pid
が存在しなければ、プロセスにUSR1
シグナルを送ってログファイルを開き直す設定としている。
HUP
シグナルを送るとプロセスが再起動してしまう(意図的に再起動させたい場合だけHUP
シグナルを送る)
4. 確認
後は、日が経過するのを待ち、ログがローテーションされているか確認する。
強制的にログローテーションを試行してみたいのなら、以下のようなコマンドを実行する。
(但し、ローテーションのタイミングによってはうまく機能しないので、失敗したと勘違いしないこと)
1
|
|
- オプション
d
は、デバッグモード(詳細を出力) - オプション
f
は、ログローテーションの強制実行
5. 参考サイト
これで、他の各種サーバのログ同様に Nginx のログもローテーションするようになりました。
以上。