向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”附近会有很多答案出现,但出乎意料的是找不到这个答案,所以我在这里写下来。

广告
将在 10 秒后关闭
bannerAds