向Nginx主进程发送USR1信号(或执行nginx -s reopen)可实现日志平滑切割,需先重命名旧日志再发信号,确保不中断服务且无日志丢失。

在 Nginx 中,使用 kill 命令向主进程发送 USR1 信号,是实现日志文件平滑切割(即不中断服务、不丢失请求日志)的标准方式。关键在于:必须向 Nginx 主进程(master process) 发送信号,而不是工作进程(worker processes)。
确认 Nginx 主进程 PID
主进程 PID 通常保存在 Nginx 配置中指定的 pid 文件里(默认如 /var/run/nginx.pid)。可直接读取:
cat /var/run/nginx.pid
或用命令查找主进程(确保只选中带 master process 的那行):
ps aux | grep "nginx: master process"
发送 USR1 信号触发日志重开
执行以下任一命令即可:
kill -USR1 $(cat /var/run/nginx.pid)kill -SIGUSR1 $(cat /var/run/nginx.pid)-
nginx -s reopen(这是更推荐的封装方式,底层等价于发送 USR1)
注意:nginx -s reopen 更安全,它会自动读取 pid 文件并发送信号,避免手动出错。
日志切割生效的前提条件
USR1 信号本身不会自动重命名旧日志文件,它只是通知 Nginx:“请关闭当前打开的日志文件句柄,并按配置中的路径重新打开新的日志文件”。因此,实际完成“切割”需配合外部操作:
- 在发送 USR1 前,先用
mv或logrotate将当前日志(如access.log)重命名(如access.log.20240520) - 再发 USR1,Nginx 会立即打开新的
access.log写入新请求日志 - 这样就实现了零丢失、不间断的日志轮转
验证是否成功
检查日志文件时间戳和大小变化:
- 原日志文件(如
access.log)停止增长,最后修改时间停留在发送 USR1 时刻 - 新日志文件(同名)出现,且有新写入内容
- 用
lsof -p $(cat /var/run/nginx.pid) | grep log可看到主进程已不再持有旧日志文件句柄











