香港VPS用着用着突然网站打不开、数据库连不上、SSH敲命令都报错,登录一看——磁盘满了。这种情况在香港VPS上特别常见,因为很多套餐给的系统盘不大,20GB到40GB是常态,而香港机房带宽贵、硬件贵,商家在磁盘上抠成本是普遍做法。
磁盘满了之后,系统会连锁反应:MySQL无法写入临时文件直接崩溃、PHP-FPM写不了session、Nginx日志写不进去、甚至SSH登录都可能失败。关键是要快速定位到“谁把磁盘吃满了”,然后安全地清理掉。
第一步:确认磁盘使用情况
登录服务器后,先看整体情况:
df -h
输出会列出每个挂载点的使用率。重点关注根分区/和/var分区,如果Use%超过90%,就要开始处理了。
如果df -h显示某个分区满了,但你又不知道具体是哪个目录占的,用du逐层排查:
du -sh /* 2>/dev/null | sort -rh | head -20
这条命令会列出根目录下每个文件夹的总大小,按从大到小排序。2>/dev/null是把权限错误屏蔽掉,避免输出太乱。
找到最大的那个目录后,继续往下钻:
du -sh /var/* 2>/dev/null | sort -rh | head -20
一层一层往下,很快就能定位到“元凶”。
第二步:日志文件——最常见的磁盘杀手
日志文件是香港VPS磁盘被占满的头号原因。Nginx、MySQL、PHP、系统日志,每天悄无声息地写,几天不看就能吃掉几个GB。
Nginx日志
du -sh /var/log/nginx/
ls -lh /var/log/nginx/
Nginx的access.log和error.log是重灾区。如果网站访问量大,access.log一天长到几百MB很正常。
清理方法:
不要直接rm删掉日志文件——Nginx还在往里面写,删了之后文件句柄还占着空间,df看还是满的。正确的做法是清空内容:
# 清空当前日志
> /var/log/nginx/access.log
> /var/log/nginx/error.log
更规范的做法是配置日志轮转。编辑/etc/logrotate.d/nginx,确保有类似这样的配置:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
rotate 7表示保留最近7天的日志,超过的自动删除。compress启用压缩,能省不少空间。
MySQL日志
du -sh /var/log/mysql/
ls -lh /var/log/mysql/
MySQL的error.log、slow.log、general.log都可能很大。特别是开启了慢查询日志但没配置轮转的,slow.log能长到几个GB。
清理方法:
> /var/log/mysql/slow.log
> /var/log/mysql/error.log
更重要的操作:检查MySQL的binlog。binlog是二进制日志,用于主从复制和数据恢复,默认会保留很久。在香港VPS这种小磁盘上,binlog经常是隐藏的“空间黑洞”。
du -sh /var/lib/mysql/
ls -lh /var/lib/mysql/ | grep bin
清理binlog需要登录MySQL执行:
-- 查看当前binlog
SHOW BINARY LOGS;
-- 删除指定日期之前的binlog
PURGE BINARY LOGS BEFORE '2026-09-01 00:00:00';
-- 或者只保留最近3天的
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
如果不需要主从复制,可以在my.cnf里关闭binlog(注释掉log-bin那行),重启MySQL。但关闭前确认没有从库依赖。
系统日志
du -sh /var/log/
journalctl --disk-usage
journalctl --disk-usage会显示systemd日志占了多少空间。清理方法:
# 只保留最近3天的日志
journalctl --vacuum-time=3d
# 或者限制总大小为500MB
journalctl --vacuum-size=500M
PHP日志
du -sh /var/log/php*
ls -lh /var/log/php*/
PHP-FPM的慢日志和错误日志也可能占空间,清理方式同样是清空内容而不是删除文件。
第三步:备份文件——第二号空间杀手
很多站长在服务器上做了自动备份,备份文件存在本地磁盘。时间一长,备份文件就把磁盘塞满了。
常见备份文件位置
# 网站目录下的备份
find /var/www -name "*.sql" -o -name "*.tar.gz" -o -name "*.zip" 2>/dev/null | head -20
# 宝塔面板的备份目录(如果用了宝塔)
du -sh /www/backup/
# 常见的自定义备份目录
du -sh /backup/ /home/backup/ 2>/dev/null
清理策略
先确认备份的完整性。不要一上来就删,先确认最新的备份是好的,再清理旧的:
# 查看备份文件列表,按时间排序
ls -lht /www/backup/ | head -20
保留最近3-7天的备份,删除更早的:
# 删除7天前的备份文件
find /www/backup/ -type f -mtime +7 -delete
长期方案:把备份传到远程对象存储,不要在本地磁盘保留备份。本地备份和服务器在同一块磁盘上,服务器磁盘挂了,备份跟着一起完蛋。
第四步:其他常见占用源
缓存和临时文件
du -sh /tmp/ /var/tmp/ /var/cache/
/tmp目录下可能堆积了大量临时文件,清理:
rm -rf /tmp/*
注意:不要删/tmp目录本身,只删里面的内容。
Docker占用
如果服务器上跑了Docker:
docker system df
查看镜像、容器、数据卷占用的空间。清理:
# 清理未使用的镜像、容器、网络
docker system prune -a
# 清理未使用的数据卷(注意:这会删除未被容器使用的卷)
docker volume prune
网站上传目录
如果是WordPress或其他CMS,检查上传目录:
du -sh /var/www/你的网站/wp-content/uploads/
有些网站因为用户上传了大量图片或附件,uploads目录能占几十GB。这个目录不能直接删,但可以考虑把上传文件迁移到对象存储,或者接入CDN,减少本地磁盘占用。
邮件队列
如果服务器上跑了邮件服务:
mailq
du -sh /var/spool/mail/ /var/mail/
邮件队列堆积时,可以清空:
postsuper -d ALL
第五步:清理后的验证
清理完成后,确认磁盘空间已经释放:
df -h
如果空间确实释放了,再检查一遍关键服务是否正常:
systemctl status nginx
systemctl status mysql
systemctl status php-fpm
注意:如果清理日志文件时用的是rm而不是> file,df可能显示空间没释放(因为文件句柄还在被进程占用)。解决方法是重启占用文件的进程,或者用lsof | grep deleted找到被删除但仍被占用的文件,然后重启对应服务。
预防措施:别让磁盘再满
配置日志轮转。Nginx、MySQL、PHP的日志都配上logrotate,设置保留天数和压缩。
备份不存本地。备份文件直接传到远程对象存储,本地只保留最近1-2天的。
监控磁盘使用率。写个简单的监控脚本,磁盘超过80%时发邮件告警:
#!/bin/bash
THRESHOLD=80
CURRENT=$(df / | grep / | awk '{print $5}' | sed 's/%//')
if [ $CURRENT -gt $THRESHOLD ]; then
echo "磁盘使用率 ${CURRENT}%,超过阈值" | mail -s "磁盘告警" admin@你的邮箱.com
fi
加到cron里每天跑一次。
定期清理。养成习惯,每周登录服务器跑一次df -h和du -sh /*,提前发现苗头。
香港VPS的磁盘空间普遍不大,磁盘满了之后系统会连锁崩溃。排查流程很清晰:df看整体 → du逐层定位 → 清理日志/备份/缓存 → 验证空间释放 → 配置轮转和监控防止复发。最关键的是不要盲目删文件,尤其不要用rm删正在被写入的日志文件——清空内容才是正确做法。