清理 Nginx 日志是服务器维护中非常重要的一步,尤其是在高并发或高访问量的网站中,日志文件可能在短时间内迅速膨胀,消耗大量磁盘空间。下面从清理思路、自动化脚本、日志轮转配置等多个角度,为你详细说明如何有效清理 Nginx 日志以节省空间。
一、Nginx 日志的默认位置与类型
Nginx 通常会生成以下两类日志:
访问日志(access.log)
记录所有HTTP请求,包括IP、时间、状态码等;
错误日志(error.log)
记录运行错误、配置异常、连接失败等信息。
默认日志路径可能如下:
/var/log/nginx/access.log
/var/log/nginx/error.log
也可以在配置文件中查看具体路径:
grep log /etc/nginx/nginx.conf
二、手动清理日志(适合一次性应急)
当服务器磁盘空间告急,可以手动清理日志:
> /var/log/nginx/access.log
> /var/log/nginx/error.log
这条命令不是删除文件,而是清空日志内容,不会影响正在运行的 Nginx 程序。
注意:
不要直接使用 rm 删除日志文件,否则 Nginx 仍然会尝试写入已经不存在的文件,导致错误;
清空后可执行 systemctl reload nginx 让它重新创建日志句柄。
三、使用 logrotate 自动轮转日志(推荐)
Linux 中推荐使用 logrotate 工具对日志进行周期轮转、备份与清理。
1. 创建 Nginx 日志轮转配置文件(如果未自动安装)
sudo nano /etc/logrotate.d/nginx
填入以下内容:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
执行一次测试轮转:
sudo logrotate -f /etc/logrotate.d/nginx
查看压缩日志结果:
ls -lh /var/log/nginx/
你将看到如:access.log.1.gz, access.log.2.gz 等文件。
四、定期清理日志文件(cron+shell脚本方案)
如果不使用 logrotate,也可以自己写定时脚本清理旧日志。
示例脚本:
#!/bin/bash
# 设置日志路径
log_dir="/var/log/nginx"
# 清空主日志文件(避免直接删除)
> $log_dir/access.log
> $log_dir/error.log
# 删除7天前的历史日志文件
find $log_dir -type f -name "*.log.*" -mtime +7 -exec rm -f {} \;
# 可选:压缩2天前日志
find $log_dir -type f -name "*.log.*" -mtime +2 ! -name "*.gz" -exec gzip {} \;
添加到 crontab:
crontab -e
加入:
0 3 * * * /root/clear_nginx_logs.sh
每天凌晨3点执行清理任务。
五、禁用或减少日志(非推荐,视业务需求)
如果对访问日志没有依赖分析需求,可以在 Nginx 配置中禁用或缩减日志量。
禁用访问日志:
access_log off;
设置记录特定状态码:
只记录 500 错误以上的请求:
access_log /var/log/nginx/access.log combined if=$loggable;
map $status $loggable {
default 0;
~^[5] 1;
}
六、排查磁盘占用与清理建议
查看哪个目录占用最多空间:
du -sh /* 2>/dev/null | sort -hr | head -20
查看 /var/log/ 下前20大文件:
sudo find /var/log -type f -exec du -h {} + | sort -hr | head -20