我一直在为即将到来的项目设置Amazon EC2实例,这将涉及在多个Web服务器上托pipe多个网站。 他们都是微型实例,运行Ubuntu Server 64bit。
以下是我到目前为止:
目前只有一个Web服务器,但是我已经做了一个映像,所以一旦项目启动,我可以启动尽可能多的实例,并根据需要单独configuration它们。
一切都进展顺利,但我碰到了一些障碍。
我的问题是我想要运行多个Web服务器实例,但是由于Amazon限制为5个弹性IP地址,我知道这还不够。 我正在研究如何从一个IP地址在多个Web服务器上托pipe网站,并通过Apache的mod_proxy运行。 我还没有尝试过,但我认为这就是我所需要的。 我只希望有人确认我正走在正确的轨道上。
有没有人用mod_proxy使用Apache? 它是否真的允许您使用一个IP地址来托pipe多个网站?
假设我在这里正确的道路上,我所需要的只是一个指向运行Apache的EC2实例的弹性IP地址,对吗?
你所问的是一种非常常见的情况,即应用程序可能不在网关上运行,而且它们可能在局域网中的某个服务器上运行,但是对于全球来说,它似乎来自requested_url.com
我使用Apaches mod proxy运行4个网站,并且在这4个不同的网站上至less有15个不同的服务取决于他们。我没有Amazon EC2的经验,但Amazon EC2使用Xen作为其后端。 让我们说,面对互联网和拥有一个公共IP的主机现在被称为dom0读取以下术语
Dom0 with IP 192.168.0.100 (This will be our Server facing internet) DomU1 with IP 192.168.0.11 DomU2 with IP 192.168.0.12 DomU3 with IP 192.168.0.13 DomU4 with IP 192.168.0.14
我假设你有Dom0上的本地dns(或者你的networking中的某些地方)知道DomU的IP地址(如果不是这样的话),那么在apache2.conf(Fedoratypes系统上的httpd.conf)
NameVirtualHost * <VirtualHost *> ServerName mainserver DocumentRoot /var/www ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /domu1 http://192.168.0.11/ ProxyPass /domu2 http://192.168.0.12/ ProxyPass /domu3 http://192.168.0.13/ ProxyPass /domu4 http://192.168.0.14/ ProxyPassReverse /domu1 http://192.168.0.11/ ProxyPassReverse /domu2 http://192.168.0.12/ ProxyPassReverse /domu3 http://192.168.0.13/ ProxyPassReverse /domu4 http://192.168.0.14/ </VirtualHost>
这种方式是实现你所问(如何不被推荐)的东西的一种方法,如果你升级服务器(即Dom0),更新可能会写入apache2.conf或httpd.conf。 所以一旦你明白上面的条目是什么意思(检查你的要求,我已经挣扎很长一段时间,有一些类似的东西,因此我给了一个简单的解决scheme,但不build议)。 一旦你了解了上面的ProxyPass,然后在站点可用的目录中创build不同的虚拟主机configuration,如果它是一个Ubuntu / Debian系统或基于红帽子,它仍然是可能的(你将不得不search),我给你看一个,所以它帮助你rest4-5你可以自己做
调用这个/etc/apache2/sites-enabled/myinterna1.conf,如下所示
<VirtualHost *:80 > ServerName myserver1.com ServerAdmin webmaster@localhost ProxyRequests off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPreserveHost On ProxyPass / http://192.168.1.3/ ProxyPassReverse / http://192.168.1.3/ ErrorLog /var/log/apache2/server1/server1_error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/server1/server1_access.log combined CustomLog /var/log/apache2/server1/server1-resp_log resp LogFormat "%a %{X-Forwarded-For}i %h %D %t %f %p %>s %U %v" resp </VirtualHost>
上面的虚拟主机将被定义在Dom0上,以便所有的请求都是从一个内部服务器server1.com提供的。它的工作方式是在互联网上的某个人将在他们的浏览器中input
http://requested_url.com/domu1
现在,这个请求到达Dom0,Dom0上的Apache虚拟主机检查代理configuration,发现/ domu1映射到一个内部服务器,所以它转发给实际上必须服务的机器。对于互联网上的用户,这一切都是隐藏的。
在Ubuntu系统上这样做的时候要谨慎一点,在vhost文件的字母名称(而不是服务器名称,我指的是sort.c文件的名字,Apache的虚拟主机文件)的虚拟主机服务(这就是为什么是一个文件000默认)在Ubuntu系统上,所以确保你有一个主机超过你要服务的网站数量(这将作为错误页面)。这是一个标准的做法。
为什么不在同一个IP地址上运行它们,并使用Apache虚拟主机(即基于主机头的虚拟主机)让Web服务器根据每个请求select正确的站点?
这只会消耗一个IP地址,亚马逊的负载平衡可以完成剩下的工作。