新規ログファイルは初日にlogrotateされない?

CentOSのnginxをいじっていてログファイルの名前を変えたらローテートされていないことに気づきました。CentOSのログのローテートのイメージです。

初め
access.log
error.log

翌日
access.log
access.log-20210102
error.log
error.log-20210102

翌々日
access.log
access.log-20210102.gz
access.log-20210103
error.log
error.log-20210102.gz
error.log-20210103

dailyでローテートするようにしているのですが翌日に確認するとローテートされていません。。logrotateのコンフィグファイルの設定です。


/var/log/nginx/*.log {
        daily
        missingok
        rotate 5
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

error.logがもともとあったファイルでdumy_access.logとdumy_error.logが新しく作成されたログファイルです。以下に今回起きた状況を書くと、、

初め
dumy_access.log
dumy_error.log
error.log
error.log-20210103

翌日
dumy_access.log
dumy_error.log
error.log
error.log-20210103.gz
error.log-20210104

error.logはちゃんとローテートされているのですが、新規ログファイルのdumy_access.logとdumy_error.logがローテートされていないです。dumy_access.logとdumy_error.logがログファイルとして認識されていないんじゃないか?と思い調べてみたところ、原因は別にありました。

logrotateはcronでlogrotateコマンドを実行しているので /etc/cron.daily 配下のlogrotateシェルを見てみます。


#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

logrotateコマンドのパラメータにlogrotate.statusファイルとlogrotate.confファイルを与えています。このうち、logrotate.statusには前回ログローテートを行った時刻を記載しているとのこと。logrotate.statusを見てみました。


# grep nginx /var/lib/logrotate/logrotate.status
"/var/log/nginx/error.log" 2021-1-4-3:44:1
"/var/log/nginx/dumy_error.log" 2021-1-4-3:0:0
"/var/log/nginx/dumy_access.log" 2021-1-4-3:0:0

dumy_error.logとdumy_access.logの記載があるのでログファイルとしては認識してるようです。ではなぜローテートされなかったかというと、新規ログファイルの場合はlogrotate.statusに何も記載がないわけで、初回処理時に新規ログファイルの情報をlogrotate.statusに書き込むようです。初回の処理としてはそれで終わりです。次回(翌日)のlogrotateが動くときにlogrotate.statusに記載のある時刻を元に1日後(daily)、1週間後(weekly)、1ヶ月後(monthly)のローテートを行うようです。なので、明日、もう一度ローテートがされているか確認することにしました。

[広告]

で、、翌日。。

ちゃんとローテートされてました。こんな感じです。

dumy_access.log
dumy_access.log-20210105
dumy_error.log
dumy_error.log-20210105
error.log
error.log-20210103.gz
error.log-20210104.gz
error.log-20210105

logrotate.statusも更新されていました。ということで、logrotateは初日はローテートをしないということを知りました。

ちなみにですが、logrotateのコンフィグファイルでdaily指定しているものが毎日ローテートされているか見てみると、そうでないものがありました。これはログファイルがゼロバイトのためのようです。ゼロバイトのログファイルもローテート対象にするにはコンフィグファイルにifemptyの指定をすればローテート対象になるようです。

なお、ubuntuの場合はlogrotate.statusではなくstatusという名前のファイルです。参考までにubuntuのlogrotateシェルを載せておきます。


#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

CentOSとはちょっと違うのですね。。

nginxの公開ディレクトリの設定方法

CentOS 7 にインストールしたnginxに公開ディレクトリの設定をしてみます。nginxは初期状態のままです。

まず、公開するディレクトリを作成します。/var/www/html 配下にdumyというディレクトリを作成して、そこにhtmlファイルを格納するようにします。rootユーザーで作業します。

公開用のdumyディレクトリの作成をします。

# cd /var/www/html
# mkdir dumy

dumyディレクトリの所有者を変更します。既存のユーザーであれば何でも良いです。nginxが参照できるようにディレクトリの権限を775とします。

# chown usr:usr dumy
# chmod 775 dumy

lsコマンドで確認します。

# ls -l
drwxrwxr-x 2 usr usr 4096 1月 2 20:56 dumy

dumyディレクトリ配下にindex.htmlファイルを作成します。

# cd dumy
# vi index.html

index.htmlに記載する内容です。


<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META name="viewport" content="width=device-width,initial-scale=1">
<TITLE>TEST PAGE</TITLE>
</HEAD>
<BODY>
これはテストページです。
</BODY>
</HTML>

index.htmlファイルも所有者を変更しておきます。

# chown usr:usr index.html
# ls -l
-rw-r--r-- 1 usr usr 262 1月 2 20:56 index.html

公開用ディレクトリとindex.htmlファイルの作成ができましたので、nginxがこのディレクトリを公開するようにします。
/etc/nginx/conf.d 配下のdefault.confを修正します。

# cd /etc/nginx/conf.d
# vi default.conf

修正箇所はrootディレクティブです。太字のように修正をします。


修正前
location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}
 ↓
修正後
location / {
    root   /var/www/html/dumy;
    index  index.html index.htm;
}

修正が終わったらコンフィグテストをします。

# nginx -t

「nginx.conf syntax is ok」および「nginx.conf test is successful」と表示されればOKです。

nginxを起動します。

# systemctl start nginx

ウェブブラウザに「http://nginxのIPアドレス/」を入力して以下の画面が表示されれば成功です。

もしうまくいかない場合はnginxのログを見てみましょう。ログは初期状態だと /var/log/nginx 配下に出力されます。access.logとerror.logがあるので、サーバーまで通信が届いているかはaccess.logで確認して、通信が届いている場合はerror.logでエラー内容を確認します。初期状態のログ出力先は /etc/nginx/nginx.conf ファイルに記載されています。