PM2启动后接口一直502,是配置问题吗?
我用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连不上?
首先确认你的Nginx配置文件里proxy_pass的地址是否正确。假设你的服务器IP是127.0.0.1,PM2监听3001端口的话,Nginx配置应该这样写:
还有个容易忽略的地方,确保防火墙没把端口封死。虽然你说直接用node app.js能跑通,但还是建议排查下iptables或者云服务的安全组设置。
另外补充一句,我遇到过类似情况,有时是PM2的日志权限问题导致服务没完全启动。可以检查下
~/.pm2/logs/目录的读写权限,确保PM2有权限写入日志。总之先从这几个方向排查,八成能找到问题所在。折腾这些配置确实挺烦人,但搞定了就很爽。
首先检查Nginx配置文件里proxy_pass指向的地址和端口。假设你的nginx.conf里这样配置:
这表示Nginx会把请求转发到本地的3001端口。但有个细节要注意,当使用PM2 cluster模式时(即instances大于1),实际上会使用不同的端口范围。
建议把ecosystem.config.js改成这样:
然后重启PM2和Nginx。记得用 pm2 start ecosystem.config.js --env production 启动。这样写法更优雅,也能解决端口冲突问题。
顺便说一句,我之前也被这个问题折腾过,真是够呛。调整好端口映射后应该就没问题了。