AWS EC2上Node项目PM2启动显示online但无法访问如何解决?
问题原因排查
- 启动命令与实际项目入口不匹配:大部分Node项目的
npm start命令配置在package.json的scripts字段中,可能包含环境变量注入、ts文件实时转译、指定非app.js的自定义入口文件等逻辑,直接执行pm2 start app.js无法复现npm start的完整运行逻辑,会导致项目虽然进程启动,但实际未正常提供服务。 - 工作目录与环境变量加载异常:PM2启动时如果未指定项目根目录作为工作目录,会无法加载项目内的
.env配置文件、相对路径引用的静态资源等,也无法继承当前shell的运行环境变量,导致项目功能异常。 - 监听地址配置限制:如果项目配置的监听地址为
127.0.0.1,仅允许本地访问,虽然PM2进程显示为online,但外部无法正常请求到服务。 - 旧进程残留冲突:之前手动启动的进程未完全退出,占用3000端口,导致PM2启动的进程无法正常绑定端口,但PM2未捕获到该类异常仍显示状态为online。
解决步骤
- 清理历史异常PM2进程
pm2 delete all
如果存在其他正常运行的PM2进程,可替换为pm2 delete <对应的异常进程ID/名称>仅删除目标进程。
- 使用与手动启动完全一致的逻辑启动项目
直接通过PM2调用npm start命令,避免入口或参数不匹配问题:
pm2 start npm --name "node-project" -- start
如果当前执行命令的路径不在项目根目录下,需额外指定工作目录:
pm2 start npm --name "node-project" --cwd <你的项目根目录绝对路径> -- start
- 调整端口监听配置
将项目内的监听地址从127.0.0.1修改为0.0.0.0,以Express框架为例:
app.listen(3000, '0.0.0.0', () => { console.log('服务已启动,端口3000') })
- 验证运行状态
- 执行
pm2 logs node-project查看进程运行日志,确认无报错信息 - 执行
ss -tunlp | grep 3000确认3000端口已被Node进程正常监听
- 保存PM2配置
确认项目可以正常访问后,执行以下命令保存进程列表,保证开机自启规则生效:
pm2 save
内容的提问来源于stack exchange,提问作者Chamod Wijesena
相关产品推荐
相关产品推荐

