自行架设云端主机(VPS)或专用服务器运维也有了一段时间。刚开台时订制的硬盘空间看似充裕,但在没有特别注意定期维护的情况下,某天登入系统执行指令时,赫然发现根目录的磁碟使用率竟然一路攀高到了 91%,只剩下不到 9% 的残余空间!

在 Linux 服务器环境中,磁碟空间耗尽(Disk Full)是引发灾难性崩溃的头号杀手之一。一旦硬盘剩余空间归零,MySQL / MariaDB 数据库将无法写入暂存表格而直接崩溃死锁,Web 服务器无法写入 Session 导致访客全数登出,甚至 SSH 服务都会因为无法生成认证暂存档而将管理者拒之门外。

当发现磁碟拉警报时,该如何迅速找出吞噬空间的元凶?又该如何安全释放空间并治本预防?本文将为大家整理一套标准的排查与清理 SOP。


一、第一步:全盘诊断,精准揪出空间杀手

不要盲目随意删除文件!我们先透过终端机指令由大到小精确定位问题所在。

1. 检视各挂载分区使用率(df 指令)

首先输入以下指令,以人类可读(Human-readable)的形式查看所有磁碟分区:

df -h

输出范例通常如下:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   36G  1.8G  95% /
udev            2.0G     0  2.0G   0% /dev
tmpfs           400M  1.2M  399M   1% /run

如果发现挂载在根目录 / 的使用率已经超过 90%,就代表我们必须深入根目录排查。

2. 逐层追查最大占用目录(du 指令)

输入以下指令,列出根目录下体积最大的前 10 个目录:

sudo du -sh /* 2>/dev/null | sort -hr | head -n 10

根据站长多年维运经验,在多数 Web 服务器中,除了存放用户上传图片的 wp-content/uploads 之外,最常见的空间杀手几乎无一例外落在 /var/log(系统与网页日志)!

最占用磁碟空间的单一资料夹:var/log/apache2/domains

如上图所示,当我们深入排查时,往往会发现最占用磁碟空间的单一目录正是: var/log/apache2/domains(或者是 Nginx 站点的 access.log)。

长期运行的网站每天会迎来数以万计的正常访客与网络爬虫,如果没有设定自动截断,单一网域的访问日志动辄可以累积到 10GB 甚至 20GB 以上,不知不觉将硬盘塞爆。


二、第二步:安全清理!切勿直接执行 rm 删除使用中的日志

找到庞大的日志档后,很多新手的直觉反应是直接敲指令:rm -f access.log。

严正警告: 千万不要对正在被 Apache 或 Nginx 写入的日志文件直接执行 rm 指令! 在 Linux 系统中,如果一个文件仍被运行的进程(Process)开启著,即使你在文件系统中删除了该档名,该文件的 Inode 与磁碟区块仍然会被该进程牢牢锁定。结果就是:文件看似消失了,但磁碟空间根本不会释放! 更糟的是,Web 服务器可能会因为失去日志控制代码而发生异常。

正确做法:以「截断(Truncate)」方式安全清空日志

使用重定向符号将文件大小归零,进程无需重启即可立即释放磁碟空间:

# 方法一:利用重定向清空特定日志
sudo sh -c '> /var/log/apache2/domains/yourdomain.com.error.log'
sudo sh -c '> /var/log/apache2/domains/yourdomain.com.log'

# 方法二:清空系统标准日志
sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/syslog

三、第三步:清理套件缓存与旧核心

除了网站日志,Linux 系统长时间运行后,套件管理器与系统暂存也会沉积大量无用垃圾:

1. 清理 APT 套件缓存(Ubuntu / Debian)

每次执行 apt update 与 apt upgrade 后,下载的 .deb 安装包都会被缓存在硬盘中:

# 清除已下载但不再需要的旧版本套件缓存
sudo apt-get clean

# 自动移除过去作为依赖安装但现在已不再使用的孤儿套件
sudo apt-get autoremove --purge -y

2. 清理 YUM 套件缓存(CentOS / RHEL)

sudo yum clean all
sudo rm -rf /var/cache/yum

3. 清理暂存目录 /tmp

检查 /tmp 与 /var/tmp 是否有长时间遗留的大型压缩档或测试文件:

sudo rm -rf /tmp/*

四、第四步:治本防范!配置 Logrotate 日志自动轮替

把日志清空只是治标,如果不及时处理,几周后硬盘又会再度爆满。彻底解决问题的关键在于建立良好的「日志轮替(Logrotate)」机制。

Linux 系统内建了 logrotate 工具。请检查 /etc/logrotate.d/apache2 设定档:

sudo nano /etc/logrotate.d/apache2

确保设定中包含以下关键参数,要求系统按周(或按日)轮替、压缩封存,并自动删除超过期限的旧纪录:

/var/log/apache2/*.log /var/log/apache2/domains/*.log {
    daily               # 每天轮替一次
    missingok           # 若日志不存在也忽略
    rotate 7            # 最多仅保留 7 天的历史日志
    compress            # 旧日志自动使用 gzip 压缩(体积缩小 90%)
    delaycompress       # 延迟到下一次轮替才压缩前一天的日志
    notifempty          # 日志为空则不轮替
    create 640 root adm
    sharedscripts
    postrotate
        /etc/init.d/apache2 reload > /dev/null
    endscript
}

储存后,可执行以下指令强制测试轮替运作是否正常:

sudo logrotate -f /etc/logrotate.d/apache2

五、第五步:若为真实业务增长,如何在线扩充硬盘?

如果排查后发现磁碟占用全都是真实的用户图片、影音上传或庞大的业务数据库,而不是暂存垃圾,那就意味著你的网站流量与规模已经成长,该为 VPS 扩充硬盘了。

现代主流云端服务商(如 Linode、DigitalOcean、AWS EBS、GCP、Bluehost VPS)都支持在管理后台「线上无缝升级磁碟容量」:

  1. 后台扩容:在主机商控制台将磁碟从 40GB 调整为 80GB。
  2. 在线调整分割区大小(免重开机):
    # 安装 growpart 工具
    sudo apt-get install cloud-guest-utils -y
    
    # 扩展第一个分割区(例如 /dev/vda 上的第 1 分割区)
    sudo growpart /dev/vda 1
  3. 扩展文件系统(Filesystem Resize):
    # 如果文件系统为 ext4:
    sudo resize2fs /dev/vda1
    
    # 如果文件系统为 xfs:
    sudo xfs_growfs /
  4. 再次输入 df -h,就能看到硬盘容量立即从 40GB 扩充至 80GB,且所有运行的服务完全无需中断!

结语:防患于未然的服务器运维思维

服务器维护最忌讳「平时不闻不问,直到当机才救火」。

建议大家花 10 分钟检查服务器的 logrotate 配置,并在服务器上设定简单的每日 Cron 任务:当 df -h 的根目录使用率超过 80% 时,自动发送 Telegram 或 Email 通知给管理员。掌握系统的即时脉搏,才能让你的网站永远在稳定可靠的高速轨道上平稳前行。

✦ 独立报道 · 读者支持 ✦

以实际行动支持独立观点,与我们一同走得更远

每一篇条理清晰的分析、每一次不随波逐流的观察,背后都是对真实与品质的坚持。我们拒绝内容农场与算法流量绑架,坚持自由独立的客观发声。

维持高品质的原创写作与独立运营,需要持续的实质力量。您可以选择一次性赞助或每月定期支持,通过 Google 安全结账,与我们一同守护这份深刻与清醒。

由 Google 安全处理付款 · 可随时在 Google 账户管理或取消

标签Linux磁碟空间不足VPS维护Apachelogrotate服务器运维硬盘扩充df指令