日期:2014-05-16  浏览次数:20817 次

apache 虚拟主机示例
apache 虚拟主机示例
本文档试图解释一些在设置虚拟主机时经常问及的问题。这些示例向你展示了如何在一个服务器上通过基于域名的或是基于IP的虚拟主机来部署多个web站点。另一份关于如何在一个代理服务器后构建基于多个服务器的站点的说明文档也很快就会出来。


在一个IP地址上运行多个基于域名的web站点
您的服务器有只一个IP地址,而在DNS中有很多域名(CNAMES)映射到这个机器。您而您想要在这个机器上运行www.example.com和www.example.org两个站点。

注意
在您的Apache服务器配置中创建一个虚拟主机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web站点的。您可以在您的hosts文件中添加这一条目来进行测试,但这种方法仅适用于那些有这些hosts文件的机器来使用。

服务器配置
# 确保Apache在监听80端口
Listen 80

# 为虚拟主机在所有IP地址上监听
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example.com

# 你可以在这里添加其他指令

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example.org

# 你可以在这里添加其他指令

</VirtualHost>

因为星号匹配所有IP地址,所以主服务器不接收任何请求。因为www.example.com首先出现在配置文件中,所以它拥有最高优先级,可以认为是默认或主服务器。这意味着如果一个请求不能与某个ServerName指令相匹配,它将会由第一个<VirtualHost>段所伺服。

注意
如果您愿意,您可以用确定的IP地址来取代"*"。在这种情况下,VirtualHost的参数必须与NameVirtualHost的参数相符:

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# 其他 ...

然而,当您的IP地址无法确定的时候,使用"*"是很方便的,比如说,您的ISP给您配置的是动态IP地址,而您又使用了某种动态域名解析系统时。因为"*"匹配任何IP地址,所以在这种情况下,不论IP地址如何变化,您都不需要另外进行配置。

上述配置就是您在绝大多数情况下使用基于域名的虚拟主机时将要用到的。事实上,仅在一种情况下这样的配置不会让您满意:您想为不同的IP地址或是端口提供不同的内容。


在多于一个IP的情况下使用基于域名的虚拟主机。
注意
在这里讨论的任何技术都可以推广到使用任意数量的IP地址。

服务器有两个IP地址。一个(172.20.30.40)用于主服务器server.domain.com ,另外一个(172.20.30.50)用于构建两个或多个虚拟主机。

服务器配置
Listen 80

# "主"服务器运行于:172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver

# 这是另外一个IP地址
NameVirtualHost 172.20.30.50

<VirtualHost 172.20.30.50>
DocumentRoot /www/example1
ServerName www.example.com

# 你可以在这里添加其他指令 ...

</VirtualHost>

<VirtualHost 172.20.30.50>
DocumentRoot /www/example2
ServerName www.example.org

# 你可以在这里添加其他指令 ...

</VirtualHost>

任何不是针对172.20.30.50的请求都将由主服务器来伺服。而提交给172.20.30.50却没有主机名或没有"Host:"头的请求,都将由www.example.com伺服。


在不同的IP的地址(比如一个内部和一个外部地址)上提供相同的内容
服务器有两个IP地址(192.168.1.1和172.20.30.40)。这个机器位于内部(局域网)网络和外部(广域网)之间。在外部,域名server.example.com指向外部地址(172.20.30.40),而在内部则指向内部地址(192.168.1.1)。

服务器可以为来自内部和外部的请求提供同样的内容,您只需要一个<VirtualHost>配置段就可以了。

服务器配置
NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /www/server1
ServerName server.example.com
ServerAlias server
</VirtualHost>

现在,从不同的网络提交的请求都会由同一个<VirtualHost>段来伺服。

注意
在内网中,您可以使用server这个名字来代替server.example.com这个全名。

跟上面一样,在上述的例子里,您可以用"*"来代替具体的IP地址,这样就可以对所有的地址都返回相同的内容了。


在不同的端口上运行不同的站点
如果您想让同一个IP的不同端口伺服多个域名。您可以借助在NameVirtualHost指令中定义端口的方法来达到这个目的。如果您想使用不带"name:port"的<VirtualHost name:port>或是直接用Listen指令,您的配置将无法生效。

服务器配置
Listen 80
Listen 8080

NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080

<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot /www/domain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot /www/domain-8080
</VirtualHost>

<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot /www/otherdomain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>


建立基于IP的虚拟主机
一个有两个IP地址(172.20.30.40和172.20.30.50)分别对应域名www.example.com和www.example.org的配置如下:

服务器配置
Listen 80

<VirtualH