如何在PM2上运行Node.js应用?多项目部署访问异常求助
解决两个PM2部署项目访问混淆的问题
兄弟,我之前也踩过这个坑,大概率是端口冲突或者PM2进程/反向代理配置的问题,咱们一步步排查解决:
1. 先确认PM2进程状态
登录服务器后,先执行这条命令查看所有PM2管理的进程:
pm2 list
重点看这两个关键信息:
- 两个项目的
name是不是重复了(如果没指定名称,可能都叫www,很容易混淆) - 每个进程的
PORT列是不是不同的端口号,如果两个项目用了同一个端口(比如都是3000),那第二个项目要么启动失败,要么被第一个项目的端口占用,导致访问时跳转到第一个项目的内容。
2. 检查第二个项目的端口配置
打开第二个项目的www文件(或者主入口文件比如app.js),找到监听端口的代码:
app.listen(3000, () => { console.log('Server running on port 3000'); });
确保这里的端口号和第一个项目不一样,比如改成3001。如果项目用环境变量指定端口(比如process.env.PORT),要确认启动时有没有设置不同的环境变量,或者配置文件里的端口是否正确。
3. 用PM2启动时明确区分项目
为了避免进程名称混淆,启动第二个项目时指定一个唯一名称,同时确保端口正确:
# 给第二个项目命名为second-app,指定端口3001 pm2 start www --name "second-app" -- --port 3001
这里的-- --port 3001是把端口参数传递给Node.js项目(如果你的项目支持命令行传参的话)。如果项目用环境变量配置端口,也可以这样启动:
PORT=3001 pm2 start www --name "second-app"
4. 检查反向代理配置(如果用了Nginx)
如果你的项目通过Nginx反向代理对外提供服务,要检查Nginx的配置文件(一般在/etc/nginx/sites-available/目录下),确保不同域名/路径指向对应端口:
比如第一个项目的配置:
server { listen 80; server_name first-app.yourdomain.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; } }
第二个项目的配置要指向3001端口:
server { listen 80; server_name second-app.yourdomain.com; location / { proxy_pass http://localhost:3001; proxy_set_header Host $host; } }
修改后重启Nginx生效:sudo systemctl restart nginx
5. 查看第二个项目的启动日志
如果以上步骤都没问题,还是访问异常,就看看第二个项目的PM2日志,排查是否有启动报错:
pm2 logs second-app
日志里可能会提示端口被占用、依赖缺失等问题,帮你快速定位根源。
最后验证
重启第二个项目的PM2进程:
pm2 restart second-app
再访问第二个项目的URL,应该就能正常显示预期内容了。
内容的提问来源于stack exchange,提问作者suresh
相关产品推荐
相关产品推荐

