多台服务器共用一个IP地址的核心做法,是让所有服务器隐藏在内网里,只暴露一个公网入口,由这个入口按规则把请求转发给不同的服务器。这个入口可以是反向代理、负载均衡器,也可以是路由器的端口映射,别想着让几台机器直接抢同一个公网IP,那是行不通的,真正的解法是“中转”。
先理解:一个IP怎么“装”下多台服务器
公网IP的稀缺程度超出多数人的想象,据公开记录,全球IPv4地址早在2011年就由IANA分配完毕,亚太地区的地址池也在2019年耗尽,行业共识认为,IP地址枯竭是共享IP和端口复用技术被广泛采用的根本驱动力。
想让多台服务器共用一个IP,核心依赖两个东西:端口和转发规则。
一台服务器上,IP是“门牌号”,端口是“房间号”,公网IP只有一个,但端口有65535个,你完全可以让公网IP的80端口指向服务器A,8080端口指向服务器B,用户访问时带上不同的端口,请求就会落到不同的机器上。
但这只是最粗糙的做法,实际生产环境里,大家几乎不用“不同端口访问不同服务器”这种方案,因为用户记不住端口号,而且443和80之外的端口经常被运营商封锁,更主流的方案是让所有流量都走标准的80/443端口,由一台入口机“看情况”把请求分发给后端的服务器。
nginx反向代理多台服务器配置,最常用的免费方案
nginx是目前使用率最高的反向代理软件,也是实现多台服务器共用一个IP的最佳免费手段,它的工作方式很简单:nginx装在入口服务器上,绑定公网IP的80和443端口,然后把请求转发给内网里的其他服务器。
具体配置步骤
先在内网把两台业务服务器搭好,假设它们的IP分别是192.168.1.10和192.168.1.11,都监听8080端口,然后在入口服务器上做反代配置:
upstream backend_web {
server 192.168.1.10:8080 weight=1;
server 192.168.1.11:8080 weight=1;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这段配置的意思是把公网IP的80端口流量,按轮询方式均匀分给两台内网服务器,改动后执行
nginx -s reload 即可生效。
按域名分流,比按端口分流更实用
如果你的多台服务器上跑的是不同网站,不要用不同端口区分,而是用不同域名区分,在同一个公网IP下,nginx可以根据 server_name 把请求转发到不同的后端:
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://192.168.1.10:8080;
}
}
server {
listen 80;
server_name shop.example.com;
location / {
proxy_pass http://192.168.1.11:8080;
}
}
这样用户访问blog.example.com和shop.example.com时,看到的是不同网站,但他们的请求都来自同一个公网IP,配置成功后,nginx就是那扇“总大门”。
四层负载均衡方案,适合大流量企业
nginx工作在七层,能读懂HTTP协议,但如果后端服务器数量多、流量巨大,或者后端跑的不是HTTP服务(比如数据库、游戏服务器),就需要四层负载均衡方案,LVS(Linux Virtual Server)和HAProxy是主流选择。
VIP是怎么工作的
四层负载均衡方案里有一个概念叫VIP(虚拟IP),多台真实服务器共享一个虚IP,外部请求先到达VIP,负载均衡器再用NAT或DR模式把数据包分发到真实服务器。
以LVS的DR模式为例,客户端访问VIP时,LVS调度器改写数据包的目标MAC地址,把请求直接转给内网某台真实服务器,真实服务器处理完后,响应包绕过调度器直接回给客户端,整个过程对客户端完全透明,他们只知道那个VIP,并不知道后面有多台服务器在工作。
配置成本和维护门槛
这类方案的配置复杂度比nginx高不少,你需要给真实服务器配置VIP的回环地址,还要处理ARP抑制问题,业内专家指出,在流量没超过每秒万级并发请求的情况下,用nginx做七层转发完全够用,贸然上LVS反而会因为维护复杂而增加故障率。
服务器端口映射和反向代理哪个好?按场景选
这是一个被问得最多的问题,直接给结论:端口映射适合家里或小办公室场景,反向代理适合正规网站和企业业务。
| 对比维度 | 端口映射 | 反向代理(nginx) |
|---|---|---|
| 实现位置 | 路由器或防火墙上 | 操作系统应用层 |
| 是否需要额外服务器 | 不需要,用现有路由器 | 需要一台入口服务器 |
| 多台后端支持 | 支持,但端口号不容易统一 | 完全透明,后端端口可统一 |
| 精细路由(按域名、路径) | 不支持 | 支持 |
| HTTPS证书配置 | 每台后端各配各的 | 入口统一处理 |
| 适合场景 | 临时测试、家庭自建服务 | 生产环境、多站点、高可用 |
端口映射的逻辑是在路由器上做DNAT,示例:把公网IP的80端口映射到内网192.168.1.10的8080端口,把443端口映射到192.168.1.11的8443端口,配置起来确实快,但问题很多:
- 不同后端用不同端口,用户体验割裂。
- HTTPS证书无法统一管理,每台机器要单独申请证书。
- 路由器的NAT性能有限,高并发容易丢包。
- 多台后端之间没有健康检查,后端挂了业务就断。
在绝大多数需要稳定服务的场景下,反向代理都是优于端口映射的选择,除非你只有一两台服务器,且不追求统一入口的规范化体验,否则别用端口映射。
没公网IP?内网穿透服务器价格与风险
还有一种情况:服务器在机房内网或家里,没有独立的公网IP,也想让外部访问,这时就要用内网穿透工具,比如frp、ngrok、花生壳。
穿透工具的费用区间
内网穿透服务器价格差异很大,主要看带宽和并发要求,免费方案通常限制流量、限制自定义域名、并发很低,适合个人调试,商用方案的价格,据统计,一般在每月几十元到几百元不等,按带宽计费,具体到“内网穿透服务器价格”这个词,搜索结果里常见的套餐是:5Mbps带宽约100元/月,20Mbps带宽约500元/月。
用穿透部署生产环境靠谱吗
说实话,不推荐把核心生产业务跑在内网穿透上,穿透链路要经过第三方中转服务器,延迟和稳定性都不可控,如果只是临时调试、演示Demo,或者给客户展示项目效果,用frp自建穿透是完全可行的。
frp的自建方法:在一台有公网IP的云服务器上装frps服务端,在内网服务器上装frpc客户端,两端配置好token和端口映射规则,客户端主动外连服务端,公网流量就能通过frps转发进来,配置好后可以在客户端设置
remote_port和local_port的对应关系,让多台内网服务器通过同一个frps节点暴露不同端口。
几台服务器共用IP的常见坑
配置完成后,有几个高频问题需要提前避开。
WebSocket和长连接被切断
nginx默认的代理超时时间较短,WebSocket连接会被掐断,需要在location里加两条头:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
获取不到用户真实IP
所有请求看起来都来自nginx的IP,导致后端日志里全是内网地址,解决方案是全局设置 real_ip_header X-Forwarded-For,同时让nginx把原始IP写进X-Forwarded-For头。
HTTP和HTTPS混合访问导致跳转异常
后端是HTTP,对外是HTTPS,如果不设置X-Forwarded-Proto,后端生成的绝对链接可能会跳成HTTP,在nginx配置里加上:
proxy_set_header X-Forwarded-Proto $scheme;
多台服务器共用一个ip地址的常见问答
问:多台服务器共用一个ip地址会不会拖慢网速?
不会因为共享IP本身而变慢,速度瓶颈取决于入口服务器的带宽、后端业务处理能力,如果入口服务器的带宽只有10Mbps,多台后端共用时当然会争抢资源,建议根据总流量需求选择入口机的带宽规格。
问:不同业务类型的服务器也能共用IP吗?
可以,数据库、Redis这类内网服务没必要占用公网IP;Web服务、API服务通过反代共用IP没问题,但要注意,高并发下载或视频流场景会消耗大量带宽,不太适合和其他业务挤在同一入口下,建议这类业务使用独立带宽方案。
问:买云服务器时多台共用一个弹性公网IP可行吗?
可行,简米云、酷番云都支持绑定弹性公网IP后再用NAT网关做转发,需要注意两个细节:一是NAT网关是单独计费的,二是内容合规要求更严共用IP意味着所有域名都解析到同一个地址,一旦某个域名被恶意举报,可能影响其他域名在该IP上的访问。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/674427.html





