部署在EC2的React+Express应用20分钟后无法访问求助
故障原因分析与排查方案
1. SSH会话超时导致进程终止
你通过AWS控制台SSH启动的npm run start:prod是前台进程,当SSH会话因超时(通常默认15-30分钟)断开时,前台运行的Node.js进程会被系统终止,直接导致服务无法访问——这是此类场景最常见的诱因。
- 排查:20分钟后重新SSH登录实例,执行
ps aux | grep node,如果看不到相关的Node/Express/React进程,即可确认。 - 解决:使用后台进程管理工具启动服务:
- 临时方案:用
nohup npm run start:prod &,进程会在后台运行,日志输出到nohup.out - 持久方案:用
tmux或screen创建持久化会话,即使SSH断开,会话内的进程仍会运行 - 生产环境标准方案:用
pm2这类专业进程管理器,安装后执行pm2 start npm --name "your-app" -- run start:prod,它会自动守护进程,崩溃后自动重启
- 临时方案:用
2. 系统OOM Killer终止进程
如果EC2实例是低内存配置(比如t2.micro),同时运行Express和React开发服务可能占用过多内存,触发系统的内存不足(OOM)杀手,强制终止进程。
- 排查:执行
dmesg | grep -i oom或查看/var/log/messages日志,搜索"Out of memory"或"Killed process"相关记录,确认是否有Node进程被OOM Killer杀掉。 - 解决:
- 升级EC2实例的内存配置
- 优化应用架构:生产环境不要运行React开发服务器,先执行
npm run build生成静态文件,再让Express直接托管静态文件,大幅降低内存消耗 - 修改
start:prod脚本,把nodemon换成普通node命令(nodemon是开发热重载工具,生产环境不需要)
3. 开发工具在生产环境运行导致不稳定
你的start:prod脚本混用了开发工具:
nodemon会监听文件变化并重启进程,生产环境中若有文件意外修改,可能导致进程频繁重启甚至崩溃- React开发服务器(
npm run client默认指向的服务)本身不适合生产环境,性能差且无稳定性保障 - 排查:查看应用日志(若有)找崩溃前的报错;或20分钟后执行
netstat -tlpn | grep 3000,确认3000端口是否还被监听 - 解决:重构生产启动流程:
- 在client目录执行
npm run build生成静态构建文件 - 修改Express代码,添加静态文件托管逻辑,指向
client/build目录 - 修改
start:prod脚本为:"export NODE_ENV=production && node server.js"(假设Express入口是server.js),移除concurrently、nodemon和React开发服务
- 在client目录执行
4. 基础设施层面额外排查点
- 检查EC2实例状态:登录AWS控制台,确认实例处于"运行中",查看CloudWatch监控是否有CPU/内存突增情况
- 检查端口监听:20分钟后登录实例,执行
ss -tulpn | grep 3000,确认端口是否仍被Node进程占用 - 检查实例内部防火墙:执行
iptables -L,确认没有拦截3000端口的规则
内容的提问来源于stack exchange,提问作者DeanPortman
相关产品推荐
相关产品推荐

