目录
介绍
小白发现有台小鸡硬盘炸了,看了一下是日志文件撑满了硬盘。
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;
}
但 不建议这样做,因为日志对排查问题很重要。