虚拟服务指南

作者:Chad Robinson

随着互联网站点的数量增长,一些客户希望在无需为此任务专门配备一台机器的情况下创建一个网络存在。在许多情况下,客户可能永远不会获得足以证明专用机器合理的用量。像花店和市政活动组织者这样的人可能对机器没有任何其他用途,因此额外的硬件将被浪费。

解决这个问题的方法是使用一台计算机为多个客户提供服务。如果机器几乎专门用于提供网络展示、FTP目录和电子邮件服务,那么一台具有足够性能的机器可以轻松满足多个客户的需求,尤其是那些流量较低的客户。

然而,这个解决方案有一个许多人都熟悉的缺点。尽管可以将多个域名轻松指向单个主机,但无论请求的是哪个服务和哪个域名,URL都会产生相同的结果。例如,如果 tryme.com 和 comehere.com 都指向同一主机,则 http://www.tryme.com/ 和 http://www.comehere.com/ 将产生完全相同的主页——这显然不是这些组织想要的结果。

但是这个问题有一个解决方案——虚拟服务。虚拟服务与标准服务(Web、电子邮件或 FTP)完全相同,但它根据选择的目标提供不同的结果,尽管它们都驻留在同一台机器上。

本月,我们将研究如何设置和使用虚拟网络服务。下个月我们将介绍电子邮件和 FTP,以及未来可能的功能。请记住 Perl 的座右铭:“条条大路通罗马。” 随着互联网的发展,已经涌现出几种替代方案。本文档仅描述一种方法,并且在您阅读本文时,可能还会有其他方法,因此在您决定任何一条路径之前,请先四处看看!

请注意,在所有描述的解决方案中,我假设您至少注册并运行了两个域名和两个 IP 地址。您应该具有到这两个 IP 地址的有效路由,并且来自任何外部互联网主机的 nslookup 都应该为每个域名返回正确的 IP 地址。您可以查阅其他参考文献以获取有关如何执行此操作的信息。

IP 别名

IP 别名是在操作系统级别实现虚拟服务的关键。由于本文的预期读者是 Linux 用户和系统管理员,我将仅介绍与 Linux 相关的信息。其他操作系统可能具有也可能不具有执行 IP 别名的能力,您应该查阅您的文档和其他出版物以获取有关它们的信息。

在正常情况下,每个网络设备只能绑定一个 IP 地址。本文中描述的虚拟服务依赖于为每个服务的域名拥有单独的 IP 地址。那么,如何用一台机器管理所有流量呢?IP 别名使这成为可能。

要启用 IP 别名,您必须首先编译您的内核并启用 IP 别名支持。如果您还没有内核源代码,则不应在没有源代码的情况下继续操作。从合适的镜像站点获取相当新的内核发行版,然后解压缩该存档,通常解压缩到 /usr/src/linux。然后进入该目录并重新编译内核。请务必对有关是否支持 IP 别名的问题回答“是”。

如果您认为您的内核可能已经支持 IP 别名,一种快速检查方法是验证是否存在 /proc/net/alias* 文件。启用支持后,您只需以稍微不同的方式配置接口。通常,这将通过 ifconfigroute 的组合来完成。以下是一个常见示例

/sbin/ifconfig eth0 10.1.1.10 <other options>
/sbin/route add -net 10.1.1.0 gw 10.1.1.10 <other options>

这将为 eth0 设备(您应该将其替换为您用于连接的任何设备)创建一个设置,并为本地网络 (10.1.1.*) 添加一个通过它的路由。(这也将自动处理到设备本身的路由。)

要处理 IP 别名,我们只需添加一个冒号和我们要引用的别名编号。如果我们从服务提供商处获得了 IP 地址 10.1.1.6 和 10.54.21.8,并且我们希望它们都与连接到我们的 T1 路由器的以太网卡通信,我们将使用

/sbin/ifconfig eth0:0 10.1.1.6 <other options>
/sbin/ifconfig eth0:1 10.41.21.8 <other options>
/sbin/route add -net 10.0.0.0 dev eth0:0
/sbin/route add -host 10.41.21.8 dev eth0:1

这将为以太网卡设置两个别名,0 和 1,每个别名具有不同的 IP 地址。任何侦听以太网设备的守护进程都将看到发送到任一 IP 地址的所有流量,并且 10.* 域中的任何位置的流量都将通过第一个设备路由出去,作为安全措施。您可能需要修改这些行以支持其他选项,或许还需要默认路由。这就是全部内容!

虚拟 Web 服务器

虚拟网络服务的重点是向使用不同域名从同一台机器请求页面的用户呈现不同的文档树。用户接收与特定域名关联的主索引页和路径名,而无需了解同一台机器上存在的其他域名。

实际上,这个问题有两种解决方案。新出现的一种方案使用了一种相当优雅的方法,即客户端在其请求中也指定了它正在寻找的确切目标。但是,这仅适用于网络服务,并且仅适用于 Microsoft 和 Netscape 最近发布的客户端。如果您想在不依赖客户端来使您的服务工作的情况下支持所有人,您将需要另一种解决方案。

一旦你理解了问题,它就相当简单了。你需要一个修改过的 HTTP 守护程序来监听发送到特定 IP 地址的请求,而不是所有发送到当前机器的请求。然后,为每个虚拟客户端启动一个服务器,并使用选项指定不同的配置文件、文档源树等等。

大多数 Web 服务器现在都支持虚拟服务的需求,但有些服务器不支持。如果您使用 NCSA 服务器,则至少需要 1.5 版本。我使用 Apache 服务器,版本 1.1.1。其他设计为 NCSA 守护进程“即插即用”替代品的服务器应该具有此功能,但您应该查看服务器文档以了解有关配置此功能的详细信息。

迄今为止,几乎每个服务器都有不同的配置。本文仅介绍 Apache 守护进程,因为它是作者使用的守护进程,而不是因为作者认为该服务器比任何其他服务器更强大或更弱。

设置

一旦您在两个域名上运行 ping,您就可以开始配置您的虚拟网络服务。最重要的是选择一个智能的文档树布局。如果您只有少量客户端,您可能只有一个源根目录,其中包含不同的子目录,每个客户端一个子目录。他们的树将以他们各自的子目录为根目录。如果您有更多客户,您可能需要更复杂的布局。重要的是现在就决定这一点,因为稍后更改它可能会变得非常混乱。

在您的服务器配置文件中,您需要为每个域名设置服务。这在 Apache 中很容易完成,方法是将配置语句括在 <VirtualHost> 容器中。例如,以下针对 10.1.1.6(我们为 www.tryme.com 获取的 IP 地址)的配置将从

ServerName www.tryme.com
ServerAdmin webmaster@tryme.com
DocumentRoot /usr/web/tryme/docs
TransferLog /usr/web/tryme/access.log
ErrorLog /usr/web/tryme/errors.log

更改为

<VirtualHost 10.1.1.6>
ServerName www.tryme.com
ServerAdmin webmaster@tryme.com
DocumentRoot /usr/web/tryme/docs
TransferLog /usr/web/tryme/access.log
ErrorLog /usr/web/tryme/errors.log
</VirtualHost>
这将指示 Apache(和几个其他类似的守护进程)接受针对 10.1.1.6(在本例中为 www.tryme.com)的请求以及那些配置参数的请求。

请注意,这会自动禁用服务器托管,并且必须设置任何其他目标,否则它们将不可访问。通常,如果一台机器有多个 IP 地址,则发送到任何地址的请求都将得到服务。包含 <VirtualHost> 规范可以防止此活动。另请注意,Apache 中的虚拟主机可以包含可选端口号(例如,<VirtualHost 10.1.1.6:8080>)以提供特定端口的服务。

配置完成后,启动或重启 Web 守护进程,您应该已配置好虚拟网络服务!下个月,我们将研究虚拟电子邮件和 FTP 服务,以及提供类似功能的新技术。

Chad Robinson 是 BRT Technical Services Corporation 的高级系统分析师。人们通常可以在监视器和键盘后面找到他,尤其是当它们连接到运行 Linux 的系统时。当他不编程或管理系统时,他通常会与他的爱人 Alison 共度时光。

加载 Disqus 评论