温馨提示×

Debian Nginx日志如何切割

小樊
40
2026-09-16 11:40:02
栏目: 智能运维

在 Debian 上,Nginx 日志切割常见有三种方式:

  1. 使用系统自带的 logrotate(推荐)
  2. 使用 Nginx 自带信号 + 脚本
  3. 使用第三方工具(如 cronolog)

下面重点讲最常用、最规范的做法:logrotate


一、使用 logrotate(Debian 默认已安装)

1. 确认 logrotate 已安装

which logrotate

2. Nginx 的 logrotate 配置位置

Debian 中通常已存在:

/etc/logrotate.d/nginx

内容示例(Debian 默认):

/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
}

3. 关键参数说明

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

4. 手动测试 logrotate

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

二、纯手动脚本方式(不推荐但可理解原理)

1. 切割脚本示例

#!/bin/bash
LOG_PATH=/var/log/nginx
DATE=$(date -d yesterday +%Y-%m-%d)

mv $LOG_PATH/access.log $LOG_PATH/access-$DATE.log
mv $LOG_PATH/error.log $LOG_PATH/error-$DATE.log

# 通知 Nginx 重新打开日志
kill -USR1 $(cat /var/run/nginx.pid)

2. 加入 crontab

0 0 * * * /usr/local/bin/nginx_log_rotate.sh

三、常见问题

1. 切割后 Nginx 不写新日志?

✅ 必须执行:

kill -USR1 `cat /var/run/nginx.pid`

nginx -s reopen

2. 日志权限问题?

确保:

  • 日志属主:www-data:adm
  • Nginx 有写权限

四、推荐方案总结

生产环境

使用 Debian 自带的 /etc/logrotate.d/nginx

简单可靠
无需额外依赖

如果你愿意,我可以:

  • 帮你定制 logrotate 配置
  • 或针对 Docker / 多站点 Nginx 给方案

0