AWS ECS Fargate部署React镜像遇ELB健康检查失败求助
问题排查与解决方案
核心问题在于容器内Nginx实际监听80端口,但你的ECS全链路配置都指向3000端口,导致流量无法到达容器,触发ELB健康检查失败。
本地运行正常的原因
你本地用docker run -p 3000:80,是把主机的3000端口映射到容器的80端口(Nginx默认监听端口),所以能正常访问。但ECS配置里错误地将容器端口指定为3000,和容器内实际运行的服务端口不匹配。
具体修复方案
方案一:调整ECS配置适配容器默认端口(最快解决)
- 修改ECS任务定义:
将PortMappings中的ContainerPort改为80:PortMappings: - ContainerPort: 80 Protocol: tcp - 修改目标组配置:
将TargetGroup的Port和HealthCheckPort都改为80。 - Listener配置可保留3000(外部用户通过ALB的3000端口访问,转发到容器80端口),也可根据需求改为80。
方案二:修改Docker镜像让Nginx监听3000端口(适合需固定容器端口的场景)
- 在项目根目录创建
nginx.conf文件,内容如下:server { listen 3000; root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ /index.html; } } - 修改Dockerfile的Nginx阶段,添加配置文件复制命令:
FROM node:alpine as build WORKDIR /app COPY package*.json . RUN npm install COPY . . RUN npm run build FROM nginx:1.19 WORKDIR /usr/share/nginx/html RUN rm -rf ./* # 复制自定义Nginx配置,替换默认配置 COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 3000 COPY --from=build /app/build . - 重新构建并推送镜像到ECR,保持现有ECS配置不变即可正常运行。
额外检查项
- 确认Fargate任务的安全组允许来自ALB安全组的流量(你的当前安全组开放了0.0.0.0/0,此问题可忽略,但生产环境建议限制来源为ALB安全组)。
- 确认TargetGroup的
HealthCheckPath为/(React静态站点默认index.html存在,无需修改)。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

