在单个IP后面的多个服务器上提供服务

我有一个networking设置如下所示。 带有公共IP的Windows Server 2012 R2盒子,后面有多个CentOS 7networking服务器。 每个CentOS盒子是多个网站的networking服务器。 CentOS盒子运行Apache 2.4PHP 5.5

带有Web服务器的Windows服务器

所有站点的DNS条目都指向Win Server的公共IP地址( 1.2.3.4 )。

我的问题是 :如何最有效地将这些网站从CentOS盒子送到terminal用户?

我一直在寻找IIS反向代理。 这是我目前(超笨重)的解决scheme:

  • Win Server获取foo.com的请求
  • URL被重写到com.foo.web1IIS包含一个$_SERVERvariables来为PHP提供正确的URL( foo.com )。
  • Win Server hosts文件说com.foo.web1转到com.foo.web1的IP( 192.168.1.2
  • com.foo.web1有一个com.foo.web1的虚拟主机,然后为foo.com提供所有的东西。

这工作,但它感觉像一个可怕的黑客。 理想情况下,我想避免重写url。 我只想说foo.com ? 发送该请求到192.168.1.2thing.com ? 发送到192.168.1.3 。 这听起来就像DNS,但显然我不能告诉用户去一些内部的IP。 也许我实际上需要一个转发代理? 我不能只转发端口80因为需要在多个服务器之间拆分请求。

我觉得这个问题以前一定解决了,但是我弄不明白。 (我真的是开发人员,而不是系统pipe理员)。 帮助将不胜感激!

我倾倒了Win Server for Linux,并使用HAProxy

为了避免任何人通过阅读所有的评论来发现这一点,我结束了倾销Windows Server和使用Linux与HAProxy。 HAProxy能够转发请求,而无需重写URL。

我还没有findWindows的一个很好的解决scheme ,但我认为这可能是可以接受的:

通过添加一个端口来重写所有的URL,所以:

  • foo.com – > foo.com:8081
  • bar.com – > bar.com:8081
  • thing.com – > thing.com:8082
  • stuff.com – > stuff.com:8082

然后,在Windows Server上:

  • 在Web1上将端口8081转发到端口80
  • 将端口8082转发到端口80和Web2

这是未经testing的

您可以使用Windows主机文件(c:\ windows \ system32 \ drivers \ etc \ hosts)覆盖DNS,然后添加以下行:

192.168.1.2 foo.com

现在你的Windows机器,将为foo.com联系192.168.1.2,即使foo.com在DNS中有另一个ip。

因此,如果互联网上的系统联系foo.com,他们将使用DNS查找foo.com,他们将连接到您的Windows机器。 现在,如果你有一个'redirect'(微软的术语,我更喜欢'反向代理规则')foo.com作为redirect规则,你的Windows将使用hosts文件查找'foo.com'并连接到你的内部服务器。

如果安装了应用程序请求路由(ARR),则应该在IISpipe理器中看到一个新的项目“Server Farms”。

您可以使用一台服务器192.168.1.2创build一个服务器场。

之后,您可以为foo.com添加反向代理规则(重写规则),并将其路由到您在第一步中创build的服务器场。

有关详细信息,请参阅http://masteringlync.com/2013/02/12/using-iis-application-request-routing-arr-as-a-tmg-replacement/

我从来没有直接使用IIS的ARRfunction,但根据它的文档,它似乎可能会做你所需要的:

平衡在各个服务器之间更有效地加载,以最大限度地利用资源

IIS应用程序请求路由为pipe理员提供了根据URL,HTTP标头和服务器variables创build强大的路由规则的能力,从而为每个请求确定最合适的Web应用程序服务器。 ARR在应用级进行请求路由决策,可以与硬件负载平衡器或Windowsnetworking负载平衡结合使用,作为对HTTP请求的控制层。 此外,通过在客户端和服务器之间创build关联,ARR使托pipe提供程序能够将来自客户端的请求路由到服务器场中的特定Web应用程序服务器。

这就是说,我不知道它会不会真的起作用,甚至有多好。 我想可能你的时间可能会更好用在Linux上设置盒子,并使用HAProxy或其他Linux负载平衡器/反向代理(Nginx,Apache与mod_proxy)。

事实上,你也许可以在Windows上使用mod_proxy使用Apache。

无论哪种方式,我知道一个事实,HAProxy可以做到你想要的,因为这是它的意思。