跨多个不同服务器的域名路由

跨多个不同服务器的域名路由

如何使用一个公网IP地址托管跨局域网内多台服务器的多个域名?

假设我有 5 台 Web 服务器,服务 5 个不同的域名,使用 5 种不同的服务器端技术,并且我当前有 5 个公共 IP 地址。

DNS 设置使得 5 个域名中的每一个都映射到相应的公共 IP,并且防火墙具有端口转发器,因此所有请求都会转发到 LAN 内正确服务器的相应内部 IP 地址。

我该如何合并使用一个 IP 而不是 5 个?我了解动态 DNS 的工作原理,如果只有一个 Web 服务器,就不会有问题。但是,由于有多个 Web 服务器,使用不同的技术,我不确定如何仅使用一个公共 IP 来实现。

是否有一个服务器(最好是基于 Linux 的)可以发送所有请求,并且能够严格根据请求中的域名将每个请求透明地路由到特定的内部 IP + 端口?

答案1

您可以尝试使用反向代理设置负载均衡器。

它基本上是一个接收所有请求的服务器,但它不处理这些请求;相反,它只将请求发送给其后面的一台服务器进行处理。

有多种算法可以将请求发送到正确的服务器,以避免其中一台服务器的负载超过其他服务器,但对于基本设置,即使将其随机化或一次向一台服务器发送请求也可以。由于向实际服务器发出请求的是 Nginx,因此您将丢失原始用户的 IP 地址。要使其再次可用,您必须设置 Nginx 和您的服务器以将原始 IP 地址作为 HTTP 标头传递(例如 X-Forwarded-For)。

答案2

Apache 或 Nginx 反向代理就可以了。

下面是一个使用 nginx 反向代理的简单示例,包括负载平衡。

http {
  upstream backend_server_2 {     # load balanced server block
     ip_hash;
     server 10.1.1.2:8080 weight=2;
     server 10.1.1.3:8080 weight=1;
  }

  server {
     listen public_ip:80;
     server_name example1.com;
     location / {
         proxy_pass http://10.1.1.1/;
     }
  }

  server {
     listen public_ip:80;
     server_name example2.com;
     location / {
         proxy_pass http://backend_server_2/;
     }
   }
}

答案3

当然,您可以使用负载平衡器来处理它。但适当的方法是使用服务器名称指示 (SNI)。不要重新发明轮子,尤其是在网络/互联网问题上……

相关内容