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系统中,也很多预定义好的信号,像SIGHUPUSR1是用户自定义信号。可以理解为:进程自己定义接到这个信号该干嘛(也就是进程编写者自己确定收到这个信号干嘛还是什么都不做都行,完全交给开发人员自己决定)。而在nginx中,它自己编写了代码处理当我接到USR1信号的时候,让nginx重新打开日志文件。具体原理如下:

  1. nginx 的主进程收到USR1信号,会重新打开日志文件(以nginx配置文件中的日志名称命名,就是配置文件中access_log项所设置的值,如果文件不存在,会自动创建一个新的文件xxx.log)。
  2. 然后把日志文件的拥有者改为“工作进程(worker进程)”,目的是让worker进程就具备了对日志文件的读写权限(masterworker通常以不同用户运行,所以需要改变拥有者)。
  3. nginx主进程会关闭重名的日志文件(也就是刚才使用mv命令重命名成access_${YESTERDAY}.log的文件),并通知工作进程使用新打开的日志文件(刚才主进程打开的文件access.log)。具体实现上更细化点就是,主进程把USR1信号发给workerworker接到这个信号后,会重新打开日志文件(也就是配置文件中约定的xxx.log)

所以-USR1Nginx的一个信号,那么还有哪些信号呢,这些信号有什么作用呢?总结如下: 主进程可以处理以下的信号:

信号含意
TERM, INT快速关闭
QUIT从容关闭
HUP重载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程
USR1重新打开日志文件
USR2平滑升级可执行程序
WINCH从容关闭工作进程

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

信号含意
TERM, INT快速关闭
QUIT从容关闭
USR1重新打开日志文件