站点运营

站点运营:磁盘空间与日志轮转自查,别等写满才处理

磁盘空间被日志和临时文件占满,往往不会提前通知。本文从日志轮转、大目录排查、清理与扩容几个方面,整理一份可执行的服务器磁盘自查清单,帮助站点运营者在问题发生前发现隐患。

站点运营

站点运营:磁盘空间与日志轮转自查,别等写满才处理

服务器磁盘写满,通常不是一瞬间发生的。它更像一个缓慢积累的过程:访问日志一天天追加,临时文件没有清理,旧备份留在本地,数据库日志悄悄膨胀。等到某天凌晨,磁盘使用率到 100%,轻则上传失败、缓存写不进去,重则数据库进入只读、站点直接打不开。

磁盘吃紧时,站点会有哪些表现

  • 页面打开变慢或直接返回 500,但重启服务后短暂恢复。
  • 后台上传图片、发布文章失败,提示“写入失败”或“空间不足”。
  • 数据库无法写入,评论、表单提交、订单全部卡住。
  • 日志文件不再更新,排查问题时看不到最新记录。
  • SSH 登录后命令补全变慢,甚至无法创建临时文件。

如果你遇到其中两三条,先别急着重启服务,登录服务器看一眼磁盘使用情况往往更直接。

先定位:哪些目录在占空间

用 df -h 查看各分区使用率,再用 du -sh 逐层排查大目录。常见“重灾区”包括:

  • 访问日志与错误日志:Nginx、Apache、PHP、Node.js 等服务的日志目录。
  • 数据库日志:binlog、慢查询日志、错误日志,尤其是未设置过期时间的 binlog。
  • 应用临时文件:上传临时目录、缓存目录、会话文件、队列失败重试文件。
  • 本地备份:自动备份脚本把压缩包留在同一块盘上,越积越多。
  • 容器日志:Docker 默认 json-file 日志如果不限制大小,可能长到几个 GB。

定位时不要只看总大小,也要看文件数量和最近修改时间。一个几十 GB 的旧备份和一个正在快速增长的日志文件,处理方式并不一样。

日志轮转:别让单个文件无限追加

大多数 Linux 发行版自带 logrotate,但默认配置未必覆盖你的应用日志。自查时重点看几项:

  • 是否按天或按大小切割?只按天切割,遇到突发流量仍可能一天写满。
  • 保留多少份?保留 30 份还是 7 份,直接决定长期占用。
  • 是否压缩旧日志?compress 和 delaycompress 能明显减少占用。
  • 切割后是否通知服务重新打开日志文件?否则进程可能继续写已经改名的文件。

修改配置后,建议先用 logrotate -d 做一次调试运行,确认切割、压缩、删除顺序符合预期,再交给定时任务。

不要直接删除正在写入的日志文件。进程仍持有文件句柄,磁盘空间不会立即释放。更稳妥的做法是用 logrotate 切割,或者用 truncate 清空。

清理之外,还要留出缓冲

清理只能解决当下问题,运营上还需要一些缓冲策略:

  • 系统盘和数据盘尽量分开,避免日志把系统盘写满导致服务异常。
  • 给磁盘使用率设置监控告警,比如 80% 提醒、90% 告警,别等到 100% 才处理。
  • 备份文件定期归档到对象存储,本地只保留最近几份,并设置生命周期规则。
  • 容器日志配置大小上限和保留数量,避免单个容器日志失控。
  • 定期检查自动任务产生的临时文件,尤其是导出、转码、爬虫抓取类任务。

磁盘空间自查不需要每天做,但应该纳入每周或每月的运维清单。花几分钟看一眼趋势,比半夜被报警叫醒要从容得多。