AWS EC2实例不可访问故障求助(搭载Rails、Phusion Passenger)
故障1:实例偶发无法SSH连接、应用无法访问,仅重启实例可恢复
可能诱因
- 实例资源完全耗尽:如果使用的是AWS T系列突发型实例,CPU积分耗尽后会被强制限流到极低水平,系统完全无法响应任何请求;也可能是内存/IO资源打满,swap配置不合理(比如swappiness值过低、swap空间不足、swap挂载在实例临时存储上随负载异常失效),导致内核无响应
- EC2底层异常:实例所在宿主机硬件故障,或者实例网络栈崩溃,触发EC2实例状态检查失败
- 内核缺陷:当前运行的AWS定制内核存在内存泄漏bug,长时间运行后内核态内存占满,无法处理任何系统调用
解决方案
- 先通过CloudWatch查看故障时间点的监控数据:CPU利用率、CPU积分使用量(T系列实例)、网络吞吐、磁盘IO,已安装CloudWatch Agent的可直接查看内存/swap占用情况,先定位根因
- 若为T系列实例积分耗尽问题,可切换为C/M系列通用计算实例,或开启实例无限积分模式
- 调整swap配置:执行
sysctl -w vm.swappiness=10,并将配置写入/etc/sysctl.conf永久生效;swap空间分配为物理内存的1~2倍,确保swap挂载在持久化EBS卷上 - 升级实例内核到AWS官方最新稳定版本,安装
oomd服务提前终止异常高内存占用进程,避免系统完全卡死 - 配置CloudWatch告警,触发实例状态检查失败、CPU利用率持续100%超过5分钟等规则时,自动执行实例重启操作
故障2:Rails应用自动停止,application/current目录被删除,需重新部署恢复
可能诱因
- 部署脚本逻辑异常:如果使用Capistrano类部署工具,
current是指向最新版本的软链接,部署过程中失败回滚逻辑有bug、旧版本清理规则错误,都会导致current软链接被误删且未重建 - 定时清理任务配置错误:系统层面的定时清理脚本(比如tmp清理、日志轮转脚本)规则匹配范围过大,误将应用目录下的内容判定为临时文件清理
- 目录权限配置不当:Apache/Passenger运行用户对应用根目录有写入权限,进程异常时误删目录内容
- 服务器被入侵,恶意脚本执行了目录删除操作
解决方案
- 排查部署脚本逻辑:重点检查旧版本清理规则、部署失败回滚钩子的代码,测试异常部署场景下的回滚逻辑是否正常,确保不会误删
current链接 - 遍历所有定时任务:执行
crontab -l查看用户定时任务,检查/etc/cron.d/、/etc/cron.hourly/等系统定时任务目录下的所有脚本,确认清理规则仅作用于/tmp、应用tmp、应用log等目录,不会匹配应用根目录 - 收紧应用目录权限:将
application根目录权限设置为755,所有者设为专用的部署用户,仅给tmp、log、public/uploads等需要写入的目录开放Apache/Passenger运行用户的写入权限,根目录禁止写入 - 配置目录变更审计:安装
inotify-tools,监控application目录的删除操作,记录删除动作对应的进程ID和执行用户,快速定位异常来源 - 配置自动恢复规则:检测到
current目录不存在时自动触发部署流程,降低故障影响时间
内容的提问来源于stack exchange,提问作者Dimcha
相关产品推荐
相关产品推荐

