标签:apache apache虚拟机 apache虚拟机设置 apache虚拟机配置
其实现在网络上关于虚拟机的配置,用百度一搜会有一大把。那么为啥我还要写Apache虚拟机的配置方法呢?原因一是因为我实在看不惯那些雷同的配置方法,你抄我的,我抄你的,而且把一些跟虚拟机配置没有什么相关性的其它指令也写上去了,对读者产生了误导。原因二是因为没有几篇文章能说清楚从配置域名解析到配置虚拟机的一个完整过程的。针对这两个原因,此篇文章我会试图通过测试组合的方法将虚拟机的配置方法尽量说清楚点,而不是仅仅将一堆配置放在上面,希望您能通过我的文章,对Apache的虚拟机配置有一个更清晰的思路。
下面我举个栗子来说明下在备案好域名,买好服务器,装好Apache服务器后,如何让用户通过在浏览器上输入域名,访问到您的服务器。比如我申请了一个域名为ezmonitor.cn,然后在阿里云买了一个服务器,服务器的ip地址为115.29.44.171,那么实现目标的第一步就是将域名注册到DNS服务器中去,那么如何注册呢,那就需要到你所在的域名商那去注册。比如我这个ezmonitor.cn的域名是在万网那买的,那么我就需要进入到万网的后台,找到设置域名解析的地方。万网域名解析的界面如下图所示,我相信其它域名商的后台也是大同小异的,现在仅以万网后台当栗子。
这里有两个“记录类型”,一个是A记录类型,一个CNAME记录类型。
A记录的作用是域名到IP的映射,如果用户要通过ezmonitor.cn这个域名访问到您的服务器,那么就需要通过A记录让域名和你服务器的IP产生关联。记录值这里填写你服务器的IP,主机记录这里填写@符号即可。到这里其实就完成了域名解析的操作了。当用户输入http://ezmonitor.cn时,就会访问到您的服务器。但是如果只设置A记录,用户也仅仅只能通过http://ezmonitor.cn来访问您的服务器了,如果用户想通过输入http://www.ezmonitor.cn访问您的服务器时,那么我们还需要设置CNAME记录。
CNAME的作用是域名到域名的映射,打个比方,如果你想让用户通过www.ezmonitor.cn来访问您的服务器时,这时就需要设置CNAME了,这时应该将CNAME的主机记录设置为www,记录值设置为ezmonitor.cn,当用户访问www.ezmonitor.cn时,其实是通过CNAME记录将www.ezmonitor.cn解析到ezmonitor.cn上,然后再通过A记录将ezmonitor.cn解析到服务器的IP上来达到让服务器响应的目的。在上图中,我的主机记录为*号,这说明任意的xxx.ezmonitor.cn都会被解析到我的服务器IP上来。
说到这里,第一步,域名解析就完成了。那么现在我又有另外一个需求了,我想通过v1.com来访问服务器内的v1目录内的页面,通过v2.com来访问服务器内的v2目录内的页面该如何实现呢?这就是设置虚拟机的目的,我们需要通过基于名字的虚拟机来实现。
其实虚拟机的配置是非常简单的,只需要 <VirtualHost>这个容器。但是在设置过程中,我们会出现各种各样的情况。
首先来说说一个最基本的场景,就是上文中提到的通过v1.com来访问v1目录,通过v2.com来访问v2目录。假设服务器的IP地址为192.168.1.254,服务器的根目录为/easydeploy/httpd/htdocs,v1目录为/easydeploy/httpd/htdocs/v1,v2目录为/easydeploy/httpd/htdocs/v2。 v1目录内有一个index.html页面,页面内容为I‘m v1。v2目录内也有一个index.html页面,页面内容为I‘m v2。服务器根目录/easydeploy/httpd/htdocs下也有一个index.html页面,页面内容为I‘m default。那么配置如下:
<VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v1" ServerName v1.com </VirtualHost> <VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v2" ServerName v2.com </VirtualHost>
把上面的配置加在httpd.conf文件内的末尾即可。 <VirtualHost></VirtualHost>表示新建一台虚拟机。 <VirtualHost 192.168.1.254:80>内的IP和端口是通过v1.com或v2.com域名解析到的IP和端口,80是http协议所使用的默认端口,所以在访问v1.com或v2.com时无需像http://v1.com:80这样输入,而只需输入http://v1.com即可。但必须要确保v1.com要解析到192.168.1.254这个ip上。如果我们是在局域网内访问,可以通过设置host文件来解析域名。host文件的设置方法为,在新的一行输入192.168.1.254 v1.com,每一个IP-域名对为一行。 DocumentRoot "/easydeploy/httpd/htdocs/v1”这条指令跟Apache的全局指令一样,是指定根目录的。这里表明这台虚拟机的根目录为/easydeploy/httpd/htdocs/v1,当访问http://v1.com/index.html时,服务器会将/easydeploy/httpd/htdocs/v1/index.html的文件内容返回给浏览器(显示内容为I‘m v1)。ServerName v1.com这条指令是指定这台虚拟机对应的域名,如果这里设置为x1.com,那么得在浏览器上输入x1.com/index.html并且要确保x1.com解析到192.168.1.254这个ip上才能获取服务器中/easydeploy/httpd/htdocs/v1/index.html的内容了。v2.com的虚拟机配置与v1.com的配置完全相同。当访问http://v2.com/index.html时,服务器会将/easydeploy/httpd/htdocs/v2/index.html的文件内容返回给浏览器(显示内容为I‘m v2)。
在虚拟机设置时,我们往往会遇到各种奇怪的问题,下面我们就模拟几种奇怪的场景来看看,再进行了不当的设置后,会出现哪些情况。
第一种,IP不正确。以下是配置
<VirtualHost 127.0.0.1:80> DocumentRoot"/easydeploy/httpd/htdocs/v1" ServerName v1.com </VirtualHost> <VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v2" ServerName v2.com </VirtualHost>
由于v1虚拟机对应的ip为127.0.0.1,而v1.com解析的ip为192.168.1.254,所以这时v1虚拟机的配置是不正确的,只有v2虚拟机的配置是正确的。当在浏览器输入http://v1.com/index.html时,返回给浏览器的内容为"I‘m v2"。当在浏览器输入http://v2.com/index.html时,返回给浏览器的内容也为"I’m v2"。问题来了,明明v1.com对应的根目录为/easydeploy/httpd/htdocs/v1,那么按道理应该返回/easydeploy/httpd/htdocs/v1/index.html里面的内容(应为I‘m v1),那么为什么会返回/easydeploy/httpd/htdocs/v2/index.html的内容呢?原来,当请求的域名(v1.com)解析到的ip与虚拟机内设置的ip不一致时,apache会首先寻找配置正确的虚拟机,并按正确的虚拟机设置的根目录返回内容。那么。。当所有的虚拟机设置都不正确时,我们访问http://v1.com/index.html和http://v2.com/index.html时会发生什么呢?
第二种,两台虚拟机IP均不正确,以下是配置
<VirtualHost 127.0.0.1:80> DocumentRoot"/easydeploy/httpd/htdocs/v1" ServerName v1.com </VirtualHost> <VirtualHost 127.0.0.1:80> DocumentRoot"/easydeploy/httpd/htdocs/v2" ServerName v2.com </VirtualHost>
这时,当我们访问http://v1.com/index.html时,返回的结果是I‘m default。当我们访问http://v2.com/index.html时,返回的结果也是I‘m default。这不都是取的/easydeploy/httpd/htdocs/index.html里的内容么?发生了什么?原来,在我们<VirtualHost></VirtualHost>容器外的全局指令中,也配置了DocumentRoot指令,而全局的DocumentRoot指令中的值为/easydeploy/httpd/htdocs目录。也就是服务器的全局根目录为/easydeploy/httpd/htdocs。当用户访问的域名解析的IP地址与任何一台虚拟机都不对应时,Apache默认根据全局根目录内的内容来返回。
在虚拟机的设置中,还有一个重要的指令ServerAlias,这个指令可以帮助我们使用不同的域名访问到一台虚拟机上去。比如,我们想通过vx1.com访问/easydeploy/httpd/htdocs/v1目录内的内容,再确保vx1.com域名也解析到192.168.1.254后,我们只需这么配置就行
<VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v1" ServerName v1.com ServerAlias vx1.com </VirtualHost> <VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v2" ServerName v2.com </VirtualHost>
这里又有一个问题了。。。如果在v1虚拟机内的ServerAlias中加上v2.com会咋样呢?我们来试试,配置如下:
<VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v1" ServerName v1.com ServerAlias vx1.com v2.com </VirtualHost> <VirtualHost 192.168.1.254:80> DocumentRoot"/easydeploy/httpd/htdocs/v2" ServerName v2.com </VirtualHost>
当我们输入http://v2.com/index.html时,发现返回的内容竟然是I‘m v1。这。。。明明v2虚拟机配置的是正确的,为啥会读取easydeploy/httpd/htdocs/v1目录内的内容呢?原来,当所有虚拟机配置都正确时,Apache会按顺序优先匹配第一个符合条件的配置。v1虚拟机内设置了ServerAlias并没有错,所以当访问http://v2.com/index.html时,就返回了v1目录内的内容。
好了,关于虚拟机的配置就介绍到这,其实是很简单的内容拉,但是又是我们经常会用到的东西。所以希望对大家有所帮助,有什么问题的话也可以相互沟通下。对LAMP有兴趣的朋友,欢迎大家+群322715918来共同探讨,交个朋友o(∩_∩)o
本文出自 “架构师之路” 博客,请务必保留此出处http://wangweiak47.blog.51cto.com/2337362/1651923
标签:apache apache虚拟机 apache虚拟机设置 apache虚拟机配置
原文地址:http://wangweiak47.blog.51cto.com/2337362/1651923