在单个服务器上托管多个网站

时间:2013-12-15 10:58:21

标签: amazon-web-services amazon-ec2 webserver port sysadmin

我有一堆不同的网站,大多是随机的周末项目,我想留在网上,因为它们对我来说仍然有用。但是他们所有人之间每天都没有超过3-5次点击,所以当我可能将它们全部放在一个EC2微型实例上时,我不想为每个人支付服务器费用。那可能吗?它们都运行不同的Web服务器,因为我倾向于尝试很多新技术。我想我可以让每个网络服务器在不同的端口上提供服务,然后将app1.com的传入请求路由到app1.com:3000,并将app2.com的请求路由到app2.com:3001等等在,但我不知道如何设置它。

3 个答案:

答案 0 :(得分:4)

我建议您正在寻找的是reverse web proxy,,其中通常包括在第7层中理解部分请求的能力,并将传入流量引导到一个或多个适当的集合中后端ip /端口组合基于请求标头(或请求的其他方面)中观察到的内容。

Apache,Varnish和Nginx都具有此容量,HAProxy也是如此,这是我使用的方法,因为它在内存上看起来非常快速和简单,因此适用于微实例......但这并不意味着使用它比其他人更“正确”。任何这些选择的原则都是一样的;只有配置细节不同。一个服务正在侦听端口80,并根据请求,通过打开到适当目的地的TCP连接,将两个管道的末端连接在一起,将其中继到适当的服务器进程,否则大部分时间都不在方式。

这可能是haproxy配置文件中的一种方式(在几种替代方案中):

frontend main
    bind *:80
    use_backend app1svr if { hdr(host) -i app1.example.com }
    use_backend app2svr if { hdr(host) -i app2.example.com }

backend app1svr
    server app1 127.0.0.1:3001 check inter 5000 rise 1 fall 1

backend app2svr
    server app2 127.0.0.1:3002 check inter 5000 rise 1 fall 1

这表示侦听所有本地IP地址的端口80;如果“Host”标头包含“app1.example.com”(-i表示不区分大小写),则使用“app1”后端配置并将请求发送到该服务器;为app2.example.com做类似的事情。如果没有ACL匹配,您还可以声明default_backend;否则,如果不匹配,它将返回“503 Service Unavailable”,如果请求的后端当前没有运行,它也会返回。

您还可以配置统计信息端点,以显示HTML表格中前端和后端的当前状态和流量统计信息。

由于浏览器不再“直接”连接到Web服务器,您必须配置并依赖插入请求标头中的X-Forwarded-For标头来标识浏览器的IP地址,还有其他您的应用程序可能需要考虑代理的方式,但这个整体概念正是Web应用程序通常如何缩放,所以我不认为它是一个重大的缺点。

请注意,这些示例使用“匿名ACL”,文档中说明了这些内容:

  

通常不建议使用此构造,因为它更容易   以这种方式写入时在配置中留下错误。但是,非常   例如,只匹配一个源IP地址的简单规则,它可以做得更多   使用它们而不是用随机名称声明ACL。

     

- http://cbonte.github.io/haproxy-dconv/configuration-1.4.html

对于像这样的简单规则,这个结构对我来说比明确声明ACL然后使用该ACL引起你想要的动作更有意义,因为它将所有内容放在同一行上。

我使用它来解决具有相同症状的不同根问题 - 开发/测试项目的多个站点,但只有一个可能的外部IP地址(根据定义,“端口80”只能到达一个地方) 。这使我能够在不同的端口和平台上“托管”开发和测试项目,所有这些都在我家DSL线路的单个外部IP之后。在我的情况下唯一的区别是,不同的网站有时与haproxy在同一台机器上,有时它们不是,但应用程序似乎完全相同。

答案 1 :(得分:0)

以您显示的方式重新路由 - 取决于您的服务器托管的操作系统。对于linux,你必须使用iptables,对于windows你可以使用windows防火墙。您应该将要重定向的端口80的所有传入连接设置为所需的端口3000

但是,您可以为每个服务使用不同的主机名,而不是端口 app1 .apps.com
app2 .apps.com
 等等。您可以通过重定向DNS主机进行配置,对于 apps.com ,恕我直言,这是最佳解决方案,如果我帮您做好的话。


此外,您可以将单个主机配置为重新路由到所有其他站点,例如
 app1.com:3001 - > apphost1.com
 app1.com:3002 - > apphost2.com
 请注意,在这种情况下,所有流量都将通过app1.com传播。

答案 2 :(得分:0)

您可以轻松完成此操作。为您要使用的每个应用设置不同的主机名,创建指向您的微实例的DNS条目,并为每个应用创建基于名称的虚拟主机条目。

每个虚拟主机条目应如下所示:

<VirtualHost *>
   ServerName app1.example.com
    DocumentRoot /var/www/html/app1/
    DirectoryIndex index.html
</VirtualHost>
相关问题