最稳妥的Nginx错误日志切割方案是用logrotate配合USR1信号实现按天归档,需固定日志绝对路径、配置权限,并通过sharedscripts确保access.log和error.log共享一次USR1信号以原子性重开文件。

nginx 本身不支持自动切割错误日志(error.log),必须依赖外部工具。最稳妥、生产环境通用的做法是用 logrotate 配合 USR1 信号 实现按天归档,同时覆盖 access.log 和 error.log。
确保 nginx 日志路径固定且可写
在 /etc/nginx/nginx.conf 或 conf.d/ 下的配置中,明确写出绝对路径:
- error_log /var/log/nginx/error.log warn;
- access_log /var/log/nginx/access.log main;
不要使用变量(如 $time_iso8601)动态生成文件名;确保 /var/log/nginx/ 目录存在,且 nginx 工作用户(如 www-data 或 nginx)对该目录有读写权限。
创建 logrotate 配置文件
新建 /etc/logrotate.d/nginx(注意:不是 .conf 后缀),内容如下:
/var/log/nginx/*.log {
daily
dateext
dateyesterday
dateformat -%Y-%m-%d
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
说明:
- daily 表示每天触发轮转
- dateext + dateyesterday + dateformat 保证归档文件名为 error.log-2026-10-09 这类格式(显示“昨天”日期,语义清晰)
- sharedscripts 确保 access.log 和 error.log 共享一次 USR1 信号,避免重复发信
- postrotate 中只用 kill -USR1,不 reload 或 restart —— 这是关键,能原子性重开日志文件,不中断请求
验证与生效
配置完成后执行两步检查:
- 语法调试:logrotate -d /etc/logrotate.d/nginx(看是否报错)
- 强制执行一次:logrotate -vf /etc/logrotate.d/nginx(观察 /var/log/nginx/ 下是否生成带日期的 error.log-xxxxxx,且新 error.log 可写)
系统默认通过 /etc/cron.daily/logrotate 每日凌晨运行,无需额外加 crontab。











