Edited at

nginx に USR1 シグナルを送ってログを開き直す

More than 3 years have passed since last update.


USR1 シグナルとは

kill コマンドでプロセスに送信できるシグナルの一つです。

シグナルでは -9 (or -SIGKILL), -15 (or -SIGTERM) あたりが有名ですが、 USR1USeR defined なシグナルです。このシグナルを受けた時のプロセスの挙動は、アプリケーションが自由に設定する事ができます。

nginx では 公式ドキュメント にある通り、このシグナルを送信するとログファイルを再度掴み直してくれます。


使用例1

$ sudo kill -USR1 `pgrep nginx`



注意点

ただし一つ注意点が。

ログを格納しているディレクトリの権限を 755 にしておく必要があります。

# default

$ ls -la /var/log/
..
drwxr-x--- 2 www-data adm 4096 Jul 12 06:38 nginx/
..
$ sudo chmod 755 /var/log/nginx
$ ls -la /var/log/
..
drwxr-xr-x 2 www-data adm 4096 Jul 12 06:38 nginx/
..

第三者に実行権限を付与する所がポイントです。

理由ですが、 nginx の worker process は ubuntu では nobody というユーザで実行されています。

このユーザは ubuntu 側で用意された、権限をコントロールされたユーザ です。例えば nginx プロセスが悪意のあるユーザに乗っ取られても被害が最小限に抑えられるようになっています。

第三者に実行権限を付与せずにログローテーション&USR1を送信した場合の結果がこちらです。

$ for pid in `pgrep nginx`; do sudo lsof -p $pid | grep log;done;                                                                                                                                                                   

nginx 31014 root 2w REG 202,1 0 160375 /var/log/nginx/error.log
nginx 31014 root 5w REG 202,1 0 160366 /var/log/nginx/access.log
nginx 31014 root 10w REG 202,1 0 160375 /var/log/nginx/error.log
nginx 31015 nobody 2w REG 202,1 1230 164619 /var/log/nginx/error.log-20160712
nginx 31015 nobody 4w REG 202,1 2468461 164113 /var/log/nginx/access.log-20160712
nginx 31015 nobody 5w REG 202,1 1230 164619 /var/log/nginx/error.log-20160712
nginx 31016 nobody 2w REG 202,1 1230 164619 /var/log/nginx/error.log-20160712
nginx 31016 nobody 4w REG 202,1 2468461 164113 /var/log/nginx/access.log-20160712
nginx 31016 nobody 5w REG 202,1 1230 164619 /var/log/nginx/error.log-20160712

master プロセスは新しいログファイルを掴み直していますが、 worker プロセスは依然昔のログを掴んだままになっています。

nginx usr1 not working」あたりでググるといっぱい回答が出てきますが、意外とこの回答が見つからなかったので記載しておきます。