nginx日志塞满硬盘后清理日志并配置日志轮转

共计 1847 个字符,预计需要花费 5 分钟才能阅读完成。

介绍

小白发现有台小鸡硬盘炸了,看了一下是日志文件撑满了硬盘。

du -h -d 1 /var/log/
116K    /var/log/apt
400K    /var/log/exim4
4.0K    /var/log/private
798M    /var/log/journal
6.9G    /var/log/nginx
196K    /var/log/unattended-upgrades
8.0K    /var/log/runit
7.7G    /var/log/

ls -lh /var/log/nginx/
total 6.9G
-rw-r----- 1 www-data adm 5.3G May 18 00:13 access.log
-rw-r----- 1 www-data adm 1.6G May 18 00:13 error.log

那我们就要来搞一下nginx日志了。

先清理下日志

# 清空 access.log(保留文件但清空内容)
sudo truncate -s 0 /var/log/nginx/access.log

# 或者直接删除(Nginx 会自动重新创建)
sudo rm /var/log/nginx/access.log
sudo systemctl restart nginx

方法 1:在 nginx.conf 中限制日志大小(不推荐)

Nginx 本身不直接支持在配置文件中限制日志大小,但你可以通过 logrotate(推荐)或 cron + truncate 来实现类似效果。

(可选)手动截断日志(临时方案)

如果你只是临时想限制日志大小,可以写一个 cron 任务定期截断日志:

# 每天凌晨清空 access.log
0 0 * * * sudo truncate -s 0 /var/log/nginx/access.log

但这种方式不够优雅,推荐使用 logrotate(见方法 2)。

方法 2:使用 logrotate 自动管理日志(推荐)

logrotate 是 Linux 默认的日志管理工具,可以按 时间大小 自动轮转(切割、压缩、删除旧日志)。

1. 检查是否已有 Nginx 的 logrotate 配置

Debian 11 默认已为 Nginx 配置 logrotate,查看:

cat /etc/logrotate.d/nginx

默认配置通常如下:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
  • daily:每天轮转一次
  • rotate 14:保留 14 天的日志
  • compress:压缩旧日志(节省空间)
  • notifempty:如果日志为空,不轮转

2. 修改配置(按大小轮转)

如果你想 按日志大小 轮转(例如超过 100MB 就切割),修改 /etc/logrotate.d/nginx

sudo nano /etc/logrotate.d/nginx

修改为:

/var/log/nginx/*.log {
    size 100M  # 日志超过 100MB 就轮转
    missingok
    rotate 5   # 只保留 5 个旧日志文件
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
  • size 100M:日志文件超过 100MB 时触发轮转
  • rotate 5:最多保留 5 个旧日志文件(如 access.log.1.gz ~ access.log.5.gz

3. 手动测试 logrotate

如果本地没安装logrotate,自行安装即可。

sudo logrotate -vf /etc/logrotate.d/nginx
  • -v:显示详细信息
  • -f:强制执行(即使未到轮转时间)

4. 查看效果

ls -lh /var/log/nginx/

你会看到类似:

access.log       # 当前日志(新写入的)
access.log.1     # 昨天的日志
access.log.2.gz  # 前天的日志(压缩)

方法 3:禁用 Nginx 日志(极端情况)

如果完全不需要日志,可以在 nginx.conf 中关闭:

http {
    access_log off;
    error_log /dev/null;
}

不建议这样做,因为日志对排查问题很重要。

正文完
 0
admin
版权声明:本站原创文章,由 admin 于2025-05-18发表,共计1847字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。