我一直在为即将开展的项目设置 Amazon EC2 实例,该项目涉及在多个 Web 服务器上托管多个网站。它们都是微型实例,运行 Ubuntu Server 64 位。
以下是我目前所掌握的信息:
- 网络服务器-- 阿帕奇
- 数据库服务器--MySQL
- 开发服务器--Apache 和 MySQL
- 文件服务器-- SVN 和 Bacula(备份到 S3 存储桶)
目前只有一个 Web 服务器,但我已经制作了它的图像,因此一旦项目启动,我就可以根据需要启动任意数量的实例并单独配置它们。
一切进展顺利,但我遇到了一些障碍。
我的问题是我想运行多个 Web 服务器实例,但由于 Amazon 限制只能使用 5 个弹性 IP 地址,我知道这还不够。我正在研究如何从单个 IP 地址在多个 Web 服务器上托管网站,然后遇到了mod_proxyApache。我还没有尝试过,但我认为这就是我需要的。我只是想有人确认我走的路是正确的。
有人用过带 mod_proxy 的 Apache 吗?它真的能让你用一个 IP 地址托管多个网站吗?
假设我在这里走在正确的轨道上,我所需要的只是一个指向运行 Apache 的 EC2 实例的弹性 IP 地址,对吗?
答案1
您所问的是一个非常常见的情况,应用程序可能不在网关上运行,它们可能在 LAN 中的某个服务器上运行,但对于世界来说,它似乎来自 requested_url.com
我使用 Apache mod 代理运行 4 个网站,这 4 个不同网站上至少有 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,它知道 DomU IP 和名称。(如果没有,生活将会很困难)然后在 apache2.conf(Fedora 类型系统上的 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,无论哪种情况。因此,一旦您理解了上述条目的含义(检查它是否符合您的要求,我很久以前就为您想要的类似东西而苦苦挣扎,因此我提供了一个简单的解决方案,但不推荐)。一旦您理解了上述 ProxyPass,然后在 sites-available 目录中创建不同的虚拟主机配置,如果它是基于 Ubuntu/Debian 系统或基于 Red Hat,它仍然是可行的(您必须搜索)我向您展示了一个,这样它可以帮助您完成剩下的 4-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 提供服务。其工作方式是互联网上的某个人在其浏览器中输入
http://requested_url.com/domu1
现在此请求到达 Dom0,并且 Dom0 上的 Apache 虚拟主机检查代理配置并发现 /domu1 已映射到内部服务器,因此它将其转发到实际需要服务的机器。对于互联网上的用户来说,所有这些都是隐藏的。
然而,在执行此操作时需要注意的是,Ubuntu 系统上的 Apache 按照 vhost 文件的字母名称(不是服务器名称,我指的是文件名,如 sorting.c,Apache 虚拟主机文件)为虚拟主机提供服务(这就是为什么有 000-default 文件)所以请确保您的主机数量比您要服务的网站数量多一个(将用作错误页面)。这是一种标准做法。
答案2
为什么不在同一个 IP 地址上运行它们,并使用 Apache 虚拟主机(即基于主机头的虚拟主机)让 Web 服务器根据每个请求选择正确的站点?
这只会消耗一个 IP 地址,Amazon 的负载平衡可以完成其余工作。