向Nginx发送USR1信号以重新打开日志
USR1 信号是什么?
kill 命令是一种可以发送到进程的信号之一。
信号中比较著名的有 -9 (或者 -SIGKILL)、-15 (或者 -SIGTERM),但是 USR1 是一种用户自定义的信号。当接收到该信号时,进程的行为可以由应用程序自由设置。
根据nginx官方文档的说明,发送该信号会重新获取日志文件。
$ 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
主进程正在重新获取新的日志文件,但工作进程仍然保持着旧的日志文件。
在搜索”nginx usr1 not working”附近会有很多答案出现,但出乎意料的是找不到这个答案,所以我在这里写下来。