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
相关产品推荐
相关产品推荐

