Nginx日志平滑分割核心是主进程响应USR1信号关闭旧句柄并重开新文件,需满足:日志路径为绝对路径、工作进程用户对日志目录有写权限、信号发送至主进程PID;推荐用nginx -s reopen触发,并通过ls -lt、tail -f及error.log中reopening logs提示验证成功。

在 Nginx 中实现不重启服务的日志平滑分割,核心是利用其主进程对 USR1 信号 的响应机制——即触发日志文件句柄的关闭与重建,整个过程零中断、不丢日志。
必须满足的三个前提条件
若以下任一条件不满足,nginx -s reopen 或 kill -USR1 将静默失败或写入异常:
-
日志路径必须为绝对路径:配置中
access_log /var/log/nginx/access.log;不能写成access_log logs/access.log;,否则工作进程可能因目录切换导致写入失败; -
日志目录需有写权限:运行 Nginx 工作进程的用户(如
www-data或nginx)必须对/var/log/nginx/目录具有写权限,否则无法创建新日志文件; -
操作对象必须是主进程 PID:发送信号的目标只能是 master 进程(通常记录在
/var/run/nginx.pid),而非 worker 进程;可用ps aux | grep "nginx: master"确认。
两种标准触发方式
推荐优先使用封装命令,更安全且语义清晰:
-
sudo nginx -s reopen:Nginx 自带命令,自动定位主进程并发送 USR1; -
sudo kill -USR1 $(cat /var/run/nginx.pid):手动方式,适用于 PID 文件路径非默认时(如/usr/local/nginx/logs/nginx.pid)。
验证是否成功切换
执行后立即检查,确认新日志已激活:
-
ls -lt /var/log/nginx/:观察access.log和error.log的修改时间是否更新为当前时刻; -
tail -f /var/log/nginx/access.log:发起一次请求(如curl -I localhost),确认新条目实时写入; - 查看
error.log中是否出现reopening logs提示(info 级别默认记录)。
生产环境推荐自动化方案:logrotate
避免手写脚本,直接复用系统级日志管理工具:
- 在
/etc/logrotate.d/nginx中配置轮转规则,例如按天切割、保留 7 天、自动压缩; - 关键是在
postrotate段调用nginx -s reopen,确保 Nginx 接管新文件; - logrotate 默认由
/etc/cron.daily/logrotate触发,无需额外维护定时任务。


















