技术咨询专线

137-9839-1694

服务器磁盘告警不要急着删文件。本文按日志、备份、缓存三类占用讲清排查方法与安全清理顺序,并给出 logrotate、备份保留策略、磁盘告警等防复发设置。

服务器磁盘满了怎么办?日志、备份、缓存三类占用的清理顺序(pic1)

一、先确认是哪块盘满了,再决定删什么

服务器磁盘告警时,很多人的下意识反应是登录上去找大文件删掉。这个动作本身没错,但顺序反了容易删错东西。先看清楚是哪一块分区满了:系统盘(/)满和后加的数据盘(/www、/data)满,处理方式完全不同。用 df -h 看各分区使用率,再用 du -sh /* 逐层往下找,比盲目翻目录快得多。

还有一种情况容易被忽略:磁盘空间显示还有余量,程序却报"设备上没有空间"。这是 inode 用完了。大量小文件(缓存碎片、session 文件、邮件队列)会把 inode 耗尽,用 df -i 就能确认。inode 满了删大文件没用,得删数量多的那类小文件。

从现象上也能反推。网站突然大面积 500、后台上传图片失败、数据库报写入错误、日志停止追加,这几条同时出现,基本可以判定磁盘写满。这时候先做临时缓解(清日志、清临时文件),再按下面的顺序系统清理,别一上来就重启数据库——写不进去的数据库重启有很大概率起不来。

二、日志:最常见、也最容易被忽略的增长项

一个日均几千访问的站点,Nginx 的访问日志一天能写几十兆到上百兆,看起来不多,但如果没配切割,跑上两年就是几十个 G。真正吃盘的是这几种:

Nginx 的访问日志和错误日志。默认配置下错误日志会一直追加,程序报错频繁时增长很快。网站程序自己的调试日志更麻烦,开了调试模式忘了关,一次请求能写几十行,几个月下来能占掉半个盘。

PHP 的慢日志和 MySQL 的慢查询日志。前者记录执行超时的请求,后者记录慢 SQL,两个都建议开着,但都要配切割和保留天数,否则就是纯增长。

MySQL 的 binlog。开了主从复制或需要按时间点恢复才用得上,很多站为"保险"开着却从不清理,一个活跃库一个月能产出几十 G。确认没有从库、不需要按时间点回滚的话,可以把过期天数设成 7 天。

面板与定时任务产生的日志。面板的操作日志、计划任务的输出、系统 cron 的邮件、防火墙的拦截记录,都属于"平时想不起来、出事时才发现"的那一类。

三、备份文件:最容易堆出几百 G 的地方

这一项在很多服务器上是头号占用。原因不复杂:备份脚本按天全量打包,本地存一份、远程再存一份,谁也没设过清理规则,一年下来就是三百多份压缩包。

合理的做法是把备份分层:每天一份增量或数据库备份,保留 7 天;每周一份全量,保留 4 周;每月一份全量,保留 3 个月。按这个策略,即便站点有 2G 数据,本地占用也就十几个 G,而不是几百 G。

另一个常见问题是备份放在同一块盘上。盘坏了备份跟着一起没,等于没备。至少要把最近几份同步到另一台机器或对象存储。清理本地旧备份前,先确认远程那份能正常解压、能正常还原——没验证过的备份不能算备份。

四、缓存与临时文件:能删,但要分清哪一种

缓存是最安全的清理对象,因为它本来就是可以重建的:页面静态缓存、对象缓存、模板编译缓存、缩略图缓存。删掉之后头一次访问会慢一点,之后自动恢复。

但也有不能随手删的。上传目录(uploads、attachment)里是客户资料和产品图,删了不可恢复;session 文件删掉会让所有登录用户掉线;支付、发票类插件的数据目录里可能有未处理的订单文件;面板回收站、数据库临时表空间虽然占地方,但要在业务低峰的时间窗里处理。

/tmp 和 /var/log 是两个固定动作。前者里的临时文件大部分可以清,注意别删正在运行的进程占用的文件(删了空间不释放,得重启进程);后者按天切割并压缩,历史归档只留一周。

五、清理的安全顺序:照这个次序做

步骤 1,先把数据库和网站配置导一份到本地。清理过程中任何一步出错,这份导出就是退路。

步骤 2,清日志,保留最近 7 天。清空正在写入的日志文件用截断方式(truncate 或重定向),不要直接 rm——rm 之后进程还持有文件句柄,空间不会释放,非得重启服务才行。

步骤 3,清临时文件与各类缓存,这一步通常能立刻释放出可观的量。

步骤 4,处理备份。只保留策略内的那几份,其余删除或迁到别的存储。

步骤 5,查上传目录里的大文件。按大小排序,往往能找到几百兆的宣传视频、没压缩的原图、客户传来的压缩包。该压的压、该迁的迁,不要直接删客户的资料。

步骤 6,数据库层面清理。CMS 的文章修订版本、回收站、日志表、统计表是最常见的堆积点。清理前先看表大小,别对几百万行的日志表一次性删除,改成按时间分批删。

步骤 7,重启相关服务并用 df 复核,确认使用率降下来了,再观察一天有没有反弹。

六、清完之后的防复发设置

清一次只是把问题推后。要让它不再发生,得改几个默认设置:给 Nginx、PHP、MySQL 的日志都配上 logrotate,按天切割、压缩、保留 7 到 14 天;把程序的调试模式在生产环境关掉;备份保留策略写进脚本,不要靠人记;磁盘使用率到 80% 就发告警到手机或邮箱,别等到 100% 才发现。

再往前一步是减少增长源。图片在上传前压缩、统一转 webp,能省掉很大一部分空间;附件和视频单独挂一块盘或走对象存储,不占系统盘;数据库定期做一次表优化,把碎片空间收回来。

七、什么时候该考虑扩容,而不是继续清理

如果按上面的流程清完,一两周内又回到 90% 以上,说明增长是业务量带来的,清理解决不了。这时候要么加一块数据盘,把上传目录和备份迁过去;要么把静态资源交给对象存储和 CDN,让服务器只处理动态请求。

还有一种情况是单盘 IO 到顶:磁盘没满,但读写延迟很高,后台一保存就转圈。这是性能问题不是容量问题,加盘解决不了,得看是不是在做全量备份、是不是有慢查询在扫全表。

磁盘这件事的判断标准其实很朴素:能清的先清,清完还会满就扩容,扩容之前先确认增长是不是合理的。如果您不确定自家服务器属于哪一种,可以把 df 和 du 的结果发给锐客网,技术同事帮您看一遍再给处理顺序,电话 137-9839-1694。

ABOUT THE AUTHOR 锐客网内容组 · 小锐

十年一线建站与运维经验,写我们真正在项目里踩过的坑:怎么选型、怎么控成本、上线后怎么养。

聊聊你的项目

获取建站方案评估

想搭建或改版网站,却不确定做哪种站、大概多少钱、要多久?留下行业与需求,我们给出方案规划与报价参考。