当前位置: 主页 > 服务器技术 > Web服务器 > apache大容量虚拟主机的动态配置解决方案

apache大容量虚拟主机的动态配置解决方案

时间:2010-3-15来源:互联网 点击:

如果你的配置文件 httpd.conf 中包含类似下面的许多 <VirtualHost> 部分,并且其中的内容都大致相同的话, 你应该会对这里所要讲的技术比较感兴趣。 
NameVirtualHost 111.22.33.44 
<VirtualHost 111.22.33.44> 
ServerName www.customer-1.com 
DocumentRoot /www/hosts/www.customer-1.com/docs 
ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin 
</VirtualHost> 
<VirtualHost 111.22.33.44> 
ServerName www.customer-2.com 
DocumentRoot /www/hosts/www.customer-2.com/docs 
ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin 
</VirtualHost> 
# blah blah blah 
<VirtualHost 111.22.33.44> 
ServerName www.customer-N.com 
DocumentRoot /www/hosts/www.customer-N.com/docs 
ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin 
</VirtualHost> 

最基本的思想是用动态的机制来实现所有这些静态的 <VirtualHost> 配置。这样做有许多优点: 

配置文件变小,使得 Apache 可以更快的启动,同时消耗更少的内存。 
添加一个虚拟主机,应该只是简单的在文件系统中创建合适的目录, 以及配置相关的 DNS 信息,并且无需重新启动 Apache。 
主要的缺点是你无法针对每个虚拟主机用户使用不同的日志文件。 然而,如果真的在配置有大量虚拟主机的服务器上记录不同的日志文件的话,很有可能会达到操作系统所允许的最大文件描述符(file descriptors)的数量。更好的办法是把日志写到管道(pipe)或者先入先出(fifo)的堆栈,并启用其他的进程来分发所得到的日志信息给用户(同时也可以做一些历史纪录的统计等等)。 

概要 

一个虚拟主机有两部分来定义:一个是它的 IP 地址, 还有一个是 HTTP 请求中 Host: 头的内容。动态大容量虚拟主机的技术, 是基于自动在所要返回的文件的路径中插入相关信息的想法而实现的。 使用mod_vhost_alias 可以很容易的实现, 但如果你的 Apache 版本低于 1.3.6 ,则你必须使用 mod_rewrite。 两者在默认情况下都不启用;要使用他们,必须在配置和编译 Apache 的阶段声明启用(enable)。 

我们需要做很多伪装,才能使动态虚拟主机看起来像普通情况。 最重要的一点是 Apache 使用虚拟主机名字(Server Name)来生成自我参考(self-referential) 的 URLs 等等信息。这是用 ServerName 指令来配置的,并且可以通过环境变量 SERVER_NAME 传递给 CGI 脚本。 在运行时所实际使用的值是由指令 UseCanonicalName 的设置情况来控制的。当 UseCanonicalName Off 时, 虚拟主机名字(server name)取自请求中的 Host: 头的内容。 当 UseCanonicalName DNS 时,则通过 DNS 反解析虚拟主机的IP 地址得到主机名字。以前的做法是用基于名称的动态虚拟主机,近来常用基于 IP 地址的虚拟主机设置。 如果 Apache 无法决策虚拟主机名字,则可能是没有 Host: 头信息或者 DNS 解析失败, 遇到这样的情况,Apache 使用配置 ServerName 时所填写的主机名字。 

简单的动态虚拟主机 

这是 httpd.conf 文件中,完成和上文 动机 部分所提到的虚拟主机一样效果的配置方法,但这里采用了 mod_vhost_alias 。 

# 从 Host: 头中取得服务器名字 Server Name 
UseCanonicalName Off 

# 这里的日志格式,可以在将来通过第一个参数域来分隔不同的虚拟主机的日志 
LogFormat "%V %h %l %u %t "%r" %s %b" vcommon 
CustomLog logs/access_log vcommon 

# 在返回请求的文件名的路径中包含进服务器名字: server name 
VirtualDocumentRoot /www/hosts/%0/docs 
VirtualScriptAlias /www/hosts/%0/cgi-bin 

将 UseCanonicalName Off 的配置改为 UseCanonicalName DNS 即可实现基于 IP 地址的虚拟主机。而在文件路径中所要插入的服务器名字(server name) 则通过虚拟主机的 IP 地址解析而得。 

一个实际的个人主页主机系统 

这里对上面的系统作了一点调整,便可作为 ISP 的个人主页服务器。 我们使用了略微复杂的方法,从服务器名字(Server Name)中提取子字符串, 并插入到文件路径中。在这个例子中,www.user.isp.com 的文档将在 /home/user/ 中定位。并对所有虚拟主机使用单个 cgi-bin 目录。 

# 所有之前的准备事项和上面一样,然后 

# 在文件路径中包含服务器名字(server name) 
VirtualDocumentRoot /www/hosts/%2/docs 

# 单个 cgi-bin 目录 
ScriptAlias /cgi-bin/ /www/std-cgi/ 

更复杂的关于 VirtualDocumentRoot 的设置,可以查阅 mod_vhost_alias 文档。 

在同一个服务器上架设多个主机的虚拟系统 

更复杂的设置,应该使用 Apache 的 <VirtualHost> 指令来管理各种虚拟主机配置的作用域。例如,你可以用一个 IP 地址来给个人主页客户使用, 同时用下面的配置提供给商业客户使用。自然的,这两者通过运用 <VirtualHost>结合到一起。 

UseCanonicalName Off 
LogFormat "%V %h %l %u %t "%r" %s %b" vcommon 
<Directory /www/commercial> 
Options FollowSymLinks 
AllowOverride All 
</Directory> 
<Directory /www/homepages> 
Options FollowSymLinks 
AllowOverride None 
</Directory> 
<VirtualHost 111.22.33.44> 
ServerName www.commercial.isp.com 
CustomLog logs/access_log.commercial vcommon 
VirtualDocumentRoot /www/commercial/%0/docs 
VirtualScriptAlias /www/commercial/%0/cgi-bin 
</VirtualHost> 
<VirtualHost 111.22.33.45> 
ServerName www.homepages.isp.com 
CustomLog logs/access_log.homepages vcommon 
VirtualDocumentRoot /www/homepages/%0/docs 
ScriptAlias /cgi-bin/ /www/std-cgi/ 
</VirtualHost> 

更为有效的基于 IP 地址的虚拟主机 

在 第一个例子 中说过,转为基于 IP 地址的虚拟主机设置很容易做到。但不幸的是,那种做法并不高效,因为这样会在每次处理请求时,需要查询 DNS 。 通过在文件系统中包含IP 地址的做法可以避免这样的问题。这样一来, 免去了和服务器名字的关联,在日志记录中也一样可以用 IP 来分离不同日志。 Apache 将不会为了确定服务器名字(server name)而去做 DNS 查询。 

站长资讯网
. TAG: 虚拟主机 apache 动态配置
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言