在 Debian 上,Nginx 日志切割最常用、最推荐的方式是使用系统自带的 logrotate。下面按“推荐方案 → 手动方案”来说明。
Debian 默认已安装 logrotate,Nginx 也自带配置。
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:压缩旧日志notifempty:空日志不切割postrotate:通知 Nginx 重新打开日志(关键)logrotate -d /etc/logrotate.d/nginx # 模拟执行
logrotate -f /etc/logrotate.d/nginx # 强制执行一次
logrotate 由 cron 每天执行:
/etc/cron.daily/logrotate
/var/log/nginx/*.log {
size 100M
rotate 10
compress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl kill -s USR1 nginx.service
endscript
}
⚠️ Nginx 必须收到
USR1信号才能重新写日志
mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%F)
kill -USR1 $(cat /var/run/nginx.pid)
或:
nginx -s reopen
/var/lib/logrotate/statusUSR1systemctl kill -s USR1 nginx
✅ Debian + Nginx = 直接用 logrotate
✅ 不要自己写脚本
✅ 改完配置一定 logrotate -d 测试
如果你愿意,我可以帮你写一份适合你服务器流量和磁盘的 logrotate 配置。