在 Debian 上切割 Nginx 日志,常见且推荐的做法有 两种:
✅ 使用 logrotate(官方推荐,最常用)
✅ 使用自定义脚本 + cron(更灵活)
下面分别说明,并给出可直接使用的配置示例。
Debian 默认已安装 logrotate,Nginx 通常也会自带配置。
ls /etc/logrotate.d/nginx
内容通常类似:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1
endscript
}
| 参数 | 含义 |
|---|---|
| daily | 每天切割 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| missingok | 日志不存在不报错 |
| notifempty | 空日志不切割 |
| postrotate | 切割后执行(重载 Nginx) |
假设你只想:
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx
endscript
}
保存后测试:
logrotate -d /etc/logrotate.d/nginx
强制立即执行:
logrotate -f /etc/logrotate.d/nginx
vim /usr/local/bin/cut_nginx_log.sh
内容示例:
#!/bin/bash
LOG_PATH="/var/log/nginx"
DATE=$(date -d "yesterday" +%Y-%m-%d)
for log in access.log error.log; do
mv ${LOG_PATH}/${log} ${LOG_PATH}/${log}.${DATE}
done
# 重新打开日志文件
systemctl reload nginx
赋予执行权限:
chmod +x /usr/local/bin/cut_nginx_log.sh
crontab -e
每天凌晨 0 点执行:
0 0 * * * /usr/local/bin/cut_nginx_log.sh
Nginx 使用 文件描述符 写日志,直接 mv 后:
✅ reload 或:
kill -USR1 $(cat /var/run/nginx.pid)
可以让 Nginx 重新打开日志文件。
| 场景 | 推荐方式 |
|---|---|
| 普通服务器 | ✅ logrotate |
| 多站点 / 自定义规则 | 脚本 + cron |
| Docker / 容器 | 脚本或日志驱动 |
如果你愿意,可以告诉我:
我可以帮你定制一套最合适的 Nginx 日志切割方案。