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

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

我知道这已经讨论过了 一些 地点,但似乎还没有明确的答案——至少对于 RHEL 6 来说没有。我只是希望有人能指出如何它正在运行,所以我可以进行一些挖掘。

简洁版本:我有一个具有公共 IP 地址的 OpenVZ 主机节点,它充当具有私有 IP 地址的一组 OpenVZ 容器的反向代理。我创建了 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.130或)10.0.0.131。但我无论如何也找不到哪个软件在做这件事。是 Apache 吗?是 HN 网络系统中的某个东西吗?还是别的什么?它似乎有效,但我想知道更多关于为什么/如何,因为对于它是否有效似乎也存在很大的分歧应该根本无法工作。需要说明的是,我在这里不寻求循环或负载平衡。只是简单地从一个 OpenVZ 容器手动切换到另一个。

Lomg版本:在设置一些脚本来创建和管理一系列 OpenVZ 容器时,我创建了一个名为 的脚本,make_clone.sh它采用模板并创建一个新容器。该脚本采用 2 个参数 - 容器 ID 和所需主机名。它所做的一件事是10.0.0.*为容器分配一个新的 IP 地址并配置一些网络,其中一个元素是将条目放入主机节点的/etc/hosts文件中。

在测试这些容器的一些备份/恢复脚本时,我想“假装”某个容器已经死亡,启动另一个同名的容器并恢复备份。我没有真正删除原始容器,而是将vzctl stop 130其脱机。然后,我创建了一个 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 地址,并且其 Apache 配置有效地将子域映射到容器上。因此,除了上述 /etc/hosts 中的条目外,它在 httpd 配置中还有如下部分:

` 服务器名称 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 来引用容器,这让我认为不是 Apache 本身选择了“工作”容器。我现在可以浏览http://testbackup.xxx.yy/(显然使用真实域名),Apache 似乎很乐意将请求路由到10.0.0.13010.0.0.131启动的任何一个。我可以通过简单地暂停/恢复 OpenVZ 容器在它们之间切换。

我没想到这个会起作用 - 但确实如此,这很好。我的问题是,它应该起作用吗?可以依赖它吗?还是说这只是一个侥幸,当某个配置文件中的一些小问题被清理干净后,它就会停止工作?

答案1

由于主机可以有多个 IP 地址,因此您看到的是预期行为。这就像有多个昵称,例如:bossman、haus、jungle-jim 等...认识我的人都知道这些都是我的昵称(尽管它们实际上不是我的昵称)。

除非您尝试通过 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 地址都指向测试备份.xxx.yy,这意味着,如果我尝试访问测试备份.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>

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

您表示您正在使用 OpenVZ。OpenVZ 可能允许您的站点独立运行,但物理上,它们都在同一台主机上。除非您为每个单独的 VE 分配自己的主机名,并且您尝试访问该主机名具体来说当它关闭时,您将获得网站正常运行的预期行为。

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

10.0.0.133 mybackup.xxx.yy

如果您关闭10.0.0.133它,您将无法再从 访问它mybackup.xxx.yy,但您可以从 访问它testbackup.xxx.yy(因为它会通过仍然正常运行且与 关联的其他 IP 地址进行访问testbackup.xxx.yy)。

在此处输入图片描述

相关内容