AWS容器中Docker部署的Node.js服务无法访问问题排查
AWS部署后Node后端接口返回React HTML页面的排查与解决
问题场景
本地开发/本地Docker运行时,http://localhost:3030/dbtest可正常返回接口数据;部署到带负载均衡的AWS EC2容器后,请求http://jermasearch.com:3030/dbtest却返回React应用的HTML页面。已确认Node服务和React应用均正常启动,3030端口开放,怀疑Nginx或负载均衡配置存在问题。
排查与解决步骤
1. 检查负载均衡器(ALB)的端口转发规则
- 登录AWS控制台,进入EC2负载均衡器页面,找到对应ALB
- 确认是否添加了3030端口的监听器:
- 若未添加,新建监听器:协议选择HTTP/HTTPS,端口设为3030
- 配置目标组,将流量转发到EC2实例的3030端口,同时确保目标组的健康检查规则指向Node服务的健康接口(如
/dbtest)
- 若ALB未配置3030端口转发,请求会被默认路由到80端口的Nginx,从而返回React页面
2. 验证EC2安全组配置
- 确保EC2实例的安全组允许负载均衡器安全组访问3030端口(而非仅开放公网访问)
- 若需直接通过公网访问EC2的3030端口,需放行0.0.0.0/0的3030入站流量(不推荐此方式,建议通过ALB转发更安全)
3. 优化Nginx配置(避免暴露3030端口的更优方案)
无需单独暴露3030端口,让Nginx监听80端口,将特定路径反向代理到Node服务:
server { listen 80; server_name jermasearch.com; # 处理React静态文件 location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } # 反向代理Node后端接口 location /api/ { proxy_pass http://localhost:3030/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
配置完成后,前端请求/api/dbtest即可转发到Node服务,无需使用3030端口,同时避免端口暴露的安全风险。
4. 确认Docker容器端口配置
- 检查Dockerfile是否包含
EXPOSE 80 3030指令,确保容器内端口正确暴露 - 确认EC2上运行容器的命令是否正确映射了3030端口(如
docker run -p 80:80 -p 3030:3030 <镜像名>)
5. 分步验证
- 先在EC2实例内部测试:执行
curl http://localhost:3030/dbtest,确认Node服务在容器内正常响应 - 测试ALB的3030端口:
curl http://<ALB域名>:3030/dbtest,验证负载转发是否生效 - 最后测试域名:
curl http://jermasearch.com:3030/dbtest(或使用优化后的/api/dbtest路径)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

