AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 536589
Accepted
dsl101
dsl101
Asked: 2013-09-06 03:04:34 +0800 CST2013-09-06 03:04:34 +0800 CST 2013-09-06 03:04:34 +0800 CST

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

  • 772

我知道这已经在 几个 地方讨论过,但似乎还没有一个明确的答案——至少对于 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 容器来在它们之间切换。

我没想到这会起作用 - 但它确实很好。我的问题是,应该吗?可以依靠吗?或者它只是一个侥幸,当某个地方的其他配置文件中的任何一点绒毛被整理后,它就会停止工作?

reverse-proxy
  • 1 1 个回答
  • 2479 Views

1 个回答

  • Voted
  1. Best Answer
    CIA
    2013-09-27T16:37:09+08:002013-09-27T16:37:09+08:00

    由于主机可以有多个 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 地址都指向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>
    

    此配置将允许两个站点使用相同的 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)。

    在此处输入图像描述

    • 2

相关问题

  • 反向代理设备[关闭]

  • 清漆配置仅缓存未登录用户

  • Varnish 缓存如何处理不同的域?

  • Varnish 与其他反向代理

  • 内省 Varnish 的工具

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve