Nginx - ログローテーション設定!
Updated:
以前、軽量 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
。(設定項目の説明は後述)
File: /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
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
2. Nginx 用の設定ファイル作成
Nginx のログローテション設定ファイル /etc/logrotate.d/nginx
を作成する。(設定項目の説明は後述)
以下は当方の例で、 /etc/logrotate.conf
に設定済みの項目は省略している。(わかりやすくするために再設定してもよい)
File: /etc/logrotate.d/nginx
1
2
3
4
5
6
7
8
9
/var/log/nginx/*.log {
missingok
notifempty
sharedscrits
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
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. 確認
後は、日が経過するのを待ち、ログがローテーションされているか確認する。
強制的にログローテーションを試行してみたいのなら、以下のようなコマンドを実行する。
(但し、ローテーションのタイミングによってはうまく機能しないので、失敗したと勘違いしないこと)
# logrotate -df /etc/logrotate.d/nginx
- オプション
d
は、デバッグモード(詳細を出力) - オプション
f
は、ログローテーションの強制実行
5. 参考サイト
これで、他の各種サーバのログ同様に Nginx のログもローテーションするようになりました。
以上。
Comments