一觉醒来天塌了,服务器宕机了

早上醒来,习惯性打开自己的博客,准备写篇文章。按下回车的那一刻,我瞬间懵了——页面只剩空白框架,完全没有内容。我的博客架构采用 Golang + Nuxt + MySQL + Redis,多年开发经验让我立刻冷静分析:前端能正常加载,大概率是接口或数据库出了问题。

马上 SSH 连接服务器排查,Nuxt、Golang 后端服务均运行正常,但日志里一行报错直接锁定问题:

MySQL 连接失败: dial tcp 127.0.0.1:3306: connect: connection refused

MySQL 直接挂了。临时重启数据库后网站恢复访问,但治标不治本,必须深挖根源,彻底解决隐患。

一、从 MySQL 日志定位异常

查看数据库日志,我发现几个关键现象:

  • 日志反复出现 MySQL Server - start
  • 频繁触发 XA crash recovery 崩溃恢复
  • 进程 PID 不断变化

典型问题:MySQL 被系统强制杀死 → 自动重启 → 再次被杀 → 循环崩溃

二、层层排查,锁定两大元凶

服务器 MySQL 异常,通常只有4种原因:内存不足被 OOM 杀死、工具自动重启、配置错误、磁盘空间爆满。

执行命令排查内存:

dmesg -T | grep -i "out of memory"

果然查到 Out of memory 记录,数据库因内存不足被系统杀掉。
进一步检查磁盘,发现数据盘使用率高达92%,日志疯狂堆积,双重压力直接压垮服务器。

排除工具重启、配置错误等因素后,确定核心问题:2G 低配服务器内存紧张,无 Swap 兜底;系统日志无管控,撑满磁盘空间

三、动手修复,长效优化

1. 补齐 Swap 虚拟内存,兜底内存溢出

我的服务器仅2G物理内存,同时跑多个服务,却没有配置 Swap 分区。
Swap 就是 Linux 的虚拟内存,用硬盘空间充当备用内存,是小内存服务器的保命配置。

一键创建4G Swap 分区:

# 创建并启用Swap
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 调整内存使用策略
echo "vm.swappiness=60" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

配置完成后,内存资源得到兜底,再也不会因瞬间峰值杀死 MySQL。

2. 清理磁盘,限制日志大小

根目录磁盘使用率高达90%,元凶是 /var/log 日志疯狂堆积,仅 journal 日志就占3G。

批量清理冗余日志,永久限制日志占用:

# 清理旧压缩日志
sudo find /var/log -name "*.gz" -delete
# 清理运行日志
sudo truncate -s 0 /var/log/*.log
# 限制日志最大占用
sudo journalctl --vacuum-size=100M

修改配置文件,永久约束日志大小,杜绝后续磁盘爆满问题。

四、复盘总结

这次深夜宕机给我狠狠上了一课!
很多个人站长都在用2G低配服务器,看似稳定运行,实则暗藏致命隐患。Swap 分区不能省、系统日志必须管控,内存溢出、磁盘爆满,足以让整个服务一夜崩塌。

运维无小事,细节决定稳定性。后续我会常态化巡检服务器资源,定期清理冗余文件,守住服务平稳运行的底线。

评论 (0)

暂无评论