Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125189
  • 博文数量: 29
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 16:44
文章分类

全部博文(29)

文章存档

2009年(6)

2008年(23)

我的朋友

分类: 系统运维

2008-04-22 11:22:37

Apache基于域名的虚拟主机和基于IP的虚拟主机比较

   基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样,你就需要为每个虚拟主机分配一个独立的IP地址。而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术,很多虚拟主机可以共享同一个IP地址。

   基于域名的虚拟主机相对比较简单,因为你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址,然后配置Apache HTTP服务器,令其辨识不同的主机名就可以了。基于域名的服务器也可以缓解IP地址不足的问题。所以,如果没有特殊原因使你必须使用基于IP的虚拟主机,您最好还是使用基于域名的虚拟主机。

    下列情况下,你可能会想要使用基于IP的虚拟主机:一些古董级的客户端与基于域名的虚拟主机不兼容。为了与基于域名的虚拟主机兼容,客户端必须发送"Host"头。HTTP/1.1规范中对此做了要求。而所有现在常见的仅支持HTTP/1.0的旧版本浏览器都以附加的方式实现了这个要求。如果你又想支持这些老浏览器,又想使用基于域名的虚拟主机。我们提供了一个技术方案,你可以在本文末尾看到它。

    SSL协议先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。 一些操作系统和网络设备实现的带宽管理技术无法在多个主机共享一个IP的情况下区别它们。

1. 使用基于域名的虚拟主机

相关模块     相关指令

core        DocumentRoot

            NameVirtualHost

            ServerAlias

            ServerName

            ServerPath

           

    为了使用基于域名的虚拟主机,你必须指定服务器IP地址(和可能的端口)来使主机接受请求,这个可以用NameVirtualHost指令来进行配置。如果服务器上所有的IP地址都会用到,你可以用"*"作为 NameVirtualHost的参数。如果你打算使用多端口(如运行SSL)你必须在参数中指定一个端口号,比如"*:80"。请注意,在NameVirtualHost指令中指定IP地址并不会使服务器自动侦听那个IP地址。另外,这里设定的IP地址必须对应服务器上的一个网络接口。

    取消中心主机(Mainhost) 如果你想在现有的web服务器上增加虚拟主机,你必须也为现存的主机建造一个定义块。这个虚拟主机中ServerName和DocumentRoot所包含的内容应该与全局的ServerName和DocumentRoot保持一致。还要把这个虚拟主机放在配置文件的最前面,来让它扮演默认主机的角色。

    比如你正在为mail.abcd.com域提供服务,而你又想在同一个ip地址上增加一个叫做email.abcd.com的虚拟主机,在httpd.conf中加入以下内容:

 NameVirtualHost *:80


ServerAdmin   

DocumentRoot /path/web/portal

ServerName mail.abcd.com

ErrorLog logs/mail-error_log

CustomLog logs/mail-access_log common

ServerAdmin

DocumentRoot /path/web/corp

ServerName email.abcd.com

ErrorLog logs/email-error_log

CustomLog logs/email-access_log common

    当然,你可以用一个固定的IP地址来代替NameVirtualHost和指令中的"*"号,以达到一些特定的目的。比如说,你可能会希望在一个IP地址上运行一个基于域名的虚拟主机,而在另外一个IP地址上运行一个基于IP的或是另外一套基于域名的虚拟主机。

    很多服务器希望自己能通过不只一个域名被访问。我们可以把ServerAlias指令放入小节中来解决这个问题。比如说在上面的第一个配置段中ServerAlias指令中列出的名字就是用户可以用来访问同一个web站点的其它名字:

 ServerAlias abcd.com *.abcd.com

    这样,所有对域abcd.com的访问请求都将由虚拟主机mail.abcd.com处理。通配符标记"*"和"?"可以用于域名的匹配。当然你不能仅仅搞个名字然后把它放到ServerName或ServerAlias里就算完了。你必须先在你的DNS服务器上进行配置,将这些名字和您服务器上的一个IP地址建立映射关系。

    最后,你可以把其他一些指令放入段中,以更好的配置一个虚拟主机。大部分指令都可以放入这些段中以改变相应虚拟主机配置。主服务器(main server)范围内的配置指令(在所有配置段之外的指令)仅在它们没有被虚拟主机的配置覆盖时才起作用。

    这样,当一个请求到达的时候,服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的IP地址。如果能够匹配,它就会查找每个与这个IP地址相对应的段,并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。如果找到了,它就会使用这个服务器。否则,将使用符合这个IP地址的第一个列出的虚拟主机。

    综上所述,第一个列出的虚拟主机充当了默认虚拟主机的角色。当一个IP地址与NameVirtualHost指令中的配置相符的时候,主服务器中的DocumentRoot将永远不会被用到。所以,如果你想创建一段特殊的配置用于处理不对应任何一个虚拟主机的请求的话,你只要简单的把这段配置放到段中,并把它放到配置文件的最前面就可以了。

2.使用基于IP的虚拟主机
 
系统需求

    就像它的名字"基于IP"所暗示的那样,这样的服务器中每个基于IP的虚拟主机必须拥有不同的IP地址。可以通过配备多个真实的物理网络接口来达到这一要求,也可以使用几乎所有流行的操作系统都支持的虚拟界面(即虚拟网卡)来达到这一要求(详情请参见您的系统文档,这种功能一般被称作"IP别名",一般用"ifconfig"命令来进行设置)。

如何配置Apache
   
    有两种配置方法来使apache支持多主机:为每个虚拟主机运行不同的httpd守护进程;或者用同一个守护进程来支持所有虚拟主机。
 
以下情况使用多个守护进程:
 
    出于安全的考虑,比如说公司甲不希望公司乙的任何人能用除web以外的方式访问到他们的数据。在这种情况下,您需要启动两个守护进程。每个进程都使用不同的User, Group, Listen, ServerRoot设置。
您能够为机器上的每个IP地址提供内存和文件描述符需求。您只能Listen一个"通配符型"地址或一个特定的地址。所以不管出于什么原因,如果您需要侦听一个特定的地址,您就必须同时侦听所有特定的地址。(尽管可以让一个httpd侦听N-1个地址,而让另一个侦听剩下的地址)
   
以下情况使用单一守护进程:
 
httpd的配置可以为多个虚拟主机共享而不引起麻烦。 机器要接受大量的访问请求,从而多启动一个守护进程会导致性能大幅度降低。
   
设置多个守护进程
    为每个虚拟主机创建一个不同的httpd安装。每次安装都在配置文件中使用Listen指令指定守护进程伺服的IP地址(或虚拟主机)。比如:
 
Listen 1.1.1.1:80
 
配置拥有多个虚拟主机的单一守护进程
    在这种情况下,单一的httpd将伺服所有对主服务器和虚拟主机的请求。而配置文件中的VirtualHost指令将为每个虚拟主机配置不同的ServerAdmin, ServerName, DocumentRoot, ErrorLog, TransferLog, CustomLog 。例如:
 

ServerAdmin
DocumentRoot /groups/smallco/www
ServerName
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
 

ServerAdmin
DocumentRoot /groups/baygroup/www
ServerName
ErrorLog /groups/baygroup/logs/error_log
TransferLog /groups/baygroup/logs/access_log
 
    除了创建进程的指令和其他一些指令外,几乎所有的配置指令都能用于指令中。您可以使用指令索引在作用域中查询一个指令是否可以用于指令。
   
    如果使用了suEXEC包装,那么SuexecUserGroup指令也可以在段中使用。
 
注:本文大部分内容来自Apache2.2的中文版参考手册(金步国译)。
阅读(1762) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~