将Node.js后端部署到AWS ELB时遭遇502 Bad Gateway/Nginx错误求助
AWS ELB部署Node.js后端出现502 Bad Gateway/Nginx错误排查与解决
问题描述
部署Node.js后端到AWS ELB(已配置AWS RDS PostgreSQL)时出现502 Bad Gateway错误,Nginx日志显示:
"http://127.0.0.1:8080/", host: "172.31.30.177"
2022/12/01 21:42:06 [error] 32487#32487: *55 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.42.14, server: , request: "GET /.env HTTP/1.1", upstream: "http://127.0.0.1:8080/.env", host: "54.242.94.106"
同时环境健康状态从Degraded变为Severe:100%请求触发HTTP 5xx错误,所有ELB实例进程不健康,初始化完成耗时86秒,所有实例服务受损。
Node.js服务器代码如下:
const express = require('express') const server = express() const PORT = process.env.PORT const cors = require('cors') const pizzaRouter = require('./api/pizza/pizza-router') const toppingsRouter = require('./api/toppings/toppings-router') server.use(express.json()) server.use(cors()) server.use('/api/pizza',pizzaRouter) server.use('/api/toppings',toppingsRouter) server.get('/', (req,res) => res.json({message:'This better work'})) server.listen( PORT, () => { console.log(`Server listening on PORT ${PORT} `) })
注:未给PORT环境变量赋值,之前尝试443、5000等端口均无效。
核心原因与解决步骤
1. 端口不匹配导致连接拒绝
Nginx日志明确显示尝试连接127.0.0.1:8080但被拒绝,说明Node.js服务实际监听端口与Nginx/ELB转发端口不一致。
- 固定监听端口并同步配置:修改Node.js代码,添加默认端口兜底,避免PORT未赋值时服务无法启动:
const PORT = process.env.PORT || 3000; - 检查Nginx配置:确保upstream指向Node.js实际监听的端口:
upstream node_server { server 127.0.0.1:3000; # 与Node.js监听端口保持一致 }
2. ELB健康检查配置错误
ELB实例不健康,说明健康检查的路径、端口或协议不匹配:
- 确认ELB健康检查端口与Node.js服务监听端口一致;
- 健康检查路径指定为服务中存在的接口(比如根路径
/),确保返回200状态码; - 检查安全组规则:允许ELB所在安全组访问EC2实例的服务端口,同时EC2安全组开放该端口的入站规则。
3. 环境变量未正确传递
若使用环境变量指定PORT,需确保部署环境已正确设置:
- 若用Elastic Beanstalk,在控制台配置 > 软件中添加
PORT环境变量并设置值; - 若直接部署在EC2,在启动脚本中通过
export PORT=3000注入环境变量后再启动服务。
4. 服务启动失败排查
即使编译完成,仍需确认Node服务是否正常运行:
- 登录EC2实例,执行
netstat -tulpn | grep node查看是否有进程监听指定端口; - 查看Node服务启动日志,排查是否存在依赖缺失、RDS连接失败等导致服务启动后立即退出的问题。
内容的提问来源于stack exchange,提问作者Maybewecanhelp
相关产品推荐
相关产品推荐

