博客挂了?记一次因磁盘空间耗尽导致的Ghost宕机排查实录
前言:突发“404”的惊魂时刻
昨天正准备更新一篇新文章,打开博客却赫然发现页面一直在转圈,最后甚至直接报错。第一反应是:难道被DDoS了?还是VPS突然抽风?
作为一名爱折腾的博主,遇到这种突发断服的情况确实让人头大。 SSH连上去一查,罪魁祸首竟然是最不起眼的原因——磁盘空间被写满了。
今天就以此为例,复盘一下这次Ghost博客宕机的排查过程,聊聊如何避免这种低级错误导致的“事故”。
故障现场:Ghost为何如此脆弱?
Ghost是基于Node.js的博客系统,虽然轻量高效,但它对运行环境的要求其实并不低。当磁盘利用率达到100%时,不仅仅是图片传不上去那么简单,Node.js进程在尝试写入日志文件、Session数据或生成临时缓存时,若磁盘无响应或写入失败,进程往往会直接崩溃或陷入死循环。
Web服务崩溃时常见的 502 Bad Gateway 错误提示
这次故障的症状很典型:
- 前端页面无法打开:浏览器一直在加载,最终返回502或504错误。
- 后台进不去:管理页面同样挂掉。
- 服务进程异常:检查进程发现Ghost相关的Node进程已经停止运行。
排查思路:一步步揪出元凶
既然服务停了,我们首先要做的不是重启,而是找原因。盲目重启只会让服务在几秒后再次挂掉。
1. 检查磁盘使用率
使用 df -h 命令检查磁盘空间,发现根目录已满
登录服务器后,第一时间执行老三样命令:
df -h
``
结果惊人,根目录(/)显示 Use% 100%。哪怕是日志狂涨,也很少在短时间内把磁盘撑爆。这时候需要进一步看是哪个目录在作妖。
### 2. 定位大文件与大目录
使用 `du` 命令逐层排查:
```bash
du -h --max-depth=1 /
``
经过一番筛选,最终发现 `/var/lib/mysql` 或者 `/var/log` 占用了大量空间。在Ghost的环境下,常见的情况有几种:
* **Nginx访问日志爆炸**:如果网站流量较大,且没有做日志轮转,access.log几个月就能吃掉几个G。
* **Ghost系统日志**:Ghost本身的日志文件如果不限制大小,也会无限增长。
* **数据库膨胀**:一些未清理的损坏事务日志或备份文件。
## 解决方案:清理与恢复
找到了原因,解决办法就很明确了。
### 快速清理(救火)
为了快速恢复服务,可以先清理一些非核心的大文件,比如压缩或删除老旧的Nginx日志:
```bash
# 清空nginx日志(慎用,确保不需要后再操作)
echo > /var/log/nginx/access.log
``
或者直接扩容磁盘(如果你的云平台支持在线扩容)。**注意:清理文件后,一定要记得重启Ghost服务:**
```bash
ghost restart
长期规避(防火)
光救火不够,还得建立防火机制。
1. 配置日志轮转
不要让日志无限增长。配置 logrotate 来自动切分和压缩日志。
编辑 /etc/logrotate.d/nginx(以nginx为例):
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
这样系统会自动保留最近14天的日志,旧的会被压缩。
2. 设置磁盘监控告警
这是最重要的一点。不要等磁盘满宕机了才发现。可以通过编写简单的脚本结合Crontab,或者使用现成的监控工具(如Uptime Kuma、Server酱等),当磁盘使用率超过85%时,立刻发送Telegram或微信通知给自己。
简单的Shell脚本示例:
#!/bin/bash
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $USAGE -gt 85 ]; then
echo "警告:磁盘使用率超过85%!当前:${USAGE}%" | mail -s "服务器警报" [email protected]
fi
总结
Ghost博客本身很稳定,但“环境”往往才是拖后腿的那一个。磁盘满导致的宕机虽然原理简单,但杀伤力极大,且往往发生在你最忙碌的时候。
定期检查日志、设置自动轮转、部署监控告警,做好这三点,基本上就能告别这种低级运维事故了。希望我的这次踩坑经历能给你提个醒!

评论已关闭