发送 USR1 信号可触发 Nginx 日志无损轮转,Master 进程收到后通知 Worker 关闭旧日志句柄并打开新文件,确保服务不中断、日志不丢失;KILL、TERM 等信号不具备该功能。

通过向 Nginx(或其他支持信号控制的 Web 服务器)Master 进程发送 USR1 信号,可触发日志文件的无损轮转——即不中断服务、不丢失请求日志。
为什么 USR1 是关键信号
Nginx 的 Master 进程监听 USR1 信号,收到后会指示所有 Worker 进程关闭当前打开的日志文件句柄,并按配置路径重新打开新的日志文件。由于 Worker 进程仍持续处理请求,新日志会写入新文件,旧文件可被安全归档或压缩。
注意:KILL(9)、TERM(15)等信号用于停止或重启服务,不能用于日志轮转;只有 USR1 具备此语义。
执行轮转的典型步骤
- 确认 Master 进程 PID:通常在
/var/run/nginx.pid,可用cat /var/run/nginx.pid查看 - 发送 USR1 信号:运行
kill -USR1 $(cat /var/run/nginx.pid) - 验证效果:检查日志目录下是否生成了新文件(如
access.log),原文件是否已重命名(如access.log.1或由 logrotate 管理) - 配合 logrotate 使用时,应在
logrotate配置中用postrotate段落调用该 kill 命令,确保轮转后通知 Nginx 切换句柄
常见问题与注意事项
若轮转后新日志未写入,可能原因包括:
- 权限不足:Worker 进程用户(如
www-data)对新日志路径无写权限 - 配置未生效:Nginx 配置中
access_log路径使用了相对路径或变量,导致新文件位置异常 - PID 文件错误:PID 文件内容过期或指向已退出进程,需先确认
ps aux | grep nginx中 master 进程真实 PID - SELinux/AppArmor 限制:在强制访问控制系统启用的系统上,可能拦截信号或文件操作,需检查审计日志
一个最小化 logrotate 配置示例
在 /etc/logrotate.d/nginx 中写入:
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
该配置每天轮转,保留 52 份,压缩旧日志,并在轮转完成后安全通知 Nginx 切换日志句柄。

















