我知道这已经在 几个 地方讨论过,但似乎还没有一个明确的答案——至少对于 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
,我有这两个条目(以及其他条目):
# 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>
`
在我描述的场景中,由于脚本,它实际上会以其中两个部分结束,但它们是相同的——它通过主机名而不是 IP 来引用容器,这让我认为不是 Apache 本身在挑选“工作”容器。我现在可以浏览到http://testbackup.xxx.yy/
(显然是使用真实域名),Apache 似乎很乐意将请求路由到其中的任何一个10.0.0.130
或10.0.0.131
已启动。我可以通过简单地暂停/恢复 OpenVZ 容器来在它们之间切换。
我没想到这会起作用 - 但它确实很好。我的问题是,应该吗?可以依靠吗?或者它只是一个侥幸,当某个地方的其他配置文件中的任何一点绒毛被整理后,它就会停止工作?
由于主机可以有多个 IP 地址,因此您看到的是预期行为。这就像拥有多个昵称,例如:bossman、haus、jungle-jim 等……认识我的每个人都知道这些是我的昵称(尽管它们实际上并不是我的昵称)。
除非您尝试通过 IP 地址访问资源,否则您的系统应该像什么都没发生一样工作。(从技术上讲,在容器上生成新的 IP 地址不会影响您的服务,只要这些服务不与 IP 地址绑定即可。在您的情况下,您可能只是幸运地让您的应用程序顺利运行。 )
示例:我可以为一台主机分配 4 个 IP 地址:
所有这些 IP 地址都指向testbackup.xxx.yy,这意味着,如果我尝试访问testbackup.xxx.yy,我将访问其中的任何一个,具体取决于在我访问时哪个 IP 地址处于活动状态/响应状态要求。同样,这仅适用,只要您尝试访问的服务没有专门绑定到该 IP 地址。
但是,如果您删除了10.0.0.133,并且您尝试专门从 10.0.0.133 (即
http://10.0.0.133/
)访问资源,您会收到错误消息。更新:
如果您使用的是 Apache VirtualHosts:
此配置将允许两个站点使用相同的 IP 地址和端口。如果这是您设置 VirtualHosts 的方式,那么 VirtualHosts 正在处理您的自动路由(
ServerName
理论上,如果您将两个字段列为同一主机)。您表示您使用的是 OpenVZ。OpenVZ 可能允许您的站点独立运行,但实际上,它们都在同一主机上。除非您为每个单独的 VE 分配自己的主机名,并且您尝试在该主机名关闭时专门访问该主机名,否则您将获得该站点的预期行为。
例如,如果您为 OpenVZ/IP 地址之一分配了不同的主机名:
如果您删除
10.0.0.133
了,您将无法再从其访问它mybackup.xxx.yy
,但您将能够从它访问它testbackup.xxx.yy
(因为它会通过仍然启动并与 关联的其他 IP 地址testbackup.xxx.yy
)。