有许多虚拟服务器的提供商可以在一台主机上为多个用户提供Web服务,并且每个Web服务器可以通过不同的域名来访问。在Debian上,我们可以轻松的通过apache2来实现类似的功能。除了进行一些简单的配置外,我们所需要的软件包都使用Debian提供的安装包而不必从源代码来安装。
有许多种不同的方法可以将Apache配置这样的功能,这里介绍一种通过 NameVirtualHost 来进行配置的方法,这种方法的好处是你不需要在主机上绑定多个不同的IP地址,只需要将不同的域名都指向Web服务器的IP地址即可。
例如在一台主机IP地址为 222.222.222.222的Web服务器上,希望配置 www.rediceli.com,mail.rediceli.com,services.rediceli.com,只需要在DNS服务器(或DNS提供商的服务器)上将这些域名都指向222.222.222.222即可。当然,还可以是另一些完全不同的域名,如 www.example.com。
因为我们要在一台机器上提供多个Web服务器,为了不至于引起不必要的混乱,最好将每个服务器的Web根目录,CGI目录和日志目录等完全分开。可以直接在Debian提供的Web目录下构造这些目录,也可以在一个完全不同的目录里构造,如/opt/www目录。例如,可以类似如下的目录结构:
root@debain ~# mkdir /opt/www
root@debain ~# mkdir /opt/www/www.rediceli.com
root@debain ~# mkdir /opt/www/www.rediceli.com/html
root@debain ~# mkdir /opt/www/www.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/www.rediceli.com/logs
root@debain ~# mkdir /opt/www/mail.rediceli.com
root@debain ~# mkdir /opt/www/mail.rediceli.com/html
root@debain ~# mkdir /opt/www/mail.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/mail.rediceli.com/logs
root@debain ~# mkdir /opt/www/service.rediceli.com
root@debain ~# mkdir /opt/www/service.rediceli.com/html
root@debain ~# mkdir /opt/www/service.rediceli.com/cgi-bin
root@debain ~# mkdir /opt/www/service.rediceli.com/logs
上面的过程,我们分别为三个域名创建了Web服务器所需的目录。下一步,我们应该在apache的配置中开启虚拟主机(Virtual hosts)的功能。简单的方法是创建一个配置文件 /etc/apache2/conf.d/virtual.conf,文件的内容如下:
#
# We're running multiple virtual hosts.
#
NameVirtualHost *
完成上面的工作后,我们可以开始为每个域名建立一个独立的配置文件。Apache2的站点配置包括两个目录:
- /etc/apache2/sites-available 这个目录包含一些可用的站点配置文件,但这些并不一定生效。
- /etc/apache2/sites-enabled 这个目录内的配置为已经生效的站点的配置。
apache2启动时,sites-enabled目录的内容将被读取并生效,而sites-available目录的内容则不会理会。通常Debian的作法是,将所有的站点配置文件都放在sites-available中,而将需要生效的配置通过软链放置到sites-enabled中。我们配置时也会将所有的配置都放置到sites-available目录中,然后在sites-enabled中创建指向相应配置的链接。Debian有一些工具a2ensite和a2dissite来辅助我们完成允许和禁用站点的功能,这样,我们只需要在sites-available目录中创建相应的配置,再执行相应的命令,即可使这些配置生效或禁用。
下面我们开始为 www.rediceli.com 创建配置文件,创建文件 /etc/apache2/sites-available/www.rediceli.com,包含下面的内容:
#
# www.rediceli.com (/etc/apache2/sites-available/www.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName www.rediceli.com
ServerAlias rediceli.com
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/www.rediceli.com/html/
# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/www.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /opt/www/www.rediceli.com/logs/error.log
CustomLog /opt/www/www.rediceli.com/logs/access.log combined
</VirtualHost>
下面创建 mail.rediceli.com的配置文件,创建文件/etc/apache2/sites-available/mail.rediceli.com,包含下面的内容:
#
# mail.rediceli.com (/etc/apache2/sites-available/mail.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName mail.rediceli.com
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/mail.rediceli.com/html/
# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/mail.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /opt/www/mail.rediceli.com/logs/error.log
CustomLog /opt/www/mail.rediceli.com/logs/access.log combined
</VirtualHost>
最后在文件/etc/apache2/sites-available/service.rediceli.com中创建 service.rediceli.com的配置:
#
# service.rediceli.com (/etc/apache2/sites-available/service.rediceli.com)
#
<VirtualHost *>
ServerAdmin webmaster@rediceli.com
ServerName service.rediceli.com
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /opt/www/service.rediceli.com/html/
# CGI Directory
ScriptAlias /cgi-bin/ /opt/www/service.rediceli.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /opt/www/service.rediceli.com/logs/error.log
CustomLog /opt/www/service.rediceli.com/logs/access.log combined
</VirtualHost>
现在,我们已经为三个域名分别创建了配置文件,并建立了不同的目录来存放web页面,CGI程序和日志文件。要允许这些配置,可以通过下面的命令来完成:
root@debain ~# a2ensite www.rediceli.com
Site www.rediceli.com installed; run /etc/init.d/apache2 reload to enable.
root@debain ~# a2ensite mail.rediceli.com
Site mail.rediceli.com installed; run /etc/init.d/apache2 reload to enable.
root@debain ~# a2ensite service.rediceli.com
Site service.rediceli.com installed; run /etc/init.d/apache2 reload to enable.
注意:a2ensite并不会立即在当前运行的apache服务器里生效,必需通过重新启动apache来生效这些配置,这在前面解释a2ensite时已经解释过了,它的功能主要用于建立一个sites-enabled目录中的链接。
现在,你可以分别在每个站点的主目录里放置一个不同的主页文件(index.html),然后重启apache服务器,看一下是否可以通过三个不同的域名来访问不同的服务页面。重启apache服务器通过下面的命令来完成:
root@debain ~# /etc/init.d/apache2 reload
Reloading web server config...done.
root@debain ~#
好了,一个拥有三个虚拟Web服务器的Debian服务器配置完成了。如果你的服务器够强大,还可以类似的配置更多的站点。