一个IP对应两台服务器,本质上是让IP作为入口,通过端口或域名(SNI)把流量分工给不同机器,最常见的做法是在前端部署Nginx反向代理,把请求按规则转发给后端两台服务器。
一个IP带两台服务器的原理,先弄懂流量怎么走
很多站长第一次遇到这个问题时,第一反应是给两台服务器分别配同一个公网IP,然后发现根本上不了网,原因很简单,IP是门牌号,服务器是房子,门牌号不能同时属于两个房子。
但流量可以分工,行业共识是,一个公网IP只能指向一台物理机器,但一台机器可以同时扮演“守门员”和“分发员”的角色,这台机器(前端服务器)接收所有到达该IP的请求,再根据不同的规则比如访问的域名、访问的端口把请求转给内网的另一台服务器。
这就像公司前台只有一个,但公司里有多个部门,来访者告诉前台要找“技术部”还是“财务部”,前台再带你去对应的办公室,这里的“技术部”和“财务部”就是域名或端口,前台就是Nginx或HAProxy,办公室就是后端服务器。
< h2>用Nginx按域名分发,一台IP带两台Web服务器
适合场景:两台服务器都跑Web服务(比如一台放官网,一台放博客),并且你有两个不同的域名。
具体架构长什么样
- 前端服务器(公网IP机器):安装Nginx,占用80和443端口
- 后端服务器A(内网IP,比如192.168.1.10):跑着你的第一个网站
- 后端服务器B(内网IP,比如192.168.1.11):跑着你的第二个网站
用户访问 www.example1.com 时,Nginx把请求转发给A;访问 www.example2.com 时,转发给B,整个过程中,用户只看到一个IP,但背后是两台服务器在干活。
配置Nginx的具体步骤
假设你的前端服务器系统是Ubuntu 22.04,Nginx已安装。
第一步,给两个域名分别建配置文件:
sudo vi /etc/nginx/conf.d/example1.conf sudo vi /etc/nginx/conf.d/example2.conf
第二步,在 example1.conf 里写入:
server {
listen 80;
server_name www.example1.com;
location / {
proxy_pass http://192.168.1.10;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
第三步,在 example2.conf 里写入:
server {
listen 80;
server_name www.example2.com;
location / {
proxy_pass http://192.168.1.11;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
第四步,检查配置并重载:
nginx -t systemctl reload nginx
这里有个关键点:server_name 必须和你的域名完全对应,用户访问哪个域名,Nginx就匹配对应的 server 块,然后把请求转发给对应的后端服务器。
后端服务器需要注意什么
后端服务器不需要配置公网IP,只要能和前端服务器内网互通即可,后端服务器上跑的网站域名也要配置好,否则收到请求后可能返回默认站点。
如果你的网站有HTTPS需求,建议在Nginx前端统一配置SSL证书,让后端服务器只处理HTTP流量,这样证书管理更集中,也避免在两台服务器上重复部署证书。
用负载均衡分流,两台服务器跑同一个网站
适合场景:网站流量比较大,一台服务器扛不住,把同样的代码部署在两台机器上,由前端统一分发请求。
这种玩法在业内叫负载均衡,前端服务器不再只按域名分发,而是按轮询或权重策略,把请求轮流发给后端两台服务器。
使用Nginx upstream模块配置
在Nginx配置文件中加入以下内容:
upstream backend_servers {
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=1;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样配置后,请求会在两台服务器之间轮流转发,如果其中一台挂了,Nginx会自动把流量全部分给另一台,网站不会中断。
负载均衡模式和反向代理模式有什么区别
| 对比项 | 反向代理(方案一) | 负载均衡(方案二) |
|---|---|---|
| 两台服务器内容 | 各不相同 | 完全相同 |
| 分发依据 | 域名或路径 | 轮询/权重/IP哈希 |
| 典型用途 | 多站点共用IP | 高并发网站扩容 |
| 配置复杂度 | 较低 | 中等 |
| 会话保持需求 | 一般不需要 | 可能需要配置ip_hash |
如果网站涉及用户登录、购物车这类状态信息,建议在 upstream 里加一行 ip_hash,让同一个用户的请求始终发往同一台服务器,避免登录状态丢失。
用iptables做端口转发,IP和端口错开分配
适合场景:两台服务器服务类型完全不同,一台跑网站(80端口),一台跑数据库(3306端口)或别的服务,但只有同一个公网IP可用。
这时可以通过iptables的DNAT规则,把不同端口的流量转到不同内网服务器。
配置示例
假设公网IP是 0.113.5,后端A是 168.1.10,后端B是 168.1.11。
把公网的80端口流量转发给A:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
把公网的3306端口流量转发给B:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.11:3306
还需要开启IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
要注意,这种方式下用户访问时得带端口号,http://203.0.113.5:3306,体验上不如域名方式优雅,而且如果是Web服务,某些浏览器或框架对非标准端口有兼容性问题,不建议用这种方式对外提供网页服务。
选型建议:哪种方案最适合你的情况
业内专家指出,方案选择主要看后端服务器的角色关系。
- 两台服务器是不同网站:优先用Nginx按域名分发(方案一),还能顺便把SSL证书统一管理起来,这个场景也是搜索“nginx同ip多域名配置方法”时最常出现的答案。
- 两台服务器是同一个网站:用upstream做负载均衡(方案二),重点配置健康检查和会话保持。
- 其中一台不是Web服务:比如一台是API服务器,一台是文件服务器,用iptables或HAProxy做端口转发更直接。
另外要提醒一个容易踩坑的地方:如果两台服务器部署在同一内网,前端服务器和后端服务器之间的通信尽量用内网IP,不要绕回公网,否则会多一层延迟,还有可能触发防火墙限制。
一个IP给两台服务器时常见的三个坑
后端服务器HOST头校验失败
某些后端框架(如Tomcat、Spring Boot)会校验请求的Host字段,如果和自身配置的域名不一致,会返回400错误,解决办法是在 proxy_set_header Host $host; 之外,加上 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,并在后端框架中配置允许的域名列表。
HTTPS证书和SNI的配置顺序
同一个IP的443端口要服务两个域名,需要用到SNI(Server Name Indication)扩展,Nginx会根据TLS握手时客户端发来的域名,选择对应的证书,配置时注意两个 server 块的 listen 443 ssl; 必须都有独立的证书路径,位置不能写反,否则会导致证书不匹配的报错。
一台服务器重启后流量全乱
有时前端服务器重启后,ip_forward或Nginx服务没自动拉起,导致所有站点全部打不开,建议把 echo 1 > /proc/sys/net/ipv4/ip_forward 写入 /etc/rc.local,或者用 systemctl enable nginx 确保开机自启,如果是云服务器,还要检查安全组是否放行对应的端口。
同一个IP部署两台服务器的实际费用能省多少
这个问题常见的讨论场景是:手里有多台服务器但公网IP数量有限,一个公网IP在主流云厂商的单价因地域而异,国内地域每个IP每月约50元上下,海外部分地域更便宜,通过上述方案共享一个IP,省下的成本主要是公网IP的租赁费和带宽费用,但前端服务器的性能和带宽要求会相应提高,多数情况下整体还是更划算的。
一个IP给两台服务器”的常见疑问解答
问:必须有两个域名才能用一个IP带两台服务器吗?
不一定,如果两台服务不在同一端口上(比如一个跑80,一个跑8080),可以用端口区分,不需要域名,但访问时用户得手动输入端口号,体验较差,网站部署通常需要备案,域名和IP是绑定关系,如果你只有一块公网IP、想在不同的服务器上部署多个备案域名,采用Nginx反向代理按域名转发是更合规且灵活的做法。
问:前端服务器挂了,后端服务器还能直接对外提供服务吗?
不能直接对外,因为公网IP绑定的还是前端服务器,后端服务器只有内网IP,如果前端服务器宕机,整个入口就断了,所以前端服务器建议选择稳定性更高的配置,并做好备份和监控。
问:使用方案一能否只给其中一台服务器配置HTTPS?
可以,Nginx的多个server块可以独立配置SSL证书,你只需要给需要HTTPS的那个域名配置证书,另一个域名可以继续走HTTP,但浏览器会对未加密的站点显示不安全提示,不建议长期混用,目前搜索引擎对HTTPS站点有明确偏好,建议两个域名都启用HTTPS,据工信部公开信息,国内主流网站已基本全面启用HTTPS加密传输,Nginx配置中,每个带SSL的server块只需正确指定自己的证书路径即可,互不干扰。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/580386.html




