/ etc / hosts中具有不同IP地址的多个主机名条目的预期行为是什么?

我知道这个问题已经在 几个 地方讨论过 了 ,但是目前似乎还没有明确的答案 – 至less对于RHEL 6来说,我只是希望有人能够指出它是如何工作的,所以我可以挖小。

短版本:我有一个公共IP地址的OpenVZ主机节点,作为一个OpenVZ容器私有IP地址的反向代理。 我已经创build了2个同名的容器(如果你想知道为什么,可以跳到下面的长版本),HN在/etc/hosts也有这些条目:

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

我可以使用OpenVZ挂起/恢复这些主机的任何一个ID,而反向代理似乎神奇地将请求路由到任何主机运行(例如IP地址10.0.0.13010.0.0.131 。但我不能在我的生活中,我发现哪一部分软件正在做这件事,是Apache吗?在HN的networking系统中是什么东西?还有其他的东西吗?它似乎工作,但我想知道更多关于为什么/因为在它是否应该工作方面,似乎也存在着很大的意见分歧,为了清楚起见,我并不是在寻找循环法或负载平衡,只是简单地从一个OpenVZ容器切换到另一个容器。

Lomg版本:虽然设置了一些脚本来创build和pipe理一系列OpenVZ容器,但是我创build了一个名为make_clone.sh的脚本,它接受一个模板并创build一个新的容器。 该脚本需要2个参数 – 容器ID和所需的主机名。 其中一件事是为容器分配新的10.0.0.* IP地址,并configuration一些networking,其中一个元素将一个条目放入主机节点的/etc/hosts文件中。

在为这些容器testing一些备份/恢复脚本的同时,我想“假装”一个特定的容器已经死亡,将另一个具有相同名称的磁盘加速并恢复备份。 我没有真正删除原来的容器,而是使用vzctl stop 130使其脱机。 然后,我创build了一个ID为131的新容器,但名称相同。 一旦启动,我恢复MySQL数据库,并检查(通过浏览器),我可以访问它 – 它运行Joomla一些定制 – 一切都很好。

但后来我注意到,在主机节点的/etc/hosts ,我有这2个条目(其中包括):

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

主机节点也充当反向代理。 只有主机节点具有外部IP地址,其Apacheconfiguration将子域有效地映射到容器上。 因此,除了上面的/ etc / hosts中的条目,在httpd config中也有这样的部分:

`ServerName testbackup.xxx.yy

  ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /server-status ! ProxyPass / http://testbackup.xxx.yy/ ProxyPassReverse / http://testbackup.xxx.yy/ <Location /> Order allow,deny Allow from all </Location> 

`

在我描述的场景中,由于脚本的缘故,实际上最终会有2个这样的部分,但是它们是相同的 – 它通过主机名而不是IP来引用Container,这使我认为它本身不是Apache本身'工作'容器。 我现在可以浏览到http://testbackup.xxx.yy/ (很明显使用真实的域名),Apache似乎很乐意将请求路由到10.0.0.13010.0.0.131中的任何一个。 我可以通过简单地暂停/恢复OpenVZ容器来切换它们。

我并没有期待这个工作 – 但它很高兴。 我的问题是,应该吗? 它可以依靠吗? 还是只是一个侥幸,将停止工作时,什么位置的某些其他configuration文件的绒毛得到整理?

由于主机可以有多个IP地址,所以你看到的是预期的行为。 这就像拥有多个昵称,比如bossman,haus,jungle-jim等等。每个了解我的人都知道这些是我的昵称(尽pipe他们实际上并不是我的昵称)。

除非您尝试通过IP地址访问资源,否则您的系统应该像没有任何事情一样工作。 (从技术上说,在一个容器上生成一个新的IP地址不应该影响你的服务,只要这些服务没有绑定到IP地址上。就你而言,你可能已经顺利地运行了你的应用程序。 )

例如:我可以给一个主机分配4个IP地址:

 10.0.0.130 testbackup.xxx.yy 10.0.0.131 testbackup.xxx.yy 10.0.0.132 testbackup.xxx.yy 10.0.0.133 testbackup.xxx.yy 

例1

所有这些IP地址都指向testbackup.xxx.yy ,这意味着,如果我尝试访问testbackup.xxx.yy ,我将得到它们中的任何一个,这取决于在我的时间哪个IP地址是主动/响应的请求。 再说一遍,只要您尝试访问的服务不是专门与该IP地址绑定的,就可以工作。

但是,如果您记下了10.0.0.133 ,并且您试图从10.0.0.133(即http://10.0.0.133/专门访问该资源,则会出现错误。

更新:

如果您使用Apache VirtualHosts:

 <VirtualHost *:80> DocumentRoot /www/example1 ServerName www.example.com # Other directives here </VirtualHost> <VirtualHost *:80> DocumentRoot /www/example2 ServerName www.example.org # Other directives here </VirtualHost> 

这个configuration将允许两个站点使用相同的IP地址和端口。 如果这是您设置VirtualHosts的方式,那么VirtualHosts正在处理您的自动路由(如果您从理论上将两个ServerName字段列为同一主机)。

你表示你在使用OpenVZ。 OpenVZ可能允许您的网站独立运行,但在物理上,它们都在同一主机上。 除非您为每个单独的VE分配自己的主机名,并且您在尝试访问该主机名时特别禁用该主机名,否则您将获得该站点的预期行为。

例如,如果您为其中一个OpenVZ / IP地址分配了不同的主机名称:

 10.0.0.133 mybackup.xxx.yy 

如果你closures了10.0.0.133 ,你将无法再从mybackup.xxx.yy访问它,但是你可以从testbackup.xxx.yy访问它(因为它经过了其他的IP地址仍然和testbackup.xxx.yy相关联)。

在这里输入图像说明