![](/icons/6589yi.gif)
、WWW服务器虚拟主机原理
WWW服务器虚拟主机是指使用
![](/icons/6589yi.gif)
台物理机器
![](/icons/6589dou.gif)
充当多个主机名
![](/icons/6589de.gif)
WWW服务器
![](/icons/6589dou2.gif)
比如由
![](/icons/6589yi.gif)
台机器同时提供http://www.company1.com, http://www.company2.com 等
![](/icons/6589de.gif)
WWW服务
![](/icons/6589dou.gif)
而浏览这些WWW站点
![](/icons/6589de.gif)
用户感觉不到这种方式下跟由区别
![](/icons/6589de.gif)
机器提供区别
![](/icons/6589de.gif)
服务有什么差别
![](/icons/6589dou2.gif)
使用WWW虚拟主机
![](/icons/6589de.gif)
好处在于
![](/icons/6589dou.gif)
![](/icons/6589yi.gif)
些小规模
![](/icons/6589de.gif)
网站WebSite
![](/icons/6589dou.gif)
通过跟其他网站WebSite共享同
![](/icons/6589yi.gif)
台物理机器
![](/icons/6589dou.gif)
可以减少系统
![](/icons/6589de.gif)
运行成本
![](/icons/6589dou.gif)
并且可以减少管理
![](/icons/6589de.gif)
难度
![](/icons/6589dou2.gif)
另外
![](/icons/6589dou.gif)
对于个人用户
![](/icons/6589dou.gif)
也可以使用这种虚拟主机方式来建立有自己独立域名
![](/icons/6589de.gif)
WWW服务器
![](/icons/6589dou.gif)
目前国内有很多公司都提供这种免费
![](/icons/6589de.gif)
服务
![](/icons/6589dou2.gif)
WWW虚拟主机有两种工作方式:
1.1 基于IP地址
![](/icons/6589de.gif)
虚拟主机方式
这种方式下
![](/icons/6589dou.gif)
区别
![](/icons/6589de.gif)
主机名解析到区别
![](/icons/6589de.gif)
IP地址
![](/icons/6589dou.gif)
提供虚拟主机服务
![](/icons/6589de.gif)
机器上同时设置有这些IP地址
![](/icons/6589dou2.gif)
服务器根据用户请求
![](/icons/6589de.gif)
目
![](/icons/6589de.gif)
IP地址来判定用户请求
![](/icons/6589de.gif)
是哪个虚拟主机
![](/icons/6589de.gif)
服务
![](/icons/6589dou.gif)
从而进
![](/icons/6589yi.gif)
步
![](/icons/6589de.gif)
处理
![](/icons/6589dou2.gif)
缺点:基于IP地址
![](/icons/6589de.gif)
虚拟主机方式需要在提供虚拟主机服务
![](/icons/6589de.gif)
机器上设立多个IP地址
![](/icons/6589dou.gif)
既浪费了IP地址
![](/icons/6589dou.gif)
又限制了
![](/icons/6589yi.gif)
台机器所能容纳
![](/icons/6589de.gif)
虚拟主机数目
![](/icons/6589dou2.gif)
因此这种方式越来越少使用
![](/icons/6589dou2.gif)
但是
![](/icons/6589dou.gif)
这种方式是早期使用
![](/icons/6589de.gif)
HTTP 1.0协议唯
![](/icons/6589yi.gif)
支持
![](/icons/6589de.gif)
虚拟主机方式
![](/icons/6589dou2.gif)
1.2 基于主机名
![](/icons/6589de.gif)
虚拟主机方式
由于基于IP地址
![](/icons/6589de.gif)
虚拟主机方式有如上
![](/icons/6589de.gif)
缺点
![](/icons/6589dou.gif)
HTTP 1.1协议中增加了对基于主机名
![](/icons/6589de.gif)
虚拟主机
![](/icons/6589de.gif)
支持
![](/icons/6589dou2.gif)
具体说
![](/icons/6589dou.gif)
当客户
![](/icons/6589chengxu.gif)
向WWW服务器发出请求时
![](/icons/6589dou.gif)
客户想要访问
![](/icons/6589de.gif)
主机名也通过请求头中
![](/icons/6589de.gif)
“Host:”语句传递给WWW服务器
![](/icons/6589dou2.gif)
比如
![](/icons/6589dou.gif)
www.company1.com
![](/icons/6589dou.gif)
www.company2.com 都对应于同
![](/icons/6589yi.gif)
个IP地址(即由同
![](/icons/6589yi.gif)
台机器来给这两个虚拟域名提供服务)
![](/icons/6589dou.gif)
客户
![](/icons/6589chengxu.gif)
要存取http://www.company1.com/index.html时
![](/icons/6589dou.gif)
发出
![](/icons/6589de.gif)
请求头中包含有如下
![](/icons/6589de.gif)
内容:
GET /index.html HTTP/1.1
Host: www.company1.com
…..
WWW服务器
![](/icons/6589chengxu.gif)
接收到这个请求后
![](/icons/6589dou.gif)
可以通过检查“Host:”语句
![](/icons/6589dou.gif)
来判定客户
![](/icons/6589chengxu.gif)
请求是哪个虚拟主机
![](/icons/6589de.gif)
服务
![](/icons/6589dou.gif)
然后再进
![](/icons/6589yi.gif)
步
![](/icons/6589de.gif)
处理
![](/icons/6589dou2.gif)
优点:提供虚拟主机服务
![](/icons/6589de.gif)
机器上只要设置
![](/icons/6589yi.gif)
个IP地址
![](/icons/6589dou.gif)
理论上就可以给无数多个虚拟域名提供服务
![](/icons/6589dou.gif)
占用资源少
![](/icons/6589dou.gif)
管理方便
![](/icons/6589dou2.gif)
目前基本上都是使用这种方式来提供虚拟主机服务
![](/icons/6589dou2.gif)
缺点:在早期
![](/icons/6589de.gif)
HTTP 1.0版本下不能使用
![](/icons/6589dou2.gif)
实际上现在使用
![](/icons/6589de.gif)
浏览器基本上都支持基于主机名
![](/icons/6589de.gif)
虚拟主机方式
![](/icons/6589dou2.gif)
2、Apache服务器下
![](/icons/6589de.gif)
虚拟主机设置技术
2.1 Apache WWW服务器介绍
Apache WWW服务器是目前Internet上使用最广
![](/icons/6589de.gif)
WWW服务器软件Software
![](/icons/6589dou2.gif)
通过灵活
![](/icons/6589de.gif)
配置
![](/icons/6589dou.gif)
它可以完成几乎您想得到
![](/icons/6589de.gif)
功能
![](/icons/6589dou2.gif)
本文主要介绍在Apache 下设置各种虚拟主机
![](/icons/6589de.gif)
思路方法
![](/icons/6589dou2.gif)
2.2 Apache WWW服务器下基于IP地址
![](/icons/6589de.gif)
虚拟主机设置
使用这种虚拟主机方式
![](/icons/6589dou.gif)
首先要在服务器上为每个虚拟主机单独设置
![](/icons/6589yi.gif)
个IP地址
![](/icons/6589dou2.gif)
这些IP地址可以通过增加多个网卡或者在
![](/icons/6589yi.gif)
个网卡上设立多个IP地址来完成
![](/icons/6589dou2.gif)
有了多个IP地址后
![](/icons/6589dou.gif)
可以采用以下两种方式的
![](/icons/6589yi.gif)
来设置Apache:
2.2.1 为每个虚拟主机运行
![](/icons/6589yi.gif)
份Apache
采用这种方式
![](/icons/6589dou.gif)
每
![](/icons/6589yi.gif)
份Apache
![](/icons/6589chengxu.gif)
可以以单独
![](/icons/6589de.gif)
用户运行
![](/icons/6589dou.gif)
因此各个虚拟主机的间互不影响
![](/icons/6589dou2.gif)
设置这种虚拟主机时
![](/icons/6589dou.gif)
只要为每
![](/icons/6589yi.gif)
份Apache设置
![](/icons/6589yi.gif)
套配置文件就可以了
![](/icons/6589dou.gif)
唯
![](/icons/6589yi.gif)
需要注意
![](/icons/6589de.gif)
是:必须使用“Listen”语句
![](/icons/6589dou.gif)
强制每
![](/icons/6589yi.gif)
份Apache 仅仅在属于“自己”
![](/icons/6589de.gif)
IP地址上接收服务请求
![](/icons/6589dou2.gif)
优点:各个虚拟主机的间互不干扰
![](/icons/6589dou.gif)
安全性高
![](/icons/6589dou2.gif)
缺点:占用系统资源较多
![](/icons/6589dou2.gif)
2.2.2多个虚拟主机共享同
![](/icons/6589yi.gif)
份Apache
采用这种方式
![](/icons/6589dou.gif)
各个虚拟主机共享同
![](/icons/6589yi.gif)
份Apache
![](/icons/6589dou.gif)
因此各个虚拟主机的间有
![](/icons/6589yi.gif)
定
![](/icons/6589de.gif)
影响
![](/icons/6589dou.gif)
尤其是执行CGI
![](/icons/6589chengxu.gif)
时
![](/icons/6589dou.gif)
可能会带来
![](/icons/6589yi.gif)
些严重
![](/icons/6589de.gif)
安全问题
![](/icons/6589dou2.gif)
设置这种虚拟主机时
![](/icons/6589dou.gif)
只要为每
![](/icons/6589yi.gif)
个虚拟主机设置类似如下
![](/icons/6589de.gif)
信息即可:
<VirtualHost www.company1.com>;
DocumentRoot /home/company1
…
</VirrualHost>;
优点:占用系统资源比上
![](/icons/6589yi.gif)
种方式少
![](/icons/6589dou2.gif)
缺点:安全性低
![](/icons/6589dou.gif)
每个虚拟主机仍然需要占用
![](/icons/6589yi.gif)
个IP地址
![](/icons/6589dou2.gif)
2.3 Apache WWW服务器下简单
![](/icons/6589de.gif)
基于名字
![](/icons/6589de.gif)
虚拟主机设置
这种方式下
![](/icons/6589dou.gif)
各个虚拟主机共享同
![](/icons/6589yi.gif)
份Apache
![](/icons/6589dou.gif)
因此有CGI
![](/icons/6589chengxu.gif)
运行时
![](/icons/6589dou.gif)
安全性也不高
![](/icons/6589dou2.gif)
设置这种虚拟主机时
![](/icons/6589dou.gif)
只要为每
![](/icons/6589yi.gif)
个虚拟主机设置类似如下
![](/icons/6589de.gif)
信息即可
NameVirtualHost 111.222.33.44 ; 在这个IP地址接收虚拟主机
服务
<VirtualHost 111.222.33.44>;
ServerName www.company1.com
DocumentRoot /www/company1
</VirtualHost>;
<VirtualHost 111.222.33.44>;
ServerName www.company2.com
DocumentRoot /www/company2
</VirtualHost>;
优点:只要
![](/icons/6589yi.gif)
个IP地址就可以提供大量
![](/icons/6589de.gif)
虚拟主机服务
![](/icons/6589dou2.gif)
缺点:安全性差
![](/icons/6589dou2.gif)
维护这些虚拟主机时需要更改配置文件
![](/icons/6589dou.gif)
并且需要重新启动Apache进程才能起作用
![](/icons/6589dou2.gif)
因此不适合进行大规模
![](/icons/6589de.gif)
虚拟主机服务
![](/icons/6589dou2.gif)
2.4 Apache WWW服务器下基于名字
![](/icons/6589de.gif)
大规模虚拟主机设置
所谓大规模虚拟主机
![](/icons/6589dou.gif)
是指能够提供非常多
![](/icons/6589de.gif)
虚拟主机服务
![](/icons/6589dou.gif)
比如能提供超过数十万个域名
![](/icons/6589de.gif)
虚拟主机服务
![](/icons/6589dou2.gif)
如果使用以上讨论
![](/icons/6589de.gif)
思路方法
![](/icons/6589dou.gif)
是很难完成
![](/icons/6589de.gif)
![](/icons/6589dou2.gif)
实现这种服务
![](/icons/6589de.gif)
![](/icons/6589yi.gif)
种方式是利用Apache 功能强大
![](/icons/6589de.gif)
URL重写功能
![](/icons/6589dou2.gif)
下面以
![](/icons/6589yi.gif)
个例子来介绍说明这种方式
![](/icons/6589dou2.gif)
2.4.1 Apache中URL重写功能
Apache 1.2及以后版本都有URL重写(Rewrite)功能
![](/icons/6589dou2.gif)
简单
![](/icons/6589de.gif)
说
![](/icons/6589dou.gif)
URL重写功能就是在Apache接收到请求后
![](/icons/6589dou.gif)
在处理
![](/icons/6589de.gif)
过程中能根据预先设定
![](/icons/6589de.gif)
规则
![](/icons/6589dou.gif)
对请求中
![](/icons/6589de.gif)
URL进行修改
![](/icons/6589dou2.gif)
这些规则主要由正规表达式组成
![](/icons/6589dou2.gif)
重写依赖于输入
![](/icons/6589de.gif)
URL、各种服务器端环境变量、HTTP请求头中
![](/icons/6589de.gif)
内容、时间
![](/icons/6589dou.gif)
甚至可以通过外部
![](/icons/6589de.gif)
![](/icons/6589chengxu.gif)
来使用数据库中
![](/icons/6589de.gif)
信息来帮助重写
![](/icons/6589dou2.gif)
URL重写功能非常强大
![](/icons/6589dou.gif)
通过URL重写
![](/icons/6589dou.gif)
可以使Apache完成异常复杂
![](/icons/6589de.gif)
功能
![](/icons/6589dou2.gif)
当然
![](/icons/6589dou.gif)
URL重写功能本身也比较复杂
![](/icons/6589dou.gif)
有关URL重写功能
![](/icons/6589de.gif)
详细介绍说明可以参看Apache
![](/icons/6589de.gif)
随机文档
![](/icons/6589dou2.gif)
2.4.2 使用Apache中URL重写功能实现基于名字
![](/icons/6589de.gif)
大规模虚拟主机设置
假设机器www.home.com提供名字形如abcde.home.com、hijk.home.com等
![](/icons/6589de.gif)
大规模虚拟主机服务
![](/icons/6589dou2.gif)
其中虚拟主机名必须是字母或数字
![](/icons/6589dou.gif)
并且长度至少为3
![](/icons/6589dou2.gif)
为了防止
![](/icons/6589yi.gif)
个目录下文件或子目录太多而对性能产生很大
![](/icons/6589de.gif)
负面影响
![](/icons/6589dou.gif)
对用户
![](/icons/6589de.gif)
目录按照名字进行分级划分
![](/icons/6589dou.gif)
如虚拟主机abcde.home.com
![](/icons/6589de.gif)
相关文件存放在目录/member/ab/de/abcde下面
![](/icons/6589dou2.gif)
其中“ab”、“de”分别是“abcde”
![](/icons/6589de.gif)
前边两个
![](/icons/6589zifu.gif)
和最后两个
![](/icons/6589zifu.gif)
![](/icons/6589dou2.gif)
当用户请求http://abcde.home.com时
![](/icons/6589dou.gif)
系统应该返回/member/ab/de/abcde下面
![](/icons/6589de.gif)
文件
![](/icons/6589dou2.gif)
下面是为了完成这种功能需要进行
![](/icons/6589de.gif)
设置
1. 对域名服务器
![](/icons/6589de.gif)
设置
假设www.home.com
![](/icons/6589de.gif)
IP地址为202.103.190.57
![](/icons/6589dou.gif)
在域名服务器DNS
![](/icons/6589de.gif)
home.com数据文件中增加
![](/icons/6589yi.gif)
行:
--------------------------------------------------------------------
* IN A 202.103.190.57
--------------------------------------------------------------------
这样
![](/icons/6589dou.gif)
所有 *.home.com
![](/icons/6589de.gif)
IP地址都会被解析为202.103.190.57
![](/icons/6589dou.gif)
就没有必要为各个虚拟主机分别进行设置
![](/icons/6589dou2.gif)
2. 对Apache
![](/icons/6589de.gif)
设置
首先使用命令“httpd -l”检查mod_rewrite模块是否已经编译到Apache中
![](/icons/6589dou.gif)
如果没有
![](/icons/6589dou.gif)
重新编译Apache
![](/icons/6589dou2.gif)
然后在Apache
![](/icons/6589de.gif)
配置文件httpd.conf中增加如下语句(其中以“#”开头
![](/icons/6589de.gif)
为注释):
-----------------------------------------------------------------------
#禁止使用机器
![](/icons/6589de.gif)
正式名
UseCanonicalName off
#使能重写功能
RewriteEngine _disibledevent=application/x-httpd-cgi,L]
-------------------------------------------------------------------------
其中
![](/icons/6589dou.gif)
nph-redirect.cgi为
![](/icons/6589yi.gif)
个CGI
![](/icons/6589chengxu.gif)
![](/icons/6589dou.gif)
为了实现自动重定向
![](/icons/6589dou.gif)
它需要产生完整
![](/icons/6589de.gif)
HTTP 应答头信息
![](/icons/6589dou2.gif)
该
![](/icons/6589chengxu.gif)
通过环境变量PATH_INFO得到用户请求
![](/icons/6589de.gif)
URL
![](/icons/6589dou.gif)
通过环境变量REMOTE_ADDR得到用户
![](/icons/6589de.gif)
IP地址
![](/icons/6589dou.gif)
并根据网络拓扑情况生成重定向信息
![](/icons/6589dou.gif)
返回给客户
![](/icons/6589dou2.gif)
参考文献:
1.Apache 1.3 User's Guide http://www.apache.org
Virtual Hosting Setup Using Apache
Abstract:
There are two types of WWW Virtual Hosting, IP-based and Name-based. Those two types are
![](/icons/6589int.gif)
roduced in this thesis, followed by some methods about WWW Virtual Hosting configuration under Apache and the d
![](/icons/6589if.gif)
ference between them is analyzed.