You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2实例运行2个及以上任务时AWS负载均衡器无法加载网页

问题描述

我是AWS新手,现有一个包含2个EC2实例的ECS集群,每个实例通过服务运行1个任务,所有实例都在开放80端口的同一目标组中。每个任务运行nginx(容器端口80映射主机端口80)、react和express容器,同时我还拥有一个RDS实例。

当前尝试为该目标组配置负载均衡器以实现对nginx容器的负载均衡,但配置后网页无法加载,仅显示空白页面;但仅运行1个实例时,网页可正常加载。我已检查并重新配置所有安全组,但问题仍未解决。

以下是我的任务定义:

{"family": "task-td","containerDefinitions": [{"name": "task-client","image": "public.ecr.aws/react-container","cpu": 0,"portMappings": [{"name": "task-client-5173-tcp","containerPort": 5173,"hostPort": 5173,"protocol": "tcp","appProtocol": "http"}],"essential": true,"environment": [],"mountPoints": [],"volumesFrom": []},{"name": "task-server","image": "public.ecr.aws/express-api-container","cpu": 0,"portMappings": [{"name": "task-server-3000-tcp","containerPort": 3000,"hostPort": 3000,"protocol": "tcp","appProtocol": "http"}],"essential": true,"environment": [{"name": "PGHOST","value": "rds.amazonaws.com"},{"name": "PGPORT","value": "5432"},{"name": "PGUSER","value": "postgres"},{"name": "PGDATABASE","value": "task"},{"name": "PGPASSWORD","value": "postgres123"}],"mountPoints": [],"volumesFrom": []},{"name": "nginx","image": "public.ecr.aws/nginx-container","cpu": 0,"links": ["task-client","task-server"],"portMappings": [{"name": "nginx-80-tcp","containerPort": 80,"hostPort": 80,"protocol": "tcp","appProtocol": "http"}],"essential": true,"environment": [],"mountPoints": [],"volumesFrom": []}],"taskRoleArn": "/ecsTaskExecutionRole","executionRoleArn": "/ecsTaskExecutionRole","networkMode": "bridge","requiresCompatibilities": ["EC2"],"cpu": "256","memory": "256","runtimePlatform": {"cpuArchitecture": "X86_64","operatingSystemFamily": "LINUX"}}
排查与解决方案

针对多实例负载均衡后出现空白页的问题,从配置逻辑和实际运行场景出发,优先检查以下几点:

1. 主机端口冲突排查

每个ECS实例上的任务都把nginx容器映射到主机80端口,单实例没问题,但要确认EC2实例本身是否有其他进程占用80端口(比如系统自带的httpd、nginx服务)。

  • 登录EC2实例,执行netstat -tulpn | grep :80查看端口占用情况。如果有冲突,要么停止冲突进程,要么修改nginx容器的hostPort为其他端口(比如8080),同时更新目标组的监听端口和负载均衡器的转发规则。

2. Nginx反向代理配置验证

任务里用links关联了client和server容器,但要确保nginx配置里的服务地址是容器别名而非固定IP:

  • 进入nginx容器内部,执行docker exec -it <nginx容器ID> cat /etc/nginx/nginx.conf,检查反向代理地址是否为task-client:5173和task-server:3000。如果配置里写的是某个EC2实例的IP,跨实例时会寻址失败,导致页面无法加载资源。

3. 目标组健康检查状态确认

负载均衡的目标组健康检查配置错误会导致流量分发异常:

  • 登录AWS控制台,进入EC2负载均衡器页面,查看目标组中两个EC2实例的健康状态。如果存在不健康的实例,负载均衡可能会把流量分发到异常实例,或者来回切换导致页面空白。
  • 确认健康检查的路径是nginx能正常返回200状态码的页面(比如/),调整健康检查的超时、间隔时间参数,避免误判。

4. React应用API地址配置修正

如果React应用打包时硬编码了单实例的API地址,负载均衡到其他实例时会请求错误的服务:

  • 修改React应用的API请求地址为相对路径(比如/api),然后在nginx配置中添加反向代理规则,把/api路径转发到task-server:3000,确保每个实例的client容器都能访问本地的server容器。

5. ECS任务资源限制检查

任务配置的CPU(256核)和内存(256M)可能不足,导致多实例运行时容器崩溃:

  • 进入ECS控制台,查看对应任务的容器日志,检查nginx、client、server容器是否有内存不足、CPU超限的报错。如果存在资源瓶颈,调高任务的CPU和内存配置(比如改为512 CPU和512内存)。

内容的提问来源于stack exchange,提问作者Jon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:17:33