服务器磁盘突然满了的真实排查过程:日志与备份文件把空间占光了
今天处理网站的时候,遇到一个比较典型的服务器问题:磁盘空间突然满了。
这个问题一开始并不明显,因为网站前台还能打开,服务器也能正常登录,并不像服务器宕机那样直接打不开。但后台操作明显开始异常,比如上传图片失败、保存文章变慢、部分页面加载时偶尔卡住。
刚开始我以为是网站程序问题,后来一步一步排查,才发现真正原因是服务器磁盘空间被日志和备份文件占满了。
一、问题出现时的表现
这次问题的表现主要有几个:
网站首页还能打开,但速度比平时慢了一点。
后台上传图片失败,有时候提示上传错误。
文章保存时间变长,偶尔保存失败。
网站没有明显的 502 或 500 报错。
SSH 可以正常登录服务器。
这种情况很容易误判。
因为网站不是完全打不开,所以很多人第一反应会去查程序、权限、插件、PHP配置,但实际上,这次问题的根源不在程序,而在服务器磁盘空间。
二、第一步:先确认服务器负载
登录服务器后,我先看了一下整体负载。
top
CPU占用并不高,内存也没有明显爆满。
这说明服务器并不是因为CPU或内存压力导致卡顿。
然后我又看了一下运行时间和负载情况。
uptime
负载也在正常范围内。
这一步排除了一个方向:不是CPU和内存导致的问题。
三、第二步:检查磁盘空间
因为后台上传和保存都涉及文件写入,所以我开始检查磁盘空间。
df -h
结果一看就很明显:
根目录使用率已经接近100%。
这说明服务器几乎没有剩余可写空间了。
磁盘满了以后,网站会出现很多奇怪问题:
上传文件失败。
缓存无法生成。
日志无法继续写入。
数据库临时文件无法创建。
后台保存数据异常。
所以网站表面上看是“上传失败”,实际是服务器已经没有空间继续写入文件。
四、第三步:查看哪个目录占用最大
知道磁盘满了以后,不能直接乱删文件。
我先查看根目录下各个目录的占用情况:
du -sh /* 2>/dev/null
结果发现 /www 目录占用最大。
继续往下查:
du -sh /www/* 2>/dev/null
发现占用空间比较大的主要是两个地方:
一个是网站日志目录。
另一个是备份目录。
这两个目录平时很容易被忽略,但时间一长就会堆出很多文件。
五、第四步:检查网站日志目录
我继续查看网站日志文件大小。
du -sh /www/wwwlogs/* 2>/dev/null
发现有几个日志文件非常大。
其中访问日志占用最多。
这种情况很常见,网站只要有人访问,日志就会持续写入。如果没有设置自动切割和定期清理,日志文件会越来越大。
尤其是访问量稍微多一点的网站,日志文件增长速度会比想象中快很多。
日志不是不能保留,但不能无限保留。
如果长期不管,它就会慢慢把磁盘空间吃完。
六、第五步:检查备份文件
除了日志,我又检查了备份目录。
du -sh /www/backup/* 2>/dev/null
这里也发现了不少旧备份包。
有些是数据库备份,有些是网站文件备份,还有一些是之前迁移网站时留下的压缩包。
备份本身是必要的,但问题在于:
每天都备份,却没有删除旧备份。
备份包越积越多,最后就把磁盘占满了。
很多站长都会犯这个问题:只设置了自动备份,没有设置自动清理。
七、问题真正原因
排查到这里,问题就比较清楚了。
这次服务器磁盘满了,主要原因是:
网站访问日志长期没有清理。
自动备份文件一直保留。
历史压缩包没有及时删除。
磁盘空间被逐渐占满。
最终导致网站后台上传和保存失败。
所以这不是网站程序突然坏了,而是服务器可用空间不足,导致程序无法继续写入文件。
八、临时处理方法
为了先恢复网站,我先清理了一部分确认无用的文件。
1. 清理旧日志压缩包
rm -f /www/wwwlogs/*.gz
2. 清空特别大的日志文件
对于确认不需要继续保留内容的日志,可以直接清空。
echo "" > /www/wwwlogs/网站日志文件.log
这样不会删除日志文件本身,只是清空内容,服务一般不会因为日志文件被删除而异常。
3. 删除过期备份
进入备份目录,先确认文件日期,再删除很久之前的备份。
ls -lh /www/backup/
确认不需要后再删除。
rm -f /www/backup/旧备份文件名
这里一定不要盲目删除最近的备份。
4. 清理临时目录
rm -rf /tmp/*
临时目录也可能积累不少文件,但清理前最好确认没有特殊程序正在使用。
九、清理后的效果
清理完成后,再次查看磁盘空间。
df -h
磁盘使用率明显下降。
然后重新测试网站后台:
图片上传恢复正常。
文章保存恢复正常。
后台打开速度恢复。
网站前台访问也比之前稳定。
这说明这次问题确实是磁盘空间不足导致的。
十、后续优化措施
这次问题处理完以后,我做了几个调整。
第一,定期检查磁盘空间。
不能等到磁盘100%才处理,平时看到使用率超过80%就应该注意了。
第二,设置日志切割。
网站日志可以保留,但要按天或按大小切割,避免单个日志文件无限变大。
第三,控制备份数量。
备份保留最近几份即可,不建议把所有历史备份一直放在服务器系统盘里。
第四,重要备份单独保存。
重要的网站文件和数据库备份,可以下载到本地,或者放到独立备份空间,不要全部堆在服务器上。
第五,定期清理临时文件和历史压缩包。
尤其是网站迁移、程序更新、打包下载后留下的压缩包,很多时候用完就忘了删。
十一、这次排查的经验
服务器磁盘满了,不一定会第一时间让网站打不开。
它可能先表现为:
后台上传失败。
文章保存失败。
网站缓存异常。
数据库写入异常。
日志无法写入。
所以遇到网站后台异常时,不要只盯着程序代码。
先看服务器资源,尤其是磁盘空间,往往能更快找到问题。
写在最后
这次服务器磁盘突然满了,最终原因是日志和备份文件长期堆积,占满了磁盘空间。
网站故障不一定都是程序问题,很多时候是服务器长期维护不到位导致的。
以后遇到网站上传失败、后台保存失败、数据库写入异常这类问题,可以先检查:
df -h
再继续查日志目录、备份目录和临时文件。
服务器运维最重要的不是只会重启,而是知道问题可能藏在哪一层。