Nginx定时进行日志切割及理论原理
|
admin
2025年9月3日 21:21
本文热度 22
|
$ vim /opt/cutnginxlog.sh
#!/bin/sh
# deanit.cn
# 自动切断nginx日志脚本
# nginx日志路径
LOGS_PATH=/var/log/nginx
TODAY=$(date -d 'today' +%Y%m%d)
# 创建当天日期目录
mkdir /var/log/nginx/$TODAY
# 移动日志并改名
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/${TODAY}/error_${TODAY}.log
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/${TODAY}/access_${TODAY}.log
# 向nginx主进程发送重新打开日志文件的信号
kill -USR1 $(cat /run/nginx.pid)
赋值权限
chmod +x /opt/cutnginxlog.sh
每天的23点59分执行脚本。将自动任务的执行日志(错误和正确的日志)自动写入cutnginxlog.log,“命令 >> 2>&1” 表示以追加方式将正确输出和错误输出都保存到同一个文件中。
echo '59 23 * * * root /opt/cutnginxlog.sh >> /opt/cutnginx.log 2>&1' >> /etc/crontab
详细解释
1. USR1 信号的作用
USR1 (User Signal 1) 是 Nginx 设计用来处理的一个自定义信号,它的唯一作用是:
通知 Nginx 主进程重新打开所有正在写入的日志文件。
当 Nginx 接收到 USR1 信号时:
● 主进程:会重新打开日志文件(相当于执行 fclose() 然后 fopen())
● 工作进程:继续正常处理请求,完全不受影响
● 当前连接:所有正在进行的 HTTP 请求/响应流程不会中断
● 新连接:正常接受和处理
2. 与其他信号的对比
3. 实际应用场景
日志切割后必须执行此命令:
# 切割日志文件
mv /var/log/nginx/access.log /var/log/nginx/access.log.old
# 创建新的空日志文件
touch /var/log/nginx/access.log
# 让 Nginx 开始向新文件写入日志(不影响业务)
kill -USR1 $(cat /run/nginx.pid)
# (可选)压缩旧日志
gzip /var/log/nginx/access.log.old
如果不执行这个命令,Nginx 会继续向已经被移动的旧文件描述符写入日志(通过 lsof 命令可以看到),虽然数据实际上会写到移动后的文件中,但这不是标准做法,而且可能造成混乱。
4. 验证方法
你可以通过以下方式验证不会中断业务:
方法一:持续发送请求的同时执行命令
在一个终端持续访问网站
while true; do curl -s http://your-site.com > /dev/null && echo -n "."; sleep 0.1; done
# 在另一个终端执行 USR1 信号
kill -USR1 $(cat /run/nginx.pid)
你会发现点的输出完全不会中断。
方法二:查看 Nginx 状态
# 执行前查看工作进程
ps aux | grep nginx
# 执行 USR1 信号
kill -USR1 $(cat /run/nginx.pid)
# 执行后再次查看,进程ID完全不变
ps aux | grep nginx
方法三:监控错误日志
# 执行命令后查看 error.log,会看到这样的信息
tail -f /var/log/nginx/error.log
# 输出:2023/10/27 12:00:00 [notice] 1234#1234: signal 10 (SIGUSR1) received, reopening logs
5. 底层原理
Nginx 采用主进程+工作进程的多进程模型:
● 主进程:以 root 身份运行,负责管理、监控
● 工作进程:以 www-data/nginx 身份运行,实际处理请求
当主进程收到 USR1 信号时,它只是重新打开自己管理的日志文件句柄,然后通过进程间通信通知工作进程也重新打开日志文件。工作进程在处理完当前请求后才会执行这个操作,因此完全不会影响请求处理。
总结
kill -USR1 $(cat /run/nginx.pid) 是一个绝对安全的操作:
● ✅ 不会中断任何正在处理的请求
● ✅ 不会断开任何现有连接
● ✅ 不会拒绝任何新连接
● ✅ 不会重启任何工作进程
● ✅ 是日志切割流程中的必需步骤
你可以放心地在任何时间执行这个命令,包括业务高峰期。
阅读原文:原文链接
该文章在 2025/9/4 14:38:45 编辑过