MyException - 我的异常网
当前位置:我的异常网» Linux/Unix » 【I am a coder】Linux虚拟主机配置最终篇

【I am a coder】Linux虚拟主机配置最终篇

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
【I am a coder】Linux虚拟主机配置终极篇

Linux虚拟主机配置

一、概述

虚拟主机(Virtual Host),又称虚拟服务器、主机空间或是网页空间,是一种网络技术,可以让多个主机名称,在一个单一的服务器上运作,而且可以分开支持每个单一的主机名称。虚拟主机可以运行多个网站或服务。虚拟并非指不存在,而是指空间是由实体的服务器延伸而来,其硬件系统可以是基于服务器群,或者单个服务器。其技术是互联网服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于HTTPFTPEMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务段位,对外表现为多个服务器,从而充分利用服务器硬件资源。——Wiki中对虚拟主机的解释。

虚拟主机的实现方式主要有三种:基于域名的方法(Name-based)、基于IP的方法(IP-based)以及基于端口的方法(Port-based)。下面将结合apache的配置来讲解虚拟主机的各种配置及应用场景。

注:实验环境为CentOS release 6.3Final

二、实战演练

1. http配置文件讲解

httpd的默认配置文件为:/etc/httpd/conf/httpd.conf,它主要包含三大部分,如下:

[root@Slaver conf]# grep '\<Section\>' /etc/httpd/conf/httpd.conf -n
33:### Section 1: Global Environment
245:### Section 2: 'Main' server configuration
977:### Section 3: Virtual Hosts
[root@Slaver conf]# 

其中:1Global Environment——全局配置,决定Apache服务器的全局参数。

      2Main server configuration——主服务配置,相当于是Apache的默认web站点,如果我们的服务器中只有一个站点,那么就只需要在这里配置就可以了。

  3Virtual Hosts——虚拟主机,虚拟主机不能与Main Server主服务器共存,当启用了虚拟主机之后,Main Server就不能使用了。

与虚拟主机相关的配置项有:aListen:80指定apache的监听端口,在全局配置区中设置;bNameVirtualHost:*:80在虚拟主机区域中设置。

2. 基于域名的多站点配置

适用场景:在一台主机上配置两个站点,其域名分别为:www.test01.comwww.test02.com,对应的站点文件存放位置为:/var/www/html/test01/var/www/html/test02

满足此应用的相关配置:

a. 修改/etc/httpd/conf/httpd.conf中的配置

i.端口监听开启:Listen 80

ii.虚拟主机配置开启:NameVirtualHost *:80(将前面的注释#去掉)

b. 在/etc/httpd/conf.d/中添加站点的配置文件

注意:在/etc/httpd/conf.d目录下新建站点配置文件,必须确保Include conf.d/*.conf开启。新建配置文件内容如下:

www.test01.conf

[root@Slaver conf.d]# cat www.test01.conf 
<VirtualHost *:80>
   DocumentRoot /var/www/html/test01
   ServerName www.test01.com
   <Directory /var/www/html/test01>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from all 
   </Directory>
</VirtualHost>
[root@Slaver conf.d]#

www.test02.conf

[root@Slaver conf.d]# cat www.test02.conf 
<VirtualHost *:80>
   DocumentRoot /var/www/html/test02
   ServerName www.test02.com
   <Directory /var/www/html/test02>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from all 
   </Directory>
</VirtualHost>
[root@Slaver conf.d]# 

重启httpdservice httpd restart,然后再浏览器中分别访问域名即可。注意:该域名访问的机器必须能够解析到,如果不是公网的域名的话可以通过配置本机的hosts来解析。

c. 上述配置项分析

i.VirtualHost *:80

指定虚拟主机的IP以及端口,其中*:80表示响应来自本机所有网卡的80端口的请求。当然,这里也可以指定特定的IP,例如:VirtualHost 192.168.17.131:80,则它会响应来自192.168.17.131IP的访问请求,与此同时在/etc/httpd/conf/httpd.conf中的NameVirtualHost也必须指定为192.168.17.131*,不然的话在启动httpd的时候会报出如下的错误:Starting httpd: [Wed Feb 04 22:30:23 2015] [warn] NameVirtualHost 192.168.17.131:80 has no VirtualHosts

用简单的话来说,NameVirtualHost设定的与具体配置文件中VirtualHost设定的必须为一一对应,或者为*对一(NameVirtualHost*,其他VirtualHost为具体的IP

ii.Options Indexes FollowSymLinks

OptionsIndexes表示当网页不存在的时候允许索引显示目录中的文件;FollowSymLinks表示是否允许访问符号链接文件。

iii.AllowOverride All

AllowOverride表示是否允许该配置被覆盖。例如:AllowOverride None表示不允许该Directory目录下的访问控制文件(.htaccess)来改变这里的配置;AllowOverride All表示允许访问控制文件.htaccess来改变这里的配置。

iv.Order Allow,Deny

Order用来表示对页面的访问控制顺序,后面的一项是默认选项,如:Order Allow,Deny则默认是DenyAllow from all表示允许所有用户。

3. 基于IP的多站点配置

适用场景:web服务器存在多块网卡,有多个IP地址,这里假设有两个IP地址,一个为:192.168.17.128,它对应域名www.test01.com;一个为:192.168.17.131,它对应域名www.test02.com

a. 存在主服务器

1) 基本配置

还记得在/etc/httpd/conf/httpd.conf中提到的三大块配置,其中就有主服务配置,假设192.168.17.128对应主服务器,而另外一个IP192.168.17.131用于构建两个或多个虚拟主机。配置如下:

192.168.17.128上主服务器配置:

i.监听80端口:Listen 80

ii.主服务器配置区:ServerName www.test01.com

iii.主服务器配置区:DocumentRoot /var/www/html/test01

192.168.17.131上多虚拟主机配置:

虚拟主机配置:VirtualHost 192.168.17.131:80

/etc/httpd/conf.d/中添加www.test02.confwww.test03.conf的配置,配置内容与“基于域名的多站点配置”等同。

web浏览器中分别访问:www.test01.comwww.test02.comwww.test03.com会显示各自的输出。

注意:设置主服务器后,所有不是针对192.168.17.131的请求都将由主服务器来伺服;而提交给192.168.17.131却没有主机名或没有Host:头的请求,都将为www.test02.com伺服(因为配置文件中,它最靠前)。

2) 测试场景

需要测试两种情况:

一、不是针对192.168.17.131的请求都将由主服务器来伺服

二、提交给192.168.17.131却没有主机名或没有Host:头的请求,都将为www.test02.com伺服

现在为web服务器配置三个网络,如下图所示:

 

并在本机的hosts文件中,添加如下IP与域名的对应关系:

 

访问www.test04.com,页面输出“Welcome to access web site test01 ... ”,验证了不是针对192.168.17.131的请求都将由主服务器来伺服。

访问http://192.168.17.131,页面输出“Welcome to access web site test02 ... ”,验证了提交给192.168.17.131却没有主机名或没有Host:头的请求,都将为www.test02.com伺服。

b. 不存在主服务器

适用场景:假设web服务器有两个IP地址(192.168.17.128172.20.30.40),该机器内网和外网均可以访问,在外部,域名:www.test01.com指向外部地址172.20.30.40,而在内部同样的域名指向内部地址192.168.17.128

服务器可以配置为向来自内部和外部的请求提供同样的内容,只需要一个VirtualHost配置段就可以达到这个目的,服务器配置如下:

监听80端口:Listen 80

配置虚拟主机:NameVirtualHost 192.168.17.128:80

                  NameVirtualHost 172.20.30.40:80

/etc/httpd/conf.d/www.test01.conf配置内容:

[root@Slaver conf.d]# cat www.test01.conf 
<VirtualHost 192.168.17.128:80 172.20.30.40:80>
   DocumentRoot /var/www/html/test01
   ServerName www.test01.com
   <Directory /var/www/html/test01>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from all 
   </Directory>
</VirtualHost>
[root@Slaver conf.d]#

现在从不同网络提交的请求都会由同一个VirtualHost来伺服。

4. 基于端口的多站点配置

适用场景:让同一个IP的不同端口伺服多个域名。例如:通过http://www.test01.com:80访问站点test01,通过http://www.test01.com:8080访问站点test02。配置要点:同一个IP端口不同;域名相同根目录不同

具体配置如下:

i.配置http监听808080端口:Listen:80

                            Listen:8080

ii.配置NameVirtualHostNameVirtualHost 192.168.17.128:80

                     NameVirtualHost 192.168.17.128:8080

iii.配置/etc/httpd/conf.d/www.test01.conf,配置如下:

[root@Slaver conf.d]# cat www.test01.conf 
<VirtualHost 192.168.17.128:80>
   DocumentRoot /var/www/html/test01
   ServerName www.test01.com
   <Directory /var/www/html/test01>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from all 
   </Directory>
</VirtualHost>

<VirtualHost 192.168.17.128:8080>
   DocumentRoot /var/www/html/test02
   ServerName www.test01.com
   <Directory /var/www/html/test02>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from all 
   </Directory>
</VirtualHost>
[root@Slaver conf.d]#  

5. 只允许某个网段访问站点

适用场景:发布到外网的web站点,后台管理文件夹administrator不想让外网的用户可以访问,只允许内网192.168.17.0/24网段的客户机访问。

配置如下:

[root@Slaver conf.d]# cat www.test01.conf 
<VirtualHost 192.168.17.128:80>
   DocumentRoot /var/www/html/test01
   ServerName www.test01.com
   ErrorLog /var/log/httpd/www.test01.err
   CustomLog /var/log/httpd/www.test01.access common
   <Directory /var/www/html/test01/administrator>
      Options Indexes FollowSymLinks
      AllowOverride All
      Order Allow,Deny
      Allow from 192.168.17.0/24
   </Directory>
</VirtualHost>
[root@Slaver conf.d]# 

当不是通过这个网段进来的访问请求,会出现如下的提示错误:

 

6. 只允许通过认证的用户访问站点

适用场景:当访问后台时,通过提供用户名和密码进行认证,只有通过认证的用户才能访问后台。

配置文件如下:

[root@Slaver conf.d]# cat www.test01.conf 
<VirtualHost 192.168.17.128:80>
   DocumentRoot /var/www/html/test01
   ServerName www.test01.com
   ErrorLog /var/log/httpd/www.test01.err
   CustomLog /var/log/httpd/www.test01.access common
   <Directory /var/www/html/test01/administrator>
      Options Indexes FollowSymLinks
      AllowOverride AuthConfig
      AuthName "Please input username and password!"
      AuthType Basic
      AuthUserFile /etc/httpd/.htpasswd
      Require user houqd2012 houqd2015
      Order Allow,Deny
      Allow from all
   </Directory>
</VirtualHost>

[root@Slaver conf.d]#

配置项代表的含义如下:

AllowOverride AuthConfig         #采用认证机制

AuthName “Please input username and password!”   #认证时显示的提示语

AuthType Basic                  #用户认证类型

AuthUserFile                    #认证时用户的账号密码文件

Require user houqd2012 houqd2015  #只有houqd2012houqd2015用户才能登陆

创建用户名和密码的命令如下:

htpasswd -cm /etc/httpd/.htpasswd houqd2012

htpasswd -c /etc/httpd/.htpasswd houqd2015

-c代表创建一个新文件,-m代表密码使用MD5加密,执行完后会生成/etc/httpd/.htpasswd文件。

效果图如下:

 

三、总结

在开发中好几次遇到虚拟主机的配置问题,每次都是临时查一查解决没有系统的了解,等下次碰到问题时还是解决不了,浪费了很多时间,这次索性集中整理一次,望更多的朋友也了解如何利用虚拟主机更好的我们的生产环境服务。

四、参考链接

a. VirtualHost Exampleshttp://httpd.apache.org/docs/2.4/vhosts/examples.html 

b. Web服务器基础之二Apache主配置文件httpd.confhttp://pvbutler.blog.51cto.com/7662323/1352360 

c. 维基百科虚拟主机的解释:http://zh.wikipedia.org/zh-cn/%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA

d. Web服务器(Apache)虚拟主机的配置:http://chenxizhuimeng.blog.51cto.com/2516314/504823

e. 教你如何实现Apahce的用户认证:http://www.linuxidc.com/Linux/2013-04/82422.htm 

f. Linuxapache虚拟主机(vhost)多种配置形式:http://www.111cn.net/sys/linux/42471.htm

文章评论

2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
如何成为一名黑客
如何成为一名黑客
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员和编码员之间的区别
程序员和编码员之间的区别
鲜为人知的编程真相
鲜为人知的编程真相
中美印日四国程序员比较
中美印日四国程序员比较
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老程序员的下场
老程序员的下场
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员应该关注的一些事儿
程序员应该关注的一些事儿
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
代码女神横空出世
代码女神横空出世
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员都该阅读的书
程序员都该阅读的书
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
每天工作4小时的程序员
每天工作4小时的程序员
程序员必看的十大电影
程序员必看的十大电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
那些争议最大的编程观点
那些争议最大的编程观点
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Java程序员必看电影
Java程序员必看电影
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
10个调试和排错的小建议
10个调试和排错的小建议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
编程语言是女人
编程语言是女人
漫画:程序员的工作
漫画:程序员的工作
一个程序员的时间管理
一个程序员的时间管理
程序员的鄙视链
程序员的鄙视链
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有