如何解决Elastic Beanstalk部署Node.js时的502 Bad Gateway错误
根据你提供的日志和配置,核心问题是Nginx无法连接到Node.js应用服务(日志显示connect() failed (111: Connection refused)),以下是具体排查和修复步骤:
1. 端口配置冲突(最可能的原因)
Elastic Beanstalk的Node.js环境会自动为应用分配一个随机端口,并通过PORT环境变量传递给应用,但你自定义的Nginx配置里硬编码了127.0.0.1:3000作为上游地址,这会导致Nginx代理的端口和应用实际监听的端口不匹配。
修复:
修改.platform/nginx/nginx.conf中的upstream配置,使用Elastic Beanstalk的环境变量指定端口:
upstream node { server 127.0.0.1:${PORT}; keepalive 1024; }
或者使用平台自动生成的端口文件:
upstream node { server 127.0.0.1:`cat /var/elasticbeanstalk/staging/port`; keepalive 1024; }
2. 生产环境依赖缺失
你的package.json中将swagger-ui-express、swagger-jsdoc等生产环境需要的包放在了devDependencies中,而Elastic Beanstalk在部署时会默认安装dependencies下的依赖,忽略devDependencies,导致应用启动时找不到模块,进而启动失败。
修复:
将生产依赖移到dependencies中:
"dependencies": { // ... 现有依赖 "swagger-ui-express": "^5.0.0", "swagger-jsdoc": "^6.2.8" }, "devDependencies": { // ... 移除上述两个包 }
3. 检查应用启动脚本与打包输出
你的package.json中start脚本为node main.js,而webpack打包输出的文件是dist/main.js,CI/CD流程中已将package.json复制到dist目录,这部分逻辑是对的,但需要确认:
- webpack配置是否正确将所有模块打包到
main.js中(如果使用了webpack-node-externals,则需确保生产环境能安装所有外部依赖) - 本地模拟生产环境启动验证:
访问npm run build cd dist npm install --production npm starthttp://localhost:3000/health确认应用是否正常响应。
4. 查看应用启动日志
登录Elastic Beanstalk控制台,或通过SSH连接到EC2实例,查看应用启动日志/var/log/nodejs/nodejs.log,确认是否有模块缺失、语法错误等启动失败原因。
5. 检查Procfile配置
如果项目中存在Procfile,确保其内容为:
web: npm start
Elastic Beanstalk会优先使用Procfile中的命令启动应用,若配置错误会导致服务无法启动。
内容的提问来源于stack exchange,提问作者joon

