在 Debian 上,Nginx 日志轮转通常通过 logrotate 来实现。下面从「原理 → 默认配置 → 自定义 → 手动测试」一步步说明。
Debian 安装 Nginx 后,会自动安装 logrotate,并提供一个配置文件:
/etc/logrotate.d/nginx
该文件由 logrotate 每天定时执行(由 /etc/cron.daily/logrotate 触发)。
查看默认配置:
cat /etc/logrotate.d/nginx
典型内容如下(不同版本略有差异):
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
| 参数 | 含义 |
|---|---|
| daily | 每天轮转 |
| rotate 14 | 保留 14 个旧日志 |
| compress | 压缩旧日志 |
| delaycompress | 延迟一次压缩(方便排查) |
| notifempty | 空日志不轮转 |
| create | 新建日志文件及权限 |
| postrotate | 通知 Nginx 重新打开日志 |
✅ 重点:
postrotate中的nginx rotate或kill -USR1是必须的,否则 Nginx 还会写旧文件。
/var/log/nginx/*.log {
size 100M
rotate 10
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl kill -s USR1 nginx
endscript
}
daily
rotate 7
/var/log/nginx/access.log {
daily
rotate 30
compress
postrotate
systemctl kill -s USR1 nginx
endscript
}
/var/log/nginx/error.log {
daily
rotate 14
compress
}
logrotate -d /etc/logrotate.d/nginx
✅ 用于检查配置是否正确(dry run)
logrotate -f /etc/logrotate.d/nginx
执行后查看:
ls -lh /var/log/nginx/
应看到类似:
access.log
access.log.1
access.log.1.gz
ls -i /var/log/nginx/access.log
轮转后 inode 改变是正常的(Nginx 已 reopen)
logrotate 是否在运行systemctl status logrotate
ls /etc/cron.daily/logrotate
确认 postrotate 里有:
systemctl kill -s USR1 nginx
或
kill -USR1 $(cat /run/nginx.pid)
如果你愿意,我可以: