Nginx 默认不会自动分割日志,所以日志都写在一个文件里,时间久了就会变得非常庞大,不便于管理。要实现 Nginx “每天生成日志”,最主流、最推荐的方法是使用 Linux 系统自带的 logrotate 工具。这个方案稳定且自动,不用你写复杂的脚本。下面是核心配置步骤:
一、核心解决方案:使用 logrotate 工具
这是最标准、维护成本最低的方案,也是绝大多数 Linux 生产环境的选择。
1. 创建或编辑配置文件
通常,我们为 Nginx 单独创建一个配置文件。使用你喜欢的编辑器(如 vim)打开以下文件:
sudo vim /etc/logrotate.d/nginx
2. 添加配置内容
将以下配置内容复制进去。这是一个通用的配置模板,已包含详细说明
/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 ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript
}
解释说明: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)模式:该命令会模拟运行,告诉你它会做什么,但不实际执行。
sudo logrotate -d /etc/logrotate.d/nginx
- 强制执行:如果你想立即看效果,可以强制运行一次。
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):
#!/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 点执行
0 0 * * * /bin/bash /usr/local/bin/cut_nginx_log.sh
- 优缺点对比:这种方案虽然更灵活,但需要自己维护脚本和定时任务的可靠性。对于大多数场景,
logrotate是更省心的选择。
三、总结建议
| 方案 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
logrotate |
系统自带、配置简单、自动化、稳定可靠 | 灵活性相对较低 | 所有通用场景,强烈推荐 |
| 自定义脚本 | 高度灵活,可完全自定义命名和行为 | 需手动维护脚本和定时任务,有出错可能 | 有复杂定制需求的特殊场景 |
对于“每天生成日志”这个需求,直接使用 logrotate 即可一劳永逸地解决问题。
