一台路由器完全可以让两台(甚至多台)Web服务器同时对外提供服务,核心思路是“一个公网IP + 端口分流”或“一个公网IP + 域名分流”,两种方式各有适用场景。本文不绕弯子,直接讲清楚原理、给出可复制的配置步骤,并对比两种方案的优劣。
先搞懂一件事:你家宽带只有一个“门牌号”
路由器从运营商那里拿到的公网IP,就像你家在互联网上的“门牌号”,两台Web服务器如果要被外面访问,都指望这个门牌号来找人,问题是,门牌号只有一个,服务器却有两台。
解决办法是在“门牌号”后面加“房间号”,也就是端口号,默认情况下,Web服务走的是80端口(HTTP)和443端口(HTTPS),如果两台服务器都想用80端口,那就得用“域名分流”的思路,让路由器根据访问的域名把请求转给不同的服务器。
如果你只有一个IP、没有多余的域名,那就用“端口分流”的思路,让第一台服务器用80端口,第二台用8080端口(或任意自定义端口),外面访问第二台时,输入http://你的IP:8080 就能命中。
家用路由器端口映射:把两个Web服务器同时挂到公网
这是最主流的做法,几乎所有家用路由器都支持“端口映射”或“虚拟服务器”功能,以小米路由器(管理后台通常为168.31.1)为例,操作路径如下:
- 登录路由器管理后台,找到“高级设置” → “端口映射”(不同品牌名称略有差异,TP-LINK叫“虚拟服务器”,华为叫“端口映射”或“NAT”)
- 点击“添加规则”,填写内网服务器IP、内网端口、外部端口和协议类型(TCP)
- 保存后,规则即刻生效,无需重启路由器
端口错开,两台服务器各用各的口
假设内网有两台服务器:
- 服务器A:IP为
168.31.100,跑Nginx,监听80端口 - 服务器B:IP为
168.31.101,跑Apache,监听8080端口
在路由器上添加两条规则:
| 规则名称 | 外部端口 | 内网IP | 内网端口 | 协议 |
|---|---|---|---|---|
| Web-A | 80 | 168.31.100 | 80 | TCP |
| Web-B | 8080 | 168.31.101 | 8080 | TCP |
配置完成后,外网访问http://公网IP 直达服务器A,访问http://公网IP:8080 直达服务器B。
这里有三个容易踩的坑,每个都可能导致“我明明配好了但就是打不开”:
- 内网IP必须是静态的,如果服务器B的IP是DHCP自动分配的,路由器重启后IP变了,端口映射就失效,建议在路由器“DHCP静态分配”里把两台服务器的IP固定住。
- 服务器防火墙要放行对应端口,Linux上常见操作是
或者firewall-cmd --permanent --add-port=8080/tcp
ufw allow 8080,Windows服务器则要在“高级安全防火墙”里新建入站规则,很多人配置完路由器却忘了服务器本身的防火墙,这是最常见的翻车原因。 - 运营商可能封禁80端口,业内专家指出,国内相当一部分地区的宽带运营商对家庭用户的80端口做了限制(需要备案才能放行),如果你发现80端口外网访问不了,先别怀疑路由器,直接用手机流量访问
http://公网IP:8080测试,如果8080通而80不通,那就是运营商封锁,解决办法是换用8443、8080等非常用端口,或者走备案流程。
一个80端口,两台服务器轮流接客
如果你有两个域名,或者想把80端口留给最重要的那台服务器,另一台用其他端口,这就需要“多级NAT”或者“路由器+反向代理”组合,家用路由器本身做不了基于域名的分流(那是专业防火墙和负载均衡器的功能),所以现实做法是:
- 端口80映射给服务器A(Nginx)
- 服务器A上配置反向代理,把来自特定域名的请求转给内网的服务器B
- 服务器B不需要在路由器上做任何映射
这样,外网两个域名都走80端口进来,路由器把流量全给服务器A,服务器A再看域名“脸色”决定自己处理还是甩给服务器B。用户根本感知不到背后有两台服务器。
两个Web服务器共用80端口:用Nginx反向代理做域名分流
这个方案更适合有域名、有个人网站或小企业站的场景,内网架构大致长这样:
公网IP:80 → 路由器端口映射 → 服务器A(192.168.1.10:80)
↓
Nginx反代
/
www.aaa.com www.bbb.com
↓ ↓
服务器A自己的站点 服务器B(192.168.1.20:80)
具体配置步骤
第一步:路由器端口映射
把公网80端口(和443端口)全部映射到服务器A的内网IP上,服务器B不用在路由器里添加任何规则。
第二步:在服务器A上安装Nginx
以Ubuntu/Debian为例:
apt update && apt install -y nginx systemctl enable nginx
第三步:配置两个server块
修改/etc/nginx/sites-available/下的配置文件,或者直接编辑/etc/nginx/nginx.conf,核心逻辑是让Nginx根据server_name(域名)来分发请求:
server {
listen 80;
server_name www.aaa.com;
# 这是服务器A自己的站点
root /var/www/aaa;
index index.html;
}
server {
listen 80;
server_name www.bbb.com;
# 把来自bbb域名的请求全部反向代理给服务器B
location / {
proxy_pass http://192.168.1.20;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
配置完成后重载Nginx:nginx -s reload
第四步:域名解析
把www.aaa.com和www.bbb.com的A记录都解析到你家的公网IP,同一IP解析多个域名完全合法,DNS层面不需要任何特殊配置。
行业共识认为,这种方法至少能撑住日均几千到几万次请求,对个人站、小型企业站绰绰有余,如果流量再大,就不建议用家用路由器方案了,直接上云服务器或者托管机房更稳。
端口转发和反向代理的区别:到底该怎么选
很多人搞混这两个概念,其实它们解决的问题不同,但可以配合使用,直接看对比:
| 对比维度 | 路由器端口转发 | Nginx反向代理 |
|---|---|---|
| 部署位置 | 路由器(硬件) | 服务器(软件) |
| 是否占用服务器资源 | 完全不占用 | 占用少量CPU和内存 |
| 是否支持域名分流 | 不支持 | 原生支持 |
| 是否支持路径分流(同一个域名不同路径转不同服务器) | 不支持 | 支持(location /api 转A,location / 转B) |
| 能否做负载均衡 | 不能 | 能(upstream 配置多台后端) |
| 对家庭用户友好度 | 高(图形界面点一点) | 中(需要熟悉Linux命令行) |
怎么选?给你三条直截了当的建议:
- 只想让外网临时访问一下内网某个Web服务:直接用端口转发,五分钟搞定,不需要额外安装任何软件。
- 长期运营两个网站,且都有独立域名:无脑选反向代理方案,域名分流体验最好,网址干净、不带端口号,用户记起来也方便。
- 微软的IIS、Apache等其他Web服务器:同样可以承担反向代理角色,Nginx只是最常用、配置语法最直观的一个,并非唯一选择,Apache的
mod_proxy模块、Caddy(自动申请HTTPS证书)也都干得了这活。
没有公网IP是不是就完蛋了
很多人在配置过程中会卡在一个前置问题:运营商分配的是私网IP(内网IP),比如64.x.x或x.x.x,这时候上面所有的配置都白搭因为外网根本没有直达你路由器的通道。
解决办法有以下几种:
- 向运营商申请公网IP,打客服电话,说家里装了监控/ NAS/需要远程办公,工信部近年来对宽带公网IP的发放有明确要求,电信和联通相对好申请,移动难度大一些,这种方案最便宜,通常免费。
- 用IPv6,国内IPv6普及率已经相当高,如果路由器支持IPv6,直接把Web服务器绑定到IPv6地址,外网通过
就能访问,IPv6地址多如牛毛,每台服务器都能分配到公网IP,不存在“一个IP不够用”的问题。http://[240e:xxx:xxx::1]
- 内网穿透工具,如frp、ngrok、Tailscale等,原理是你主动向外网的云服务器建立一条隧道,外部请求先到云服务器,再沿着隧道转发到你家里的内网,这种方式对路由器零要求,但会引入额外的转发延迟,且依赖云服务器的带宽和质量。
其中frp算是最常用的方案,其配置思路是:在一台有公网IP的云服务器上运行frps(服务端),在家里任意一台机器上运行frpc(客户端),然后把家里的两个Web服务分别映射成云服务器的80端口和8080端口。相当于把“端口映射”这件事搬到了云服务器上做,家用路由器退化成一台普通的交换机,不再参与任何NAT逻辑。
常见问题问答
两个Web服务器用同一台路由器,内网互相访问正常但外网只能打开其中一个,为什么
先确认两台服务器本机的防火墙状态,再检查路由器上两条端口映射规则是否存在冲突,如果规则都正确,用netstat -tlnp(Linux)或netstat -ano(Windows)查看两个端口是否都在监听状态,还有一类隐蔽情况:两个Web服务绑定到了相同的IP和端口,导致其中一个无法启动,这样它的流量自然无法被外网访问到,用ss -lnt查出实际监听情况即可,如果一切正常,大概率是运营商封锁了80端口,换一个高位端口(如8080、8888、9000)做外部映射即可。
路由器端口映射和DMZ主机有什么区别,哪个更适合多Web服务器场景
DMZ主机的本质是“无条件信任”,把所有未匹配到端口映射规则的外部流量全部转发到指定IP,而端口映射是“定向放行”,只把特定端口的流量转发给特定IP,多台Web服务器场景下,DMZ只能指定一台机器作为“接收人”,其余机器依然要靠端口映射规则才能被外部访问。建议不用DMZ,它对内网安全边界冲击较大,而且无法精确控制访问方向,如果某台服务器需要做P2P联机或特殊协议通信,才考虑单独给那台机器开DMZ。
用Nginx反代两个Web服务器,HTTPS证书怎么处理
在Nginx层统一终止SSL,把两台服务器的域名证书都配置到服务器A的Nginx上,每个server块各挂各的证书文件,443端口监听时不冲突(因为Nginx通过server_name区分不同的加密连接),服务器B不需要配置证书,Nginx向后端转发时默认走HTTP明文,内网传输安全性由内网环境自行保障。Caddy则更省事它会自动申请和续期Let’s Encrypt证书,连证书文件都不用自己下载,整个配置流程从“准备证书”简化为“配置域名”,大幅降低入门门槛,适合不熟悉证书管理的用户起步。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/768231.html




