Nginx日志切割自动清理磁盘
为什么需要Nginx日志切割与自动清理
Nginx默认会把所有访问日志和错误日志写进同一个文件。
时间一长,日志文件可能长到几个GB,不仅占用磁盘,还会拖慢日志查询速度。
更危险的是,磁盘写满后网站会直接报错。
所以,Nginx日志切割自动清理磁盘是每个运维新手必须掌握的基本操作。
前置准备:检查系统环境
你需要一台安装了Nginx的Linux服务器,系统可以是CentOS 7/8、Ubuntu 20.04+等。
大部分发行版都自带 logrotate 工具,用来管理日志轮转。
先确认logrotate是否已安装:
logrotate --version
如果没有输出版本号,可以用包管理器安装:
- CentOS:
yum install logrotate -y - Ubuntu:
apt install logrotate -y
然后找到Nginx日志默认存放路径,通常是 /var/log/nginx/,里面应该能看到 access.log 和 error.log。
核心操作:配置logrotate规则实现自动切割
进入logrotate配置目录:
cd /etc/logrotate.d/
新建一个名为 nginx 的文件:
sudo vim nginx
写入以下配置(以CentOS为例,其他系统路径相同):
/var/log/nginx/*.log {
daily # 每天切割一次
missingok # 如果日志丢失不报错
rotate 30 # 保留最近30个日志文件
compress # 切割后压缩旧日志
delaycompress # 延迟一天压缩,方便当天查询
notifempty # 日志为空就不切割
create 0640 nginx adm # 新建日志文件权限和属主
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
配置说明:daily 表示每天切一次,
你也可以改用 weekly。rotate 30 表示最多保留30份历史日志,
超过的自动删除。postrotate 脚本在切割后给Nginx发送 USR1 信号,
让它重新打开日志文件,
这一步很关键,
否则Nginx还会往旧文件里写日志。
保存后先手动测试配置是否生效:
sudo logrotate -d /etc/logrotate.d/nginx
如果输出没有明显报错,再真正执行一次:
sudo logrotate -f /etc/logrotate.d/nginx
执行后检查 /var/log/nginx/ 目录,应该能看到压缩过的旧日志,比如 access.log-20250410.gz。
避坑指南:常见问题与解决
权限不足:如果日志文件属主是 root,而Nginx以 nginx 用户运行,logrotate可能无法创建新文件。
配置中的 create 0640 nginx adm 确保新文件归nginx用户。
信号没触发:postrotate 脚本里的 kill -USR1 必须写到一行,不要换行。
如果Nginx PID文件路径不同(比如是 /var/run/nginx/nginx.pid),要把路径改对。
压缩延迟影响:delaycompress 可以让当天的旧日志不立即压缩,方便调试。
如果磁盘极紧张,可以去掉这一行。
效果验证与日常监控
等第二天或者手动触发切割后,你可以用 du -sh /var/log/nginx/ 查看日志目录总大小,看是否下降。
同时观察 access.log 和 error.log 文件是否重新从0开始。
另一个验证方法:查看系统logrotate执行记录:
sudo cat /var/lib/logrotate/status | grep nginx
会显示上次执行时间和状态。
如果你的Nginx日志量非常大,还可以搭配 cron 设置更频繁的切割(比如每小时),但大多数场景每天一次就够了。
总结:通过logrotate配置 daily、rotate 30、compress 和正确的 postrotate 脚本,你就能轻松实现Nginx日志切割自动清理磁盘。
遇到问题先检查日志权限和PID路径。
这套方法稳定运行多年,新手照着做基本不会翻车。