nginx 本身不支持按文件大小自动轮转日志,需借助 logrotate 实现;典型配置指定 size 100m、rotate 7,并通过 postrotate 发送 usr1 信号通知 nginx 重新打开日志文件。

Nginx 本身不支持按文件大小自动轮转日志,需借助外部工具(如 logrotate)配合配置实现。
使用 logrotate 按大小切割 Nginx 日志
logrotate 是 Linux 系统中广泛使用的日志轮转工具,支持按大小、时间或两者结合触发切割。Nginx 日志分割最常用且稳定的方式就是通过它实现。
- 确认系统已安装 logrotate(大多数 Linux 发行版默认自带)
- 编辑或新建配置文件,例如 /etc/logrotate.d/nginx
- 在其中指定 Nginx 日志路径、切割条件和 postrotate 脚本(用于通知 Nginx 重新打开日志文件)
logrotate 配置示例(按大小触发)
以下是一个典型配置,将 access.log 按 100MB 切割,保留 7 个历史文件:
/var/log/nginx/access.log {
size 100M
rotate 7
missingok
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
}
注意:USR1 信号会通知 Nginx 关闭当前日志文件并重新打开(即新建 access.log),这是关键步骤;若未发送该信号,Nginx 仍会往旧文件写入。
验证与调试 logrotate
配置完成后建议手动测试,避免上线后出错:
- 运行 logrotate -d /etc/logrotate.d/nginx 查看模拟执行过程(-d 表示 debug 模式)
- 用 logrotate -f /etc/logrotate.d/nginx 强制立即执行一次轮转
- 检查 /var/log/nginx/ 目录下是否生成了 access.log.1 等归档文件,并确认新日志是否正常写入 access.log
- 查看 nginx.pid 路径是否与实际一致(可通过 ps aux | grep nginx 或 nginx -t -v 确认)
替代方案:用脚本+定时任务(不推荐)
虽然可用 shell 脚本配合 cron 实现类似功能,但 logrotate 更健壮、支持压缩、校验、邮件通知等特性,且已深度集成于系统日志管理生态。除非有特殊定制需求,否则无需自行开发轮转逻辑。











