当前位置:文档之家› apache虚拟主机配置

apache虚拟主机配置

内容:这里讲述一些Apache虚拟主机中比较容易发生的问题和解决的一些基本思路,给出一些比较典型的错误的示例理解。

一.设置虚拟主机会发生些什么问题?基本上会最容易遇到两个问题:1.虚拟主机发生冲突。

2.宿主机的丢失。

(当然还会遇到其他很多的问题,但是这里我们先讨论这2个问题)1.虚拟主机发生冲突:无论是采用哪种形式的虚拟主机,都会发生虚拟主机冲突的问题,尤其是在Apache的虚拟主机系统变得庞大而复杂的时候尤其容易发生。

但是请记住,无论什么采用什么形式的虚拟主机,甚至多种混用,如果造成虚拟主机冲突的话,根本原因就只有一个:“至少有一个原因,使得Apache不能区别一些虚拟主机”。

之前一个一直强调的一个部分就是“Apache需要能够做到区分每个虚拟主机”。

如果能够通过IP区分的话,那就通过IP区分;如果需要多个主机共享一个IP 的话,那么可以设定不同的端口让Apache去区分;如果需要多个虚拟主机使用一个IP并且端口也用同一个的话,那么也要通过不同的域名来让Apache做到对不同虚拟主机的区分。

一个最经常发生的错误,就是在多个IP地址上进行基于域名方式虚拟主机的配置当中,没有指定和规划好哪几个虚拟主机是归属于哪个IP地址下,造成Apache对一些虚拟主机不能区别。

沿用第二章中的示例,以下给出一个典型错例。

[root@kcentos5 ~]# vi /etc/httpd/myconf/virthosts.conf------------(注意:此为典型错误配置的示例)----------NameVirtualHost 192.168.1.111:80(VirtualHost后面没有指定自己归属的IP地址)DocumentRoot /var/www/vhost1/ServerName (VirtualHost后面没有指定自己归属的IP地址)DocumentRoot /var/www/vhost2/ServerName NameVirtualHost 192.168.1.222:80(VirtualHost后面没有指定自己归属的IP地址)DocumentRoot /var/www/vhost3/ServerName (VirtualHost后面没有指定自己归属的IP地址)DocumentRoot /var/www/vhost4/ServerName -------------------------------------------------------在这个虚拟主机的配置当中,通过2个NameVirtualHost配置项指出Apache将在192.168.1.111和192.168.1.222 这两个IP地址上分别做基于域名的虚拟主机。

但是,在每个虚拟主机的配置当中,又没有在这个虚拟主机头配置当中指定自己所归属的IP地址,虽然在每个虚拟主机里是同过ServerName写明了自己应该受理的域名,但是对于Apache来说,即使得到了客户端对哪个域名的请求,但是它也不知道如何进一步给自己的哪个网络接口的IP地址上的虚拟主机去受理。

那么这个时候Apache遇到这样的问题会怎么做呢?我们就先按以上的错误配置来启动httpd服务看看响应。

[root@kcentos5 ~]# service httpd restart-------------------------------------------------------Stopping httpd: [ OK ] Starting httpd: [Sun Sep 23 19:53:38 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence告警:默认的虚拟主机在监听的80端口上有重叠,因此第一个虚拟主机将获得优先。

[Sun Sep 23 19:53:38 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence[Sun Sep 23 19:53:38 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence[Sun Sep 23 19:53:38 2007] [warn] NameVirtualHost 192.168.1.111:80 has noVirtualHosts告警:网络接口192.168.1.111上不认为有虚拟主机的存在。

[Sun Sep 23 19:53:38 2007] [warn] NameVirtualHost 192.168.1.222:80 has no VirtualHosts告警:网络接口192.168.1.222上不认为有虚拟主机的存在。

[ OK ]-------------------------------------------------------再通过httpd -S命令来更加明确发生的问题,以及发生该问题后Apache所将采取的措施。

[root@kcentos5 ~]# httpd -S-------------------------------------------------------[Sun Sep 23 20:22:43 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence[Sun Sep 23 20:22:43 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence[Sun Sep 23 20:22:43 2007] [warn] _default_ VirtualHost overlap on port 80, the first has precedence告警:默认的虚拟主机在监听的80端口上有重叠,因此第一个虚拟主机将获得优先。

[Sun Sep 23 20:22:43 2007] [warn] NameVirtualHost 192.168.1.111:80 has no VirtualHosts告警:网络接口192.168.1.111上不认为有虚拟主机的存在。

[Sun Sep 23 20:22:43 2007] [warn] NameVirtualHost 192.168.1.222:80 has no VirtualHosts告警:网络接口192.168.1.222上不认为有虚拟主机的存在。

VirtualHost configuration:wildcard NameVirtualHosts and _default_ servers:*:80 (/etc/httpd/myconf/virthosts.conf:16)*:80 (/etc/httpd/myconf/virthosts.conf:21)*:80 (/etc/httpd/myconf/virthosts.conf:28)*:80 (/etc/httpd/myconf/virthosts.conf:33)以上是通配*:80的主机Syntax OK配置语法正确--------------------------------------------------------所以我们可以根据上面的现象了解到一些事实:(1)在多个IP上面采用基于域名方式虚拟主机的时候,除非你只使用一个NameVirtualHost配置项来让Apache将所有自己监听的网络接口地址放在一起共同随机监听。

如果像这样你指定了多条NameVirtualHost来规划好哪些虚拟主机是归属于哪个IP地址的话,那么你也必须在每个虚拟主机的头配置项目里指定归属的NameVirtualHost的IP地址。

否则Apache将无法对其辨认。

(2)当发生了以上这样的失误,那么Apache首先将会把一些不能区分的虚拟主机作为“通配虚拟主机”,因为在Apache看来,这些通配的虚拟主机是不能区分的,认为这已经造成了冲突。

接下去Apache会做的就是将“通配虚拟主机”当中第一出现的虚拟主机作为“缺省主机”(在配置文件中位置上最先出现的出现的),然后将所有接受到的发往这些通配虚拟主机的请求都递交给这个缺省主机造成其他缺省主机的无效。

因此Apache也就认为了在自己的几个监听网络接口上,用户并没有设定虚拟主机,因为Apache就只认可每个地址上配置文件中首先出现的虚拟主机,而强行使其他的通配主机无效。

(3)最后的Syntax OK,表示配置文件的语法没有错误。

的确没有语法错误,本例中的错误是“逻辑错误”而不是语法上错误,Apache会检测语法通过,因此在这样的状况下,Apache也仍然启动OK。

正确的修改应该如下:-------------------------------------------------------NameVirtualHost 192.168.1.111:80DocumentRoot /var/www/vhost1/ServerName DocumentRoot /var/www/vhost2/ServerName NameVirtualHost 192.168.1.222:80DocumentRoot /var/www/vhost3/ServerName DocumentRoot /var/www/vhost4/ServerName -------------------------------------------------------[root@kcentos5 ~]# service httpd restartStopping httpd: [ OK ] Starting httpd: [ OK ] 2.虚拟主机的设定可能会造成宿主机的丢失:当Apache启用虚拟主机的功能时候,另外一个可能发生的问题就是原本宿主机的站点丢失了。

这通常发生在虚拟主机和宿主机站点共享一个IP所造成的。

举一个例子,这里我使用3个域名对应同一个IP-------------------------------------------------------192.168.1.21 (Apache宿主机主站点用的域名)192.168.1.21 (Apache虚拟主机站点用的域名)192.168.1.21 (Apache虚拟主机站点用的域名)-------------------------------------------------------然后Apache的全局主配置文件相关设定如下(只取相关部分):[root@kcentos5 ~]# cat /etc/httpd/conf/httpd.conf |grep -v "#"-------------------------------------------------------ServerName :80宿主站点监听的域名和端口DocumentRoot "/var/www/html" (主页显示为"MainHost")宿主站点主路径Include conf.d/*.confInclude myconf/*.conf扩展配置文件路径-------------------------------------------------------接着察看虚拟主机配置文件设定:[root@kcentos5 ~]# cat /etc/httpd/myconf/virthosts.conf-------------------------------------------------------NameVirtualHost 192.168.1.21:80DocumentRoot /var/www/vhost5/ (主页显示为"Vhost5")ServerName DocumentRoot /var/www/vhost6/ (主页显示为"Vhost6")ServerName -------------------------------------------------------启动服务:[root@kcentos5 ~]# service httpd restartStopping httpd: [ OK ] Starting httpd: [ OK ] 测试:使用Windows的客户端分别去访问三个域名,反馈结果如下:-------------------------------------------------------&n ... nbsp;"Vhost5"&n ... sp;-> "Vhost5"... ;-> "Vhost6"-------------------------------------------------------测试结果下访问宿主站点而反馈的内容和访问虚拟主机站点相同。

相关主题