PM2启动后接口一直502,是配置问题吗?

瑞娜 阅读 29

我用PM2部署了一个Node.js的Express服务,本地跑得好好的,但部署到服务器上用Nginx反向代理后,访问接口一直返回502 Bad Gateway。

PM2进程显示是online状态,端口也监听了,但Nginx日志里提示“connect() failed (111: Connection refused)”。我试过改PM2的启动文件路径、端口号,甚至直接用node app.js在后台运行都能正常访问,唯独PM2不行。

我的PM2配置文件ecosystem.config.js是这样写的:

module.exports = {
  apps: [{
    name: 'my-api',
    script: './app.js',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3001
    }
  }]
}

是不是哪里没配对?为什么PM2启动的服务Nginx连不上?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
东景
东景 Lv1
看起来是Nginx和PM2之间的连接配置出了问题。推荐的做法是先检查Nginx的upstream配置是否正确指向了PM2启动的服务端口。

首先确认你的Nginx配置文件里proxy_pass的地址是否正确。假设你的服务器IP是127.0.0.1,PM2监听3001端口的话,Nginx配置应该这样写:

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}


还有个容易忽略的地方,确保防火墙没把端口封死。虽然你说直接用node app.js能跑通,但还是建议排查下iptables或者云服务的安全组设置。

另外补充一句,我遇到过类似情况,有时是PM2的日志权限问题导致服务没完全启动。可以检查下~/.pm2/logs/目录的读写权限,确保PM2有权限写入日志。

总之先从这几个方向排查,八成能找到问题所在。折腾这些配置确实挺烦人,但搞定了就很爽。
点赞
2026-03-31 20:03
开发者瑞腾
看起来问题出在端口配置上。你用PM2启动时,Nginx反向代理的端口可能和实际服务监听的端口不一致。

首先检查Nginx配置文件里proxy_pass指向的地址和端口。假设你的nginx.conf里这样配置:

server {
listen 80;
location / {
proxy_pass http://127.0.0.1:3001;
}
}


这表示Nginx会把请求转发到本地的3001端口。但有个细节要注意,当使用PM2 cluster模式时(即instances大于1),实际上会使用不同的端口范围。

建议把ecosystem.config.js改成这样:

module.exports = {
apps: [{
name: 'my-api',
script: './app.js',
instances: 'max', // 动态分配
exec_mode: 'cluster',
env: {
NODE_ENV: 'production'
}
}],
deploy: {
production: {
port: 3001 // 统一指定端口
}
}
}


然后重启PM2和Nginx。记得用 pm2 start ecosystem.config.js --env production 启动。这样写法更优雅,也能解决端口冲突问题。

顺便说一句,我之前也被这个问题折腾过,真是够呛。调整好端口映射后应该就没问题了。
点赞
2026-03-26 16:18