内容:
这里讲述一些Apache虚拟主机中比较容易发生的问题和解决的一些基本思路,给出一些比较典型的错误的示例理解。
一.设置虚拟主机会发生些什么问题?
基本上会最容易遇到两个问题:1.虚拟主机发生冲突。2.宿主机的丢失。(当然还会遇到其他很多的问题,但是这里我们先讨论这2个问题)
1.虚拟主机发生冲突:
无论是采用哪种形式的虚拟主机,都会发生虚拟主机冲突的问题,尤其是在Apache的虚拟主机系统变得庞大而复杂的时候尤其容易发生。但是请记住,无论什么采用什么形式的虚拟主机,甚至多种混用,如果造成虚拟主机冲突的话,根本原因就只有一个:“至少有一个原因,使得Apache不能区别一些虚拟主机”。
之前一个一直强调的一个部分就是“Apache需要能够做到区分每个虚拟主机”。如果能够通过I
P区分的话,那就通过IP区分;如果需要多个主机共享一个IP的话,那么可以设定不同的端口让Apache去区分;如果需要多个虚拟主机使用一个IP并且端口也用同一个的话,那么也要通过不同的域名来让 Apache做到对不同虚拟主机的区分。
一个最经常发生的错误,就是在多个IP地址上进行基于域名方式虚拟主机的配置当中,没有指定和规划好哪几个虚拟主机是归属于哪个IP地址下,造成 Apache对一些虚拟主机不能区别。沿用第二章中的示例,以下给出一个典型错例。
[root@kcentos5 ~]# vi /etc/httpd/f
------------(注意:此为典型错误配置的示例)----------
NameVirtualHost 192.168.1.111:80
(VirtualHost后面没有指定自己归属的IP地址)
DocumentRoot /var/www/vhost1/bj是什么
ServerName
大年三十作文
(VirtualHost后面没有指定自己归属的IP地址)
龙眼功效
DocumentRoot /var/www/vhost2/
ServerName
NameVirtualHost 192.168.1.222:80
(VirtualHost后面没有指定自己归属的IP地址)
DocumentRoot /var/www/vhost3/
(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 ~]# rvice 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 no VirtualHosts
告警:网络接口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_ rvers:
*:80 (/etc/httpd/f:16)
*:80 (/etc/httpd/f:21)
*:80 (/etc/httpd/f:28)
*:80 (/etc/httpd/f: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:80
DocumentRoot /var/www/vhost1/
ServerName
DocumentRoot /var/www/vhost2/
ServerName