2014-04-19 10:32:01
来 源
IT技术网
Apache
本文介绍Apache服务器设置虚拟主机,希望对于初学Apache服务器相关的朋友有帮助,更多Apache安装、配置、报错处理等资源请本站内搜索。
环境:

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来调试

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。