You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在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端口是否还被监听
  • 解决:重构生产启动流程:
    1. 在client目录执行npm run build生成静态构建文件
    2. 修改Express代码,添加静态文件托管逻辑,指向client/build目录
    3. 修改start:prod脚本为:"export NODE_ENV=production && node server.js"(假设Express入口是server.js),移除concurrently、nodemon和React开发服务

4. 基础设施层面额外排查点

  • 检查EC2实例状态:登录AWS控制台,确认实例处于"运行中",查看CloudWatch监控是否有CPU/内存突增情况
  • 检查端口监听:20分钟后登录实例,执行ss -tulpn | grep 3000,确认端口是否仍被Node进程占用
  • 检查实例内部防火墙:执行iptables -L,确认没有拦截3000端口的规则

内容的提问来源于stack exchange,提问作者DeanPortman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:52:51