QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6669|回复: 9

Apache配置虚拟主机

[复制链接]
发表于 2002-12-3 12:30:52 | 显示全部楼层 |阅读模式
虚拟主机使得一台服务器可以运行多个网站。本文介绍如何配置服务器使其支持虚拟主机,包括基于IP的虚拟主机和基于名称的虚拟主机,以及通过运行多个服务daemon实现一台机器运行多个网站的方法。

一、虚拟主机及其应用(1月15日)

   虚拟主机就是运行在同一物理服务器上的具有不同名字的多个Web网站。它的基本思想是:即使所有网站都运行在同一个服务器上,Apache也知道用户访问的是哪一个网站,而且能够正确地返回用户所请求的内容。

   虚拟主机是这样一种特殊的技术:它使得我们可以在一台机器上运行多个Web网站,支持许多不同的域名和一个域之内的多个名字,从而使得一台通过DSL接入的家用计算机看起来象是一屋子的服务器。这是一种非常巧妙的技术。

  为什么要使用虚拟主机

   或许你现在已经有了自己的应用虚拟主机的设想。下面是本人通常使用虚拟主机的情况。我在一家Web设计公司工作。为客户开发Web网站时,我们总是为该客户配置一个专用的虚拟主机。这些虚拟主机往往是基于名称的虚拟主机,因为这设置起来比较快,而且几乎总是只在内部进行。也就是说,在内部DNS服务器上设置一下名称,这样内部的主机就可以看到这个Web网站,而外面的浏览器只能看到我们开发服务器上公开的内容。

   这种做法有着许许多多的好处。它使得我们能够设置网站的目录结构,其设置方法又和开发完成后实际运行的网站完全一样。它使得我们能够完全地分离不同网站的文件,不会出现搞不清某个文件属于哪个网站的混乱。此外,从开发者的角度来看,它使得我们能够在DreamWeaver中设置完全独立的网站,而不仅仅是设置同一网站的不同子目录。

   最后,如果使用虚拟主机,不论我们同时开发的客户项目有多少,都无需分别为每个网站配置一个新的服务器。在任何时候这都是使用虚拟主机最主要的理由。

二、基于IP的虚拟主机(1月15日)

   我们可以用两种方法设置虚拟主机。这两种方法只是服务器上配置的不同,对客户来说没有什么区别——也就是说,用户无法知道他们所使用的虚拟主机属于哪一种类型,甚至不会知道自己正在使用虚拟主机。

   这两种类型分别是基于IP的(IP-based)虚拟主机和基于名称的(Name-Based)虚拟主机。简单地说,两者的区别在于:使用基于IP的虚拟主机时,每一个虚拟主机都有一个不同的IP地址,而基于名称的虚拟主机都有相同的IP地址,但它们的名称不同。两种类型各有优点,但它们的实现方法并没有什么大的差别。

   在基于IP的虚拟主机环境中,同一个服务器机器上运行着多个Web网站,但每一个Web网站都有其自己的IP地址。为了实现这一点,我们首先要在操作系统上设置这些IP地址。大多数现代操作系统都允许我们为一台机器设置任意多的IP地址,具体的设置方法对每种操作系统来说都不同。本文不准备在方面作深入的介绍。如果你不熟悉如何在自己的操作系统上进行设置,请向熟悉的专家请教。一般这种设置并不是很困难。或者,你也可以跳过这种基于IP的虚拟主机,直接转入下面介绍的基于名称的虚拟主机。

   有些老式的操作系统要求每个NIC(network interface card,网卡)对应一个IP地址,但现在一般不再有这种限制。

   在机器上设置好多个IP地址之后,我们还要在DNS(域名服务器)中设置这些IP地址,这样DNS就能够解析我们赋予这些IP地址的名称。这里我们不准备介绍DNS记录的具体设置方法,你可以要求DNS服务器的管理员设置这些记录。

   接下来要做的工作就直接和Apache有关了。假定我们已经将所有的IP地址设置到了机器上,每一个IP地址都有相应的DNS记录,要在Apache的httpd.conf配置文件中增加的内容如下所示。

   这里我们假定有三个IP地址,对应的名称分别为name1.mydomain.com、name2.mydomain.com和name3.mydomain.com。当然,这里指定的名称也可以属于完全不同的域,例如www.mydomain.com 和 www.myotherdomain.com。

   加入httpd.conf配置文件的内容如下所示:





DocumentRoot /usr/local/apache/name1_www

ServerName name1.mydomain.com

ErrorLog /usr/local/apache/logs/name1_logs/error_log

TransferLog /usr/local/apache/logs/name1_logs/access_log





ServerAdmin [email protected]

DocumentRoot /usr/local/apache/name2_www

ServerName name2.mydomain.com

ServerAlias name2





DocumentRoot /usr/local/apache/name3_www

ServerName name3.mydomain.com

ScriptAlias /use/local/apache/name3_cgi







   注意我们并不需要为每个虚拟主机指定所有的配置细节。凡是没有指定的配置细节都将从服务器主配置文档继承。例如在上面的第二个虚拟主机中,我们没有指定记录日志的地方,这个虚拟主机将把日志信息写入主服务器日志文件。

   另外也请注意在第三部分中我们指定了一个CGI目录。对于其他两个部分来说,当用户访问一个包含/cgi-bin/的URL时,都默认使用主服务器配置中所指定的CGI目录,这是因为它们的虚拟主机配置中都没有指定CGI目录。

   几乎所有的配置指令都可以用于区。在服务器说明文档中,我们可以注意到每一个指令都有其合法应用场所的说明,某个指令是否可以在虚拟主机配置中使用应该已经相当清楚。

   请记住务必在重新启动服务器之前测试一下新的配置文件:



/usr/local/apache/bin/apachectl configtest





   另外一个方便的技巧是使用SeverAlias指令,它对基于名称的虚拟主机同样适用。在LAN内访问内部服务器时,我们往往希望使用比较简单的服务器名字,例如“name2”,而不是它的全称“name2.mydomain.com”。Apache无法知道“name2”和“name2.mydomain.com”实际上是同一个Web网站,使用ServerAlias指令可以确保我们在使用简称时不会得到意想不到的页面。

   重新启动服务器应用新的配置文件之后,Apache就能够根据URL判断用户访问的是哪一个Web网站,在此基础上提供正确的页面。即使所有网站在同一物理服务器上也绝不会出错。
三、基于名称的虚拟主机(1月15日)

   当然,许多时候我们不能奢侈到给一台机器指定多个IP地址的地步。IP地址已经越来越紧张,而且在很多时候,例如象我是通过DSL接入,我们只能占有一个IP地址。在这种情况下,基于名称的虚拟主机正好适用。

   使用基于名称的虚拟主机时,我们无需为机器设定多个IP地址,但仍旧涉及到DNS服务器的管理员,要由他们为我们的机器设置一个以上的DNS记录。这些额外的记录称为C-record,或者CName(指向某台机器的主记录称为AName,或A-record)。我们可以让任意数量的CName指向一台特定的机器。

   配置DNS服务器使它将所有指定的名称解析为服务器的IP地址之后,我们还要将下面的内容加入Apache服务器的配置文件:



NameVirtualHost 192.168.1.1



ServerName name1.mydomain.com

DocumentRoot /usr/local/apache/name1docs

ServerAlias name1





ServerName name2.mydomain.com

DocumentRoot /usr/local/apache/name2docs

ServerAlias name2





ServerName name3.mydomain.com

DocumentRoot /usr/local/apache/name3docs

ServerAlias name3







   正如配置基于IP的虚拟主机,我们可以在这里使用任何适用的配置指令,本例的配置应该说是相当简单的。

   下面是一些注意事项。

   首先,我们必须用NameVirtualHost指令指定哪个IP地址负责响应对虚拟主机的请求。我们可以联合运用基于IP和基于名称的虚拟主机——也就是说,可以在同一服务器上同时地配置这两种虚拟主机,因此我们必须指定哪一个IP地址用于基于名称的虚拟主机。如果我们要在服务器的内部接口和外部接口(即Intranet服务器和Internet服务器)上设置虚拟主机,必须同时指定这两个地址:



NameVirtualHost 192.168.1.1

NameVirtualHost 208.32.54.7





   此外,除了不同的地址之外,我们还可以在不同的端口上运行虚拟主机,当然这会使系统变得非常复杂:



NameVirtualHost 192.168.1.1:80

NameVirtualHost 192.168.1.1:90





   注意确保所有的名称都已经在DNS中登记,否则用户将不能访问到自己想要访问的页面。

   虚拟主机能够正确发挥作用的窍门之一在于浏览器告诉了服务器它正在向谁请求内容。有些仍在使用的较老的浏览器不能正确地做到这一点,它们会从机器上的“默认”服务器读取内容。不过我们几乎无需为此担心,因为至少在最近5年来(或更早)发布的浏览器都具有这个能力。在Apache里,针对那些不能好好配合的浏览器,我们还有相应的解决办法,不过这就留给你自己去研究。如果你对此感兴趣,请从http://www.apache.org/docs/manual/vhosts/index.html开始。

四、运行多个daemon(1月15日)

   事实上我们还有第三种在一个服务器上运行多个Web网站的方法,这就是在同一机器上运行多个完全独立的服务daemon,每个daemon提供一个Web网站的服务。这种方法的缺点在于每个daemon必须在不同的端口上运行,这是因为我们无法让多个服务同时监听同一端口。

   我们可以用-f命令行选项让Apache服务器使用指定的配置文件:



/usr/local/apache/bin/apache -f /usr/local/apache/conf/name2_httpd.conf





   这使得我们可以运行任意数量(只要机器能够支持)的服务daemon,每一个服务都以不同的配置运行。当然,此时应当确保每一个配置文件都有一个端口指令指向不同端口,否则自第一个以后的其他服务daemon都将不能启动并提示下列错误信息:



Could not bind to port 80: Port already in use.





   结束语:虚拟主机使得我们可以在同一服务器机器上运行多个Web网站,它有着许多好处。总而言之,它使得你可以对上司说:“我们并不需要为了运行其他18个网站去购买新的机器”。
发表于 2003-9-11 08:46:23 | 显示全部楼层
好!
回复

使用道具 举报

发表于 2004-8-14 13:37:06 | 显示全部楼层
解决了困扰我许久的困惑,真是太好了,不过还有许多地方不是很明白,慢慢研究了
回复

使用道具 举报

发表于 2004-11-3 13:35:12 | 显示全部楼层
知识的道路上真是无止尽啊
回复

使用道具 举报

发表于 2004-11-3 17:55:46 | 显示全部楼层
能否據體說說在局域網如何配置虚拟主机,我總做不成功.我在局域網的電腦上只要打上我所配置的網站名稱如:www.test.com,它就會自動去internet去查找,直到查不到而提示沒有此網頁.我已在linux主機的/etc/host內寫入了  www.test.com   192.168.1.10 的對應關系,請問是否還要其它特殊配置?
回复

使用道具 举报

发表于 2004-11-3 21:57:23 | 显示全部楼层
你的局域网的机器,如何知道 www.test.com ?
回复

使用道具 举报

发表于 2004-11-3 22:52:00 | 显示全部楼层
大家说说,相对来说LINUX下哪种服务器相对比较难配置啊?
回复

使用道具 举报

发表于 2004-11-4 09:26:26 | 显示全部楼层
[quote:78f652b9df="gugong"]你的局域网的机器,如何知道 www.test.com ?[/quote]
初學linux,這正是我不解的地方,請多多指點.是否關系到dns服務器的安裝?應如何安裝?
回复

使用道具 举报

发表于 2004-11-4 16:53:12 | 显示全部楼层
終於裝好dns,順便解決了apache的虛擬主機問題.
回复

使用道具 举报

发表于 2005-11-19 01:21:44 | 显示全部楼层
我来补充一点,在做基于端口的虚拟主机时,需要在httpd.conf里写入Listen这一行,例如:
当有这两行时
Listen:80
Listen:90
下面的虚拟主机才会生效
NameVirtualHost 192.168.1.1:80
NameVirtualHost 192.168.1.1:90
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-23 21:06 , Processed in 0.114088 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表