2013-10-14 12:50:16
来 源
itjs.cn
Apache
这里分享一下Apache的虚拟主机配置,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。

虚拟主机使得一台服务器可以运行多个网站。本文介绍如何配置服务器使其支持虚拟主机,包括基于IP的虚拟主机和基于名称的虚拟主机,以及通过运行多个服务daemon实现一台机器运行多个网站的方法。

一、虚拟主机及其应用

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

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

二、基于IP的虚拟主机

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

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

在基于IP的虚拟主机环境中,同一个服务器机器上运行着多个Web网站,但每一个Web网站都有其自己的IP地址。为了实现这一点,首先要在操作系统上设置这些IP地址。大多数现代操作系统都允许我们为一台机器设置任意多的IP地址,具体的设置方法对每种操作系统来说都不同。

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

在机器上设置好多个IP地址之后,还要在DNS(域名服务器)中设置这些IP地址,这样DNS就能够解析赋予这些IP地址的名称。接下来要做的工作就直接和Apache有关了。假定已经将所有的IP地址设置到了机器上,每一个IP地址都有相应的DNS记录,要在Apache的httpd.conf配置文件中增加的内容如下所示。

假设有三个IP地址,对应的名称分别为name1.webserver.com、name2.webserver.com和name3.webserver.com。当然,这里指定的名称也可以属于完全不同的域,例如http://www.qwe.com/ 和 http://www.abc.com/。

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

1).

DocumentRoot  /usr/local/apache/name1_www

ServerName  name1.webserver.com

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

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

DocumentRoot /usr/local/apache/name2_www

ServerName name2.webserver.com

ServerAlias name2

3).

DocumentRoot /usr/local/apache/name3_www

ServerName name3.webserver.com

ScriptAlias /use/local/apache/name3_cgi

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

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

几乎所有的配置指令都可以用于区。在服务器说明文档中,可以注意到每一个指令都有其合法应用场所的说明,某个指令是否可

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

/usr/local/apache/bin/apachectl configtest

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

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

三、基于名称的虚拟主机

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

使用基于名称的虚拟主机时,无需为机器设定多个IP地址,但是需要在DNS中写入多个名称映射到一台服务器IP的记录,如:name1,server.com/name2.server.com/name3.server.com所映射的IP地址都是192.168.1.1。 配置DNS服务器使它将所有指定的名称解析为服务器的IP地址之后,还要将下面的内容加入Apache服务器的配置文件:

NameVirtualHost 192.168.1.1

1).

ServerName name1.webserver.com

DocumentRoot /usr/local/apache/name1docs

ServerAlias name1

2).

ServerName name2.webserver.com

DocumentRoot /usr/local/apache/name2docs

ServerAlias name2

3).

ServerName name3.webserver.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中登记,否则用户将不能访问到自己想要访问的页面。

 

四、运行多个daemon

事实上还有第三种在一个服务器上运行多个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.

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。