无需重启 Nginx 即可安全完成日志归档:① logrotate + USR1 信号(推荐),通过 postrotate 调用 kill -USR1 刷新日志句柄;② rotatelogs 管道切割,实时按时间/大小切分并命名;③ nginx -s reopen 手动触发日志重开,轻量应急。

不需要重启 Nginx,也能安全完成日志归档。核心是让 Nginx 主动“换新日志文件”,而不是靠重启来重建进程和句柄。只要正确通知它关闭旧文件、打开新文件,整个过程对请求完全无感。
用 logrotate + USR1 信号(推荐)
这是最稳妥、生产环境广泛采用的方式:
- 在 /etc/logrotate.d/nginx 中配置轮转规则,包含 daily、rotate 30、compress、create 0644 nginx nginx 等基础项
- 必须写 postrotate … endscript 段,里面执行:
kill -USR1 `cat /var/run/nginx.pid`
(确保 PID 文件路径准确;若用宝塔,路径可能是/www/server/nginx/logs/nginx.pid) - USR1 信号会触发 Nginx 主进程重新读取配置中的日志路径,以 worker 用户身份新建并打开新日志文件,同时关闭旧文件句柄
- 旧日志文件被重命名后,磁盘空间立刻可释放,不会因句柄残留而卡住
用 rotatelogs 实时管道切割(免信号、免定时)
适合希望日志名自带时间戳、且不想依赖系统 cron 或 logrotate 调度的场景:
- 修改 nginx.conf 中的 access_log 指令,改成带管道的形式:
access_log "|/usr/bin/rotatelogs -n 7 /var/log/nginx/access_%Y%m%d.log 86400" main; - rotatelogs 在后台实时接收 Nginx 输出,到达指定时间(如 86400 秒)或大小阈值时自动切分,生成
access_20260904.log这类文件 - 全程无需发送任何信号,Nginx 不感知切割动作,worker 进程持续写入管道,零中断
- 注意:确保 nginx worker 用户(如 www-data 或 nginx)对日志目录有写权限,且
rotatelogs路径可用(可用which rotatelogs确认)
手动触发 reopen(适合临时应急)
不依赖外部工具,但需你主动执行命令:
- 运行
nginx -s reopen—— 它等价于向主进程发 USR1 信号,效果一致 - 前提是 Nginx 已用
-c指定了配置路径,且配置中日志路径明确(不能是相对路径或变量未展开) - 比
nginx -s reload更轻量:不重载配置、不启停 worker,只刷新日志文件句柄 - 常用于配合自定义脚本做分钟级/小时级切割,比如先 mv 日志再执行 reopen
三种方式都不重启服务,关键区别在于触发时机和管理粒度:logrotate 适合按天归档+压缩+清理一体化;rotatelogs 更灵活支持小时/分钟命名;reopen 则最直接可控。选哪个,取决于你的运维习惯和归档需求。


















