os:ubuntu9.0.4
apache: Apache/2.2.11 (Ubuntu)
在ubuntu下apache的配置和redhat系列稍有不同
apache2的虚拟主机配置取决于几个重要的配置文件
/etc/apache2/ports.conf 放置 NameVirtualHost指令和Listen指令
/etc/apache2/sites-enable/* 放置虚拟主机的软链, 软链到/etc/apache2/sites-available/目录的同名文件 我了解为方便配置,一个文件一个虚拟主机
/etc/apache2/sites-available/* 放置虚拟主机文件的地方
apache2没有主服务器的说法,当然你可以配置,一切都是虚拟主机通过VirtualHost指令来配置
1)基于域名的虚拟主机
NameVirtualHost addr[:port] 这个指令是必须的
否者虚拟主机不会有效果
比如两个配置文件www 和www1,
www
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.toy.org
DocumentRoot /var/www
</VirtualHost>
www1
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www1.toy.org
DocumentRoot /var/www1
</VirtualHost>
设置NameVirtualHost *:80后一切正常,
如果不设置,http://www.toy.org 和http://www1.toy.org 都会访问www配置
为什么都访问www,而不是www1,到底以那个配置为准
我猜测,apache2会安配置文件的名字排序,已排在前面的配置为准
为了验证这个猜测,我将www名字改为zzz,
果然http://www.toy.org 和http://www1.toy.org 都会访问www1配置
注意NameVirtualHost 后面的addr[:port] 必须和VirtualHost 后面的addr[:port]严格一致,
比如NameVirtualHost *:80 VirtualHost 127.0.0.1:80是不匹配的
另外你
可通过shell脚本 /usr/sbin/apache2ctl -S
或者 二进制脚本 sudo /usr/sbin/httpd -S
调试虚拟主机设置
2)基于ip地址的虚拟主机
www
<VirtualHost 127.0.0.1:80>
ServerAdmin [email protected]
ServerName www.toy.org
DocumentRoot /var/www
</VirtualHost>
www1
<VirtualHost 192.168.1.103:80>
ServerAdmin [email protected]
ServerName www1.toy.org
DocumentRoot /var/www1
</VirtualHost>
无须设置NameVirtualHost
3)_default_虚拟主机
比如
<VirtualHost _default_>
DocumentRoot /www/htdocs
</VirtualHost>
如果apache找不到(ip地址:端口号)对应的虚拟主机,那么就使用_default_虚拟主机
小结
上面两种是虚拟主机配置最基本的情况,复杂的比如将上面的基本情况混杂在一起,但基本原理不变 :
1)基于域名的虚拟主机和基于IP的虚拟主机之间互相不干扰。基于IP的虚拟主机只接受发送到它自身地址集的请求,而不接受其他IP地址。
基于域名的虚拟主机也是一样,它们只接受NameVirtualHost指令定义的地址集的访问
2)永远不会对一个基于IP的虚拟主机执行ServerAlias和ServerPath检查
3)仅当没有其他虚拟主机符合客户端请求的IP地址和端口号时,"_default_"虚拟主机才会捕获这个请求。
并且仅当"_default_"虚拟主机的端口号(默认值由您的Listen指定)与客户端发送请求的目的端口号相符时,这个请求才会被捕获。
也可以使用通配符(例如:"_default_:*")来捕获任何端口号的请求
4)应当为每个虚拟主机设定ServerName 。否则就会需要为每个虚拟主机进行DNS查询
5)
在开启虚拟主机的情况下,当一个请求到达的时候,服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的(ip地址:端口号)
如果能够匹配,它就会查找每个与这个(ip地址:端口号)相对应的<VirtualHost>段,并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。
如果找到了,它就会使用这个服务器。否则,将使用符合这个(ip地址:端口号)的第一个列出的虚拟主机,(怎么确定第一个,这个在上文已讨论 ),
如果连这个地址的虚拟主机都找不到,就去找_default_虚拟主机, 如果还找不到,返回404
6)别忘了使用上文提到的 httpd -S来调试