向 nginx master 进程发送 usr1 信号可触发所有 worker 进程关闭当前日志文件描述符并以相同路径名重新打开,从而实现多进程下安全、原子的日志轮转;该操作必须作用于 master 进程,常配合 logrotate 使用以确保无竞态、无丢失。

向 Nginx Master 进程发送 USR1 信号以重新打开日志文件,本质是触发所有 worker 进程关闭当前日志文件描述符,并用相同路径名重新打开——这是实现多进程下安全日志轮转的关键一步。操作本身不复杂,但必须确保信号发给 master 进程,且路径、权限、时机都正确。
确认 Master 进程 PID
先获取正在运行的 Nginx master 进程 ID。最可靠方式是读取配置中指定的 pid 文件:
- 默认路径为
/usr/local/nginx/logs/nginx.pid(源码安装)或/var/run/nginx.pid(包管理安装) - 检查配置是否明确设置了 pid 指令:
pid /var/run/nginx.pid; - 执行
cat /var/run/nginx.pid,输出应为一个纯数字(如12345) - 也可用
ps aux | grep "nginx: master"辅助验证
使用 nginx -s reopen(推荐)
这是最简洁、最不易出错的方式,Nginx 自动读取 pid 文件并发送 USR1:
-
nginx -s reopen—— 要求 nginx 可执行文件在 PATH 中,且能读取 pid 文件 - 若 pid 文件不在默认位置,需先确保配置中
pid指令已设置,并重启过 Nginx 使新路径生效 - 执行后无输出即表示成功;失败时会提示类似
nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file)
手动用 kill 发送 USR1
适用于调试或脚本中需显式控制的场景:
kill -USR1 $(cat /var/run/nginx.pid)- 等价写法:
kill -10 $(cat /var/run/nginx.pid)(USR1 对应信号编号 10) - 务必避免对 worker 进程 PID 执行该命令——它无效,也不被设计支持
- 若提示
Permission denied,说明执行用户无权向该进程发信号(常见于非 root 用户操作 root 启动的 Nginx)
配合 logrotate 实现自动滚动
生产环境几乎总是搭配 logrotate 使用,确保原子性与可靠性:
- logrotate 配置中,在
postrotate段调用nginx -s reopen或kill -USR1 - 典型片段:
/var/log/nginx/*.log {
daily
missingok
rotate 30
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
} - 关键点:logrotate 先 rename 日志(如
access.log → access.log.1),再发 USR1;worker 重开时写入的是新空文件access.log,无竞态、无丢失











