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 … ログローテーション実施後に実行される部分。
    【今回の最重要ポイント】
    プロセスID nginx.pid が存在しなければ、プロセスに USR1 シグナルを送ってログファイルを開き直す設定としている。
    HUP シグナルを送るとプロセスが再起動してしまう(意図的に再起動させたい場合だけ HUP シグナルを送る)

4. 確認

後は、日が経過するのを待ち、ログがローテーションされているか確認する。
強制的にログローテーションを試行してみたいのなら、以下のようなコマンドを実行する。
(但し、ローテーションのタイミングによってはうまく機能しないので、失敗したと勘違いしないこと)

# logrotate -df /etc/logrotate.d/nginx
  • オプション d は、デバッグモード(詳細を出力)
  • オプション f は、ログローテーションの強制実行

5. 参考サイト


これで、他の各種サーバのログ同様に Nginx のログもローテーションするようになりました。

以上。





 

Sponsored Link

 

Comments