ECS任务多端口配置问题:单目标组暴露双端口并通过负载均衡路由
解决ECS任务多端口通过负载均衡器路由的问题
单个ECS目标组只能绑定一个端口,没法在同一个目标组里注册两个不同端口的任务实例。以下是两种可行的解决方案:
方案一:使用两个目标组分别路由
这是最直接的分流方案,利用负载均衡器的监听规则区分流量:
- 在ECS任务定义里配置两个端口映射:将容器的3000端口映射到对应网络端口,4001端口同理完成映射
- 创建两个目标组:
- 目标组A:端口设为3000,目标类型选
IP(awsvpc模式)或实例(bridge模式) - 目标组B:端口设为4001,目标类型与A保持一致
- 目标组A:端口设为3000,目标类型选
- 在负载均衡器上配置监听规则:
- 针对HTTP 80端口,添加规则:路径匹配
/api/*时转发到目标组A - 另一条规则:路径匹配
/ws/*时转发到目标组B - 也可通过域名分流:
api.yourdomain.com转发到目标组A,ws.yourdomain.com转发到目标组B
- 针对HTTP 80端口,添加规则:路径匹配
- 更新ECS服务,将两个目标组关联到服务中,任务启动后会自动注册到这两个目标组
方案二:用反向代理统一入口
如果希望只用一个端口对外暴露,可在ECS任务内添加反向代理(如Nginx),将单端口流量转发到内部两个服务:
- 修改ECS任务定义,添加Nginx容器(或在应用容器中安装Nginx),配置端口映射:将Nginx的80端口对外暴露
- 编写Nginx配置文件实现路径转发:
server { listen 80; # 转发REST API请求到3000端口 location /api { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 转发WebSocket请求到4001端口,需配置WebSocket专属头 location /ws { proxy_pass http://localhost:4001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 创建一个目标组,端口设为80,关联到负载均衡器的80端口监听,所有流量先到Nginx,再由Nginx内部转发至对应服务
注意事项
- 若使用awsvpc网络模式,目标组必须选择
IP类型,ECS会自动将任务的ENI IP注册到目标组 - WebSocket转发必须配置
Upgrade和Connection头,否则无法维持长连接 - 使用反向代理时,需确保Nginx容器与应用容器在同一任务内,可通过
localhost互相访问端口
内容的提问来源于stack exchange,提问作者rholdberh
相关产品推荐
相关产品推荐

