一、核心解决方案:使用 logrotate 工具

这是最标准、维护成本最低的方案,也是绝大多数 Linux 生产环境的选择。

1. 创建或编辑配置文件

通常,我们为 Nginx 单独创建一个配置文件。使用你喜欢的编辑器(如 vim)打开以下文件:

1

sudo vim /etc/logrotate.d/nginx

2. 添加配置内容

将以下配置内容复制进去。这是一个通用的配置模板,已包含详细说明

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/var/log/nginx/*.log {

    daily          # 每天切割一次

    rotate 30      # 保留30天的日志(30份)

    dateext         # 使用日期作为后缀(关键!)

    dateformat -%Y%m%d       # 日期格式(可选,默认是 -YYYYMMDD)

    compress       # 开启压缩,节省磁盘空间

    delaycompress  # 延迟压缩,保留最近一份未压缩的日志便于即时查看

    missingok      # 日志文件找不到时忽略错误

    notifempty     # 日志为空则不切割

    create 0640 nginx nginx  # 创建新日志文件,并设置权限和属主(用户需改为你实际的Nginx运行用户)

    sharedscripts  # 所有日志处理完后,只执行一次下面的脚本

    postrotate

        # 发送USR1信号给Nginx主进程,让它重新打开日志文件(关键步骤,不会中断服务)

        if [ -f /var/run/nginx.pid ]; then

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

        fi

    endscript

}

  解释说明:1、“/var/log/nginx/*.log”这个需要替换为对应nginx所在目录位置与日志文件,*.log表示以.log结尾的文件均做切割。

       2、“/var/run/nginx.pid”这个需要替换为对应nginx进程文件。

                         3、核心信号:kill -USR1 这条命令是核心,作用是让 Nginx 优雅地关闭旧日志文件并创建新的开始写入,整个过程服务不会中断。

                         4、用户权限:如果服务器上 Nginx 运行用户不是 nginx(比如是 www-data),记得把 create 行里的 nginx nginx 改成对应的用户名和组名。

3. 检查和测试

在配置生效前,建议先测试一下确保配置没有问题。

  • 测试(Debug)模式:该命令会模拟运行,告诉你它会做什么,但不实际执行。

1

sudo logrotate -d /etc/logrotate.d/nginx

  •   强制执行:如果你想立即看效果,可以强制运行一次。

1

sudo logrotate -f /etc/logrotate.d/nginx

  

  • 执行后,你可以去 /var/log/nginx/ 目录下查看,应该会看到旧的日志被重命名为类似 access.log-20260509.gz 的文件,并且新的 access.log 文件已经生成。

4. 自动化

不用担心,logrotate 安装后会由系统的 cron 定时任务(通常在 /etc/cron.daily/)每天自动调用一次,无需你再做任何额外配置。


二、备选方案:自定义脚本 + Crontab

如果你希望对日志有更精细的控制(比如需要特殊命名规则),可以自己写 Shell 脚本,并通过 crontab 定时执行。

  • 脚本示例 (/usr/local/bin/cut_nginx_log.sh):

1

2

3

4

5

6

7

8

9

10

#!/bin/bash

LOGS_PATH="/var/log/nginx"

TODAY=$(date -d "yesterday" +%Y%m%d) # 脚本在凌晨执行,处理昨天的日志

# 移动并重命名日志文件

mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access-${TODAY}.log

mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error-${TODAY}.log

# 通知Nginx重新打开日志文件

kill -USR1 $(cat /var/run/nginx.pid)

  • 添加定时任务:通过 crontab -e 命令添加一条定时任务,让脚本每天凌晨 0 点执行

1

0 0 * * * /bin/bash /usr/local/bin/cut_nginx_log.sh

  •   优缺点对比:这种方案虽然更灵活,但需要自己维护脚本和定时任务的可靠性。对于大多数场景,logrotate 是更省心的选择。

三、总结建议

方案优点缺点推荐场景
logrotate系统自带、配置简单、自动化、稳定可靠灵活性相对较低所有通用场景,强烈推荐
自定义脚本高度灵活,可完全自定义命名和行为需手动维护脚本和定时任务,有出错可能有复杂定制需求的特殊场景

更多推荐