您现在的位置: 365建站网 > 365学习 > apache 虚拟主机设置

apache 虚拟主机设置

文章来源:365jz.com     点击数:545    更新时间:2009-10-14 10:51   参与评论

环境:

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 webmaster@localhost
        ServerName www.toy.org
    DocumentRoot /var/www
</VirtualHost>

www1
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
        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 webmaster@localhost
        ServerName www.toy.org
    DocumentRoot /var/www
</VirtualHost>

www1
<VirtualHost 192.168.1.103:80>
    ServerAdmin webmaster@localhost
        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来调试

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (545人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------