Nginx日志无法轮转
症状
Nginx刚启动后日志记录正常,一段时间后,Nginx会把已产生的日志压缩为.gz
文件。但是一旦压缩后,就不再记录新日志到新生成的access.log
文件,但日志文件存在,里面却没有任何日志。旧的日志压缩后没有问题,自从压缩后,新的文件再也不记录新日志了(发现Nginx会很消耗内存,估计日志都存在内存里,不写文件了)。
我们的Nginx部署在k8s中,查看Nginx的配置没有发现任何问题
1 | #user nobody; |
原因
经查询资料在stackoverflow
发现了类似的问题,见链接:https://stackoverflow.com/questions/9552930/nginx-cannot-write-into-access-log
原因是当Nginx压缩文件后,需要给master进程发送USR1信号后重新打开文件。
于是查看了Nginx的进程ID为33
1 | [mwopr@k8s-opc-openapi-nginx-77787494c5-c77s8 logs]$ cat nginx.pid |
当执行重新打开log文件命令时提示没有权限
1 | [mwopr@k8s-opc-openapi-nginx-77787494c5-c77s8 logs]$ kill -USR1 33 |
这个时候恍然大悟,登陆shell的默认用户是mwopr
,没有权限执行kill
命令,需要用root
用户执行,当切换为root
用户后,执行kill
命令成功且日志可以正常写入。
原理
原文:http://nginx.org/en/docs/control.html
Nginx可以通过信号进行控制。对应Linux系统就是用kill
命令。
master进程id默认写入到/nginx/logs/nginx.pid
文件中。文件也可以在nginx.conf
文件中指定。master进程支持以下信号:
1 | kill -TERM pid # 快速停止master进程。 |
每个worker进程也可以接收信号:
1 | kill -TERM pid # 快速关闭worker进程 |
日志轮转
- 重命名log文件。
- 给master进程发送USR1信号。
- 重新打开文件。
Rotating Log-files
In order to rotate log files, they need to be renamed first. After that USR1 signal should be sent to the master process. The master process will then re-open all currently open log files and assign them an unprivileged user under which the worker processes are running, as an owner. After successful re-opening, the master process closes all open files and sends the message to worker process to ask them to re-open files. Worker processes also open new files and close old files right away. As a result, old files are almost immediately available for post processing, such as compression.