AWS环境下两个容器能否来回切换共用同一IP:PORT提供服务?
可行实现方案
方案1:单低配ECS运行Nginx四层反向代理(最低改造成本)
你只需要保留当前的最低配备用服务器实例即可,无需额外付费资源:
- 把备用服务器上的伪造MC服务端口改成非25565的本地端口(比如
25566),避免端口冲突 - 在该实例上安装Nginx并开启stream模块,配置TCP反向代理监听
25565端口,默认上游为本地127.0.0.1:25566的备用服务 - 给Nginx加上TCP端口健康检查规则,定时探测全功能服务器的
25565端口状态,当探测到端口可连通时,自动将流量切换到全功能服务器的地址,探测失败时切回备用服务 - 原有备用服务触发全功能服务器启动的逻辑完全保留,可直接调用AWS CLI启动对应ECS全功能任务,无需修改
- 所有用户统一连接备用服务器的固定公网IP,全功能服务器不需要暴露公网IP,也不需要用户知晓其地址,流量全部通过该备用实例转发,完美解决共用IP的需求
该方案每月固定成本仅为最低配ECS的费用,AWS t4g.nano实例包月成本约3美元,完全符合低于5美元的成本要求。
方案2:轻量iptables动态端口转发(资源占用最低)
同样只需要保留最低配备用ECS,资源占用比方案1更低:
- 备用服务依然监听本地
25566端口 - 写一个简单的shell定时脚本,每隔2~3秒用
nc或者mcstatus工具检测全功能服务器的25565端口是否可访问 - 当检测到全功能服务器离线时,执行iptables规则把入方向
25565端口的流量转发到本地25566端口 - 当检测到全功能服务器在线时,修改iptables规则把
25565端口的流量通过DNAT转发到全功能服务器的IP地址 - 同样使用备用实例的固定公网IP作为用户唯一连接地址,全功能服务器无需暴露公网IP
该方案对低配实例的资源占用几乎可以忽略,成本和方案1完全一致。
方案3:网页手动触发启动(极致低成本)
如果可以接受用户手动触发启动,该方案成本几乎为0:
- 直接关停备用服务器,给全功能服务器绑定固定弹性IP,域名直接解析到该弹性IP
- 做一个简单的静态网页,放一个「启动服务器」按钮,点击后调用Lambda函数启动全功能ECS容器/实例,同时给用户展示启动倒计时提示
- 静态网页可以直接托管在S3上,Lambda调用成本几乎可以忽略,每月总成本不到1美元,远低于你的成本要求。
内容的提问来源于stack exchange,提问作者mmachenry
相关产品推荐
相关产品推荐

