今天网站监控突然报警,提示网站无法访问。登录宝塔面板查看后发现,服务器磁盘空间已经被占满了。
第一步:快速定位大文件
为了找到占用空间的文件,我写了一个简单脚本,用来查找服务器上大于指定大小的文件。运行后很快就找到了几个体积异常大的日志文件。
查找结果如下:
root@s01 ~# find_large_files.sh / 100
[I] 正在搜索 / 下大于 100MB 的文件...
============================================================
大小 路径
============================================================
3.1G /www/wwwlogs/tts.xiamp.net.log
1.8G /www/wwwlogs/xiamp.net.log
657M /www/server/data/mysql-bin.000007
642M /backups/xxxx.tgz
...可以看到,占用空间最多的是网站访问日志,其中单个日志文件已经达到数 GB。
脚本的下载地址:
https://github.com/benzBrake/VPSReady/raw/refs/heads/main/.utils/find_large_files.sh
下载后执行,并传入需要扫描的目录和文件大小阈值即可。
解决当前问题后,为了避免日志文件继续无限增长,还需要配置日志轮转。
第二步:配置 logrotate 日志轮转
使用 logrotate 可以自动对日志进行切割、压缩和清理,避免单个日志文件不断增大。
以下是针对 /www/wwwlogs/ 目录的日志轮转配置:
/www/wwwlogs/*.log {
daily
rotate 14
compress
delaycompress
notifempty
missingok
size 100M
create 644 www www
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
/www/wwwlogs/*.log/*.log {
daily
rotate 7
compress
delaycompress
notifempty
missingok
size 50M
create 644 www www
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}配置说明
daily
每天执行一次日志轮转。
rotate
设置保留的日志备份数量,超过数量的旧日志会被删除。
size
当日志文件达到指定大小时触发轮转,避免单个日志文件过大。
compress
旧日志会自动压缩,减少磁盘占用。
postrotate
日志切割完成后通知 Nginx 重新打开日志文件,保证日志继续正常写入。
总结
这次服务器空间被占满的原因是日志文件长期增长没有清理。通过两步可以解决问题:
- 使用脚本快速定位大文件
- 配置
logrotate自动管理日志
这样既能快速处理当前问题,也能避免之后再次出现磁盘被日志占满的情况。
精选留言