一个公网IP想发布内网多台服务器上的多个网站,外部访问还不带端口,靠的不是给每台服务器都做端口映射,而是把80和443入口集中到一台反向代理上。路由器只把公网IP的80、443映射到这台反向代理,其他内网服务器不直接暴露。用户访问时永远走默认端口,反向代理根据请求里的域名,把流量转发到对应的内网IP和端口。这个做法成熟,成本也低,一台旧电脑装Nginx都能跑。
假设你有三个网站:a.example.com放在192.168.1.10的80端口,b.example.com放在192.168.1.11的8080端口,c.example.com放在192.168.1.12的3000端口。公网IP是1.2.3.4。DNS里把三个域名都解析到1.2.3.4,A记录即可。路由器上只做两条端口映射:TCP 80到192.168.1.2:80,TCP 443到192.168.1.2:443,这台192.168.1.2就是反向代理。内网服务器不需要映射,也不需要改端口。
Nginx配置大致这样:
server {
listen 80;
server_name a.example.com;
location / {
proxy_pass http://192.168.1.10:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name b.example.com;
location / {
proxy_pass http://192.168.1.11:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

server {
listen 80;
server_name c.example.com;
location / {
proxy_pass http://192.168.1.12:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
外网访问http://a.example.com、http://b.example.com、http://c.example.com,都不带端口。后端监听什么端口,反向代理知道就行。新增网站时,DNS加一条A记录,Nginx加一个server块,nginx -s reload,不用动路由器,也不用给新服务器配公网映射。一个公网IP可以带几十个甚至上百个站点,限制主要是带宽和反向代理性能。
HTTPS同理。让Nginx监听443 ssl