Nginx信号
nginx
今天看到关于Nginx日志文件的切割,切割脚本如下:
切割Nginx日志
切割Nginx日志
nginx日志不会按时间或大小分割,会导致随着时间的推移日志越来越大,以下是通过定时脚本对日志进行分割
#!/bin/bash ## nginx 日志切割 ## Nginx 日志文件所在的目录 LOGS_PATH=/opt/nginx/logs ## 获取昨天的 yyyy-MM-dd YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) ## 移动文件 mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log ## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件 kill -USR1 $(cat /opt/nginx/logs/nginx.pid)其中的信号说明可以参考nginx信号,对其进行了更详细的解释。
另外,如果nginx部署在Linux环境,还可以使用logrotate这个工具来对日志进行定期管理。 Nginx使用logrotate轮转日志
指向原始笔记的链接
第一条命令很好理解,将当前的日志文档重命名。
第二条命令的作用是发送kill -USR1信号给Nginx的主进程号,让Nginx重新生成一个新的日志文件。
在这之前不知道kill -USR1的原理,不是很理解。
在linux系统中,linux是通过信号与”正在运行的进程”进行通信的。linux系统中,也很多预定义好的信号,像SIGHUP。USR1是用户自定义信号。可以理解为:进程自己定义接到这个信号该干嘛(也就是进程编写者自己确定收到这个信号干嘛还是什么都不做都行,完全交给开发人员自己决定)。而在nginx中,它自己编写了代码处理当我接到USR1信号的时候,让nginx重新打开日志文件。具体原理如下:
nginx的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。- 然后把日志文件的拥有者改为“工作进程(
worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(master和worker通常以不同用户运行,所以需要改变拥有者)。 nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成access_${YESTERDAY}.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件access.log)。具体实现上更细化点就是,主进程把USR1信号发给worker,worker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)
所以-USR1是Nginx的一个信号,那么还有哪些信号呢,这些信号有什么作用呢?总结如下:
主进程可以处理以下的信号:
| 信号 | 含意 |
|---|---|
| TERM, INT | 快速关闭 |
| QUIT | 从容关闭 |
| HUP | 重载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程 |
| USR1 | 重新打开日志文件 |
| USR2 | 平滑升级可执行程序 |
| WINCH | 从容关闭工作进程 |
尽管你不必自己操作工作进程,但是,它们也支持一些信号:
| 信号 | 含意 |
|---|---|
| TERM, INT | 快速关闭 |
| QUIT | 从容关闭 |
| USR1 | 重新打开日志文件 |