上一节中说到,在 /usr/local/apache2.4/htdocs/ 下面可以访问到 1.php 和 index.html 这两个文件,这是为什么呢?
输入命令 vim /usr/local/apache2.4/conf/httpd.conf,搜索 /htdocs,回车,见下图,
上图红色框框的内容显示,就是因为参数 DocumentRoot 定义了网站的目录在哪里。接着搜索 /ServerName,回车,见下图,
上图红色框框的内容显示,因为参数 ServerName 定义了网站的域名,只不过这个 ServerName 可以用任何域名去访问。
Windows 和 Linux 的 htdocs 基本上是相似的,所以这边先演示一下,怎么在Windows上写htdocs,hosts 的文件路径见下图,
右击 hosts 文件,选择打开方式,再选中记事本,点击确定,进入见下图,
增加一行 IP 地址和域名,见下图红色框框,
然后保存。保存这边会有一些问题 ,需要管理员权限才可以保存,这边可以尝试,复制一个文件到桌面上,然后进行上面的更改,再把原文件删除掉,把桌面上的更改好的文件放进去。
完成之后,打开Windows的cmd,尝试ping一下这两个域名,见下图,
可以看到,IP 是192.168.218.128,没错了。正常情况下,不更改hosts文件的话,看到的就是下图这种情况了,
可以看到,IP 地址明显就变成官网的 IP 了。
以上就是hosts这个文件的作用,可以访问到指向的IP。这个情况在DNS还没有生效的时候可以使用。
在 www.abc.com 域名指向 192.168.218.128 这个 IP 的时候,来访问一下这个网站,见下图,
出现的也是“It works!”,接着访问一下,www.abc.com/1.php ,回车,见下图,
包括 www.123.com/1.php ,也是一样的,见下图,
上面操作的这两个域名和IP地址,我们都没有到配置文件里去定义,仅仅只是定义了 ServerName www.example.com:80 这个域名,为什么都可以访问?
这个就叫做 apache 的默认主机,也就是说任何一个域名,只要指向了这个 IP,都会访问到这个站点,这个站点就叫做默认虚拟主机。如果没有做任何操作,仅仅使用的是 httpd.conf 配置文件里面定义的这个 ServerName www.example.com:80 以及 DocumentRoot,
这样就会不太好管理,毕竟一台服务器可以跑多个域名,不一定要指向到这边。所以,我们需要打开一个虚拟主机的配置文件,输入命令 vim /usr/local/apache2.4/conf/httpd.conf,搜索 /extra,回车,找到下图,
红色框框里面就是虚拟主机,把下面那行的#号去掉,保存并退出。也就是说,前面的 htdocs、DocumentRoot 和 ServerName 等全部不用了,因为这一个配置文件里面只能定义一个 ServerName,肯定是不合适的。
现在打开一个二级配置文件,就是虚拟主机的配置文件,在这个配置文件里是可以定义多个 ServerName,输入命令 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf,回车,往下翻,见下图,
两个框框的内容都是以 <VirtualHost :80> 开头,以 <VirtualHost :80> 结尾,表示一个主机,也就是一个网站。这边需要做一些更改,ServerAdmin 用来定义管理员的邮箱,要不要都无所谓,可以删掉。DocumentRoot 定义网站和目录在哪里,可以重新定义。ServerName 定义网站的域名,只能写一个域名。ServerAlias 定义网站的别名,可以写多个域名。ErrorLog 指定错误日志,CustomLog 指定访问日志。这样子就定义了一个网站,具体见下图,
保存并退出,这边定义的虚拟主机,一旦生效,之前在 httpd.conf 里定义的 www.example.com 就失效了。
接着完善一下刚才的设置,见下图,
现在需要在对应的站点根目录下创建一个文件,输入命令 vim /data/wwwroot/abc.com/index.php ,回车,见下图,
输入上图的内容,保存并退出。输入命令 vim /data/wwwroot/111.com/index.php ,回车,见下图,
保存并退出。然后检查一下配置文件的语法,再加载配置文件。
以上准备工作就完成了,接下来测试一下虚拟主机。
首先,如果域名没有绑定到 htdocs 上,ping 的时候就会连接到外网去,并没有在本机内网上,见下图,
所以,要想访问 www.abc.com 这个网站在本机上,可以编辑 vi /etc/hosts,指定一下。还有另一种办法,这边介绍一个新命令 curl,-x 选项,输入命令 curl -x192.168.218.128:80 abc.com ,回车,见下图,
效果非常明显,无论什么域名指向过来,访问的都是 abc.com,是虚拟主机配置里面的第一个虚拟主机,就是默认的虚拟主机。所谓默认虚拟主机,就是访问什么域名,只要解析到这个 IP 上,都会访问这个网站,访问这个网站对应的虚拟主机配置,也就是 abc.com。接着访问一下 example.com,见下图,
这边111.com 是第二个虚拟主机的域名,访问的 www.111.com ,并不是 111.com 的域名,所以访问到了第一个虚拟主机上去。只要搜索的域名不在我们设置的配置上,就会匹配到第一个虚拟主机上。第一个就叫做默认的虚拟主机配置文件。
这边我们也可以发现,只要开启了这边 VirtualHost 配置文件的虚拟主机,之前 httpd.conf 配置文件上的ServerName 和 DocmentRoot都会失效。
以上这么多内容就两个结论:
(1)、在主配置文件 httpd.conf 中,打开了 VirtualHost 虚拟主机的配置文件,这时候虚拟主机配置文件就生效了,而主配置文件里所定义的ServerName 和 DocmentRoot就会失效。
(2)、虚拟主机配置文件,一旦打开,里面可以定义很多个 VirtualHost 虚拟主机的配置文件,每个 VirtualHost 里面都有对应的 ServerName 和 DocmentRoot,每个 VirtualHost 都代表一个站点,都是一个虚拟主机。在虚拟主机里边有个比较特殊的情况,存在一个默认的虚拟主机,就是无论任何域名,只要不在其他虚拟主机上,就会解析到这个 IP上,都会访问到这个默认虚拟主机。
原文地址:http://blog.51cto.com/13503302/2115584