温馨提示×

debian nginx日志怎样切割

小樊
51
2026-09-13 07:39:19
栏目: 智能运维

在 Debian 上,Nginx 日志切割最常用、最推荐的方式是使用系统自带的 logrotate。下面按“推荐方案 → 手动方案”来说明。


一、使用 logrotate(官方推荐 ✅)

Debian 默认已安装 logrotate,Nginx 也自带配置。

1. 查看 Nginx 的 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
}

2. 常用参数说明

  • daily:每天切割
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • notifempty:空日志不切割
  • postrotate:通知 Nginx 重新打开日志(关键

3. 手动测试(非常重要)

logrotate -d /etc/logrotate.d/nginx   # 模拟执行
logrotate -f /etc/logrotate.d/nginx  # 强制执行一次

4. 默认执行时间

logrotate 由 cron 每天执行:

/etc/cron.daily/logrotate

二、常见自定义示例(可选)

示例:按大小切割(超过 100M 就切)

/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

四、常见问题排查

1. 日志没切割?

  • 检查 cron 是否运行
  • /var/lib/logrotate/status
  • 日志是否为空(notifempty)

2. 切割后还在写旧文件?

  • 没执行 USR1
  • systemd 环境用:
systemctl kill -s USR1 nginx

总结(最佳实践 ✅)

Debian + Nginx = 直接用 logrotate
✅ 不要自己写脚本
✅ 改完配置一定 logrotate -d 测试

如果你愿意,我可以帮你写一份适合你服务器流量和磁盘的 logrotate 配置

0