46.4. 虚拟主机

术语虚拟主机指 Apache 在一个物理计算机上为多个 URI(universal resource identifier,统一资源标识符)提供服务的能力。这意味着在一个物理计算机上的一个万维网服务器可以运行几个域(例如 www.example.com 和 www.example.net)。

通常的做法是使用虚拟主机来节省管理精力(只需维护一个万维网服务器即可)和硬件费用(每个域不需要专用的服务器)。虚拟主机可以是基于名称、基于 IP 或基于端口的。

可以使用 YaST(请参见 默认主机)或手工编辑 httpd.confVirtual Host 部分(请参见 第 46.3.2 节 “手工配置 Apache”)来配置虚拟主机。

默认情况下,SUSE Linux 中的 Apache 在 /etc/apache2/vhosts.d/ 中为每个虚拟主机准备了一个配置文件。虚拟主机的基本模板可在此目录中找到(vhost.template)。也可以在其他位置添加虚拟主机配置,例如在即将包含入配置的某个文件中。

[Important]重要

使用命令 httpd2 -S 检查虚拟主机设置是十分有帮助的。该命令输出 Apache 能理解的虚拟主机设置,从而帮助您确保得到预期的结果。如果将 Apache 与例如 -DSSL 之类的标志一起使用,则在测试时需要使用相同的标志,例如使用 httpd2 -S -DSSL

46.4.1. 基于名称的虚拟主机

使用基于名称的虚拟主机,每个 IP 地址能服务多个万维网站点。Apache 使用客户程序发送的 HTTP 报头中的主机字段来将请求连接到某个虚拟主机声明中匹配的 ServerName 项。如果找不到匹配的 ServerName,则默认使用第一个指定的 VirtualHost

NameVirtualHost 启动 Apache 配置的 Virtual Host 部分。

46.4.1.1. NameVirtualHost

NameVirtualHost 告诉 Apache 万维网服务器在哪个 IP 地址以及可选的哪个端口监听客户程序发出的在 HTTP 报头中包含域名的请求。

第一个自变量是完全限定的域名,但建议使用 IP 地址。第二个自变量是可选的端口。默认情况下,使用端口 80 并通过 Listen 指令(网络设备选择)进行配置。

IP 地址和端口号都可以使用通配符 * 来接收所有接口上的请求。IPv6 地址必须括在方括号中。

例 46.8. 基于名称的 VirtualHost 项的变体

# NameVirtualHost IP-address[:Port]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. 在基于名称的环境中的 <VirtualHost></VirtualHost>

<VirtualHost></VirtualHost> 块保存适用于特定域的信息。当 Apache 接收到客户程序对某已定义 VirtualHost 的请求时,将使用此部分所包含的指令。在此可以使用在 VirtualHost 环境中允许使用的任何 Apache 指令。在基于名称的虚拟主机配置中,VirtualHost 左标记后可使用以下自变量:

  • 之前使用 NameVirtualHost 指令声明的 IP 地址(或完全限定的域名)。

  • 之前使用 NameVirtualHost 指令声明的可选端口号。

允许使用通配符 * 代替 IP 地址。该语法仅当和 NameVirtualHost * 中的通配符一起使用时才有效。当使用 IPv6 地址时,地址必须括在方括号中。

例 46.9. 基于名称的 VirtualHost 指令

<VirtualHost 192.168.1.100:80>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin webmaster@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]>
    # 2002:c0a8:164:: is the IPv6 equivalent to 192.168.1.100
    ServerName www.example.org
    DocumentRoot /srv/www/htdocs/example.org
    ServerAdmin webmaster@example.org
    ErrorLog /var/log/apache2/www.example.org-error_log
    CustomLog /var/log/apache2/www.example.org-access_log common
</VirtualHost>
                

在此示例中,域 www.example.com 和 www.example.net 都储存在 IP 地址为 192.168.1.100 的计算机上。第一个 VirtualHost 对于所有进来的万维网服务器请求是默认值。

指令 ErrorLog第 46.3.2.3.4 节 “ErrorLog file | "|command" 中进行了描述)和 CustomLog(请参见 http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog)不需要包含域名。这里,使用您选择的名称。

46.4.2. 基于 IP 的虚拟主机

这种备选的虚拟主机配置要求为计算机设置多个 IP。Apache 的一个实例储存多个域,并为每个域指派一个不同的 IP。

[Important]IP 地址和基于 IP 的虚拟主机

物理服务器必须为每个基于 IP 的虚拟主机指定一个 IP 地址。如果计算机没有多个网卡,也可以使用虚拟网络接口(IP 别名)。

46.4.2.1. 配置 IP 别名

要使 Apache 储存多个 IP,物理计算机必须接受对多个 IP 的请求。这称为多 IP 储存。此外,必须在内核中激活 IP 别名。在 SUSE Linux 中,这是默认设置。

配置内核支持 IP 别名后,可以使用命令 ifconfigroute 设置主机上的其他 IP。必须以 root 用户身份执行这些命令。

对于以下示例,假设主机已将 IP 192.168.0.10 指派给网络设备 eth0。输入命令 ifconfig 查看主机的 IP。可以使用以下命令添加其他 IP 地址:

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
            

所有这些 IP 地址都被指派给同一个物理网络设备 (eth0)。

46.4.2.2. 在基于 IP 的环境中的 <VirtualHost></VirtualHost>

在系统上设置了 IP 别名或为主机配备了几块网卡后,就可以配置 Apache 了。请为每个虚拟服务器指定一个单独的 VirtualHost 块。

以下示例显示,Apache 在 IP 为 192.168.1.10 且储存着其他两个 IP 为 192.168.0.20192.168.0.30 的域的计算机上运行的情况。这个特定的示例只适用于专用网,因为公共因特网上不路由从 192.168.0.0192.168.255.0 的 IP。

例 46.10. 基于 IP 的 VirtualHost 指令

<VirtualHost 192.168.0.20>
    ServerName www.example.com
    DocumentRoot /srv/www/htdocs/example.com
    ServerAdmin webmaster@example.com
    ErrorLog /var/log/apache2/www.example.com-error_log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30>
    ServerName www.example.net
    DocumentRoot /srv/www/htdocs/example.net
    ServerAdmin tux@example.net
    ErrorLog /var/log/apache2/www.example.net-error_log
    CustomLog /var/log/apache2/www.example.net-access_log common
</VirtualHost>
                

在此,VirtualHost 指令只针对除 192.168.0.10 以外的接口。当 Listen 指令(在 网络设备选择 中进行了描述)也配置给了 192.168.0.10 时,必须创建单独的基于 IP 的虚拟主机来答复对该接口的 HTTP 请求或者应用 /etc/apache2/httpd.confMain Server 部分的指令(请参见 第 46.3.2.3 节 “/etc/apache2/httpd.conf 中的 Apache 指令:Main Server ”)。