Apusic如何配置虚拟主机

其实配置虚拟主机的文章很多,Apusic应用服务器管理文档中已有专门的描述,我这里写的最重要是虚拟主机有啥用,是否还有其他解决方案。
这篇文章是从最近的工作中得来的,最初需求是要配置虚拟主机,结果采用的是写了一段代码进行代替。两种方法不分高低,可能对于喜欢规范的朋友会鄙视我的变通方式,觉得俺的东西不遵守规范,给未来又留下多少隐患之类,但是我认为写代码对国内项目来说,由于都是程序员现场实施,因此未来的变化更加好控制。最后,我还会提供一种更为复杂,但是更为先进的虚拟机方式就是Apache+Apusic整合的方式,这样结果会更灵活,当然维护成本也就更高。
先介绍为什么要配虚拟主机,给客户到底带来什么价值呢?
一般是主机提供商喜欢用虚拟主机,他们将一个服务器资源分配给许多客户使用,每个客户有自己的域名,有权访问自己虚拟主机部署的应用。而现在政府客户为了突出部门的独立性也喜欢申请单独的域名,通过不同的域名访问部门自己的门户系统,但是这些应用部署在统一对外的服务器上,甚至由一个J2EE应用提供不同的门户。
那么虚拟主机又是如何运作的呢?
虚拟主机首先是域名的不同,域名由DNS服务器解析成IP地址。如果那些应用都部署在统一对外的服务器上,那么不同的域名将会解析成相同的IP地址返回给浏览器。浏览器依据这个IP地址访问应用服务器,并且会把访问用的URL带在HTTP头中。如果访问的应用都使用相同的路径(<context-root>/</context-root>),这些应用就会在部署时发生冲突。为了解决这样的冲突,应用服务器中间件就提供了虚拟主机的方式,等于在一个应用服务器中间件上可以虚拟出好几个计算机,当然部署相同上下文名称的应用也就不会再有问题。应用服务器通过判断HTTP头中的URL来决定采用哪个虚拟主机中的应用提供服务。
Apusic如何配置虚拟主要呢?
修改config/server.xml文件增加virtual-host参数就可以实现。这个实验在本机也可以测试,测试过程如下:
1. 修改Windows/system32/drivers/etc/hosts. 文件,模仿localhost增加
 127.0.0.1 localhost1
 127.0.0.1 localhost2
2. 与applications目录平级建立一个webapp目录(名称随意,主要是避免放在applications目录下,应用被自动发布),复制applications目录下的default目录到webapp目录中,并将目录改成default1和default2
3. 修改server.xml文件,模仿default增加
  <application name="default1" base="webapp/default1" virtual-host="localhost1" start="auto"/>
  <application name="default2" base="webapp/default2" virtual-host="localhost2" start="auto"/>
4. 启动apusic应用服务器,你会发现有相同上下文Context Root的应用被启动。
5. 修改每个应用的index.jsp文件,增加区分标识,然后通过不同的URL(http://localhost:6888http://localhost1:6888)访问,会得到不同应用的显示页面。
现在大家已经成功完成虚拟主机的配置,但是使用虚拟主机存在什么问题呢?
1. 如果这些应用是相互独立的,那么他们之间的会话(Session)数据是无法共享的,应用相关的页面和风格无法共享,用户需要维护多个应用增加了维护成本;
2. 如果这些页面统一跳转到一个应用的不同目录下,那么浏览器的URL就会变成部署应用的虚拟主机域名,但是这个可能不是用户所希望的。
新的用户需求,因为用户其实只采购了一个应用,但是希望不同的域名有不同的门户主页,于是我的解决方案是应用只有一个,在应用里面建立default1和default2目录,那么用户访问服务器时,系统会根据URL的不同进行跳转,判断URL的代码如下:
<html>
<head>
</head>
<body>
<script type="text/javascript">
var aHost=window.location.hostname; //取得访问应用服务器使用的域名
if (aHost=="localhost1")
 window.location.href="http://localhost:6888/default1";
else if (aHost=="localhost2")
 window.location.href="http://localhost:6888/default2";
else alert("nothing happen!");
</script>
</body>
</html>
这种访问,无论如何跳转域名都不会发生改变,而且跳转到其他门户时会话数据可以共享,简化了SSO(单点登录)的开发难度。但是,这种方式也有缺陷就是访问时上下文必须不同,而且无法让所有的域名使用相同的上下文,特别是都使用根目录。因此,采用哪种方式看用户的需要。
但是,维护者可能还是觉得复杂,因为要动底层代码,是否还有完全配置的解决方案吗?
有!那就是用Apache+Apusic配置虚拟主机,整个操作过程如下:
1. 先在Apusic的默认default应用中增加两个目录default1和default2,修改index.jsp文件方便显示后区分;
2. 修改Apache的配置文件httpd.conf,增加虚拟主机的配置,通过Apache的虚拟主机+代理跳转的方式,提供对虚拟主机的支持,增加部分如下:
#以下增加的模块部分无用,只是我没时间查证,所以都打开了。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

NameVirtualHost *:8080

<VirtualHost *:8080>
 ProxyPreserveHost On
 ServerAdmin [email protected]
 ServerName localhost
 ProxyPass / http://localhost:6888/
 ProxyPassreverse  / http://localhost:6888/
</VirtualHost>

<VirtualHost *:8080>
 ProxyPreserveHost On
 ServerAdmin [email protected]
 ServerName localhost1
 ProxyPass / http://localhost:6888/default1/
 ProxyPassreverse  / http://localhost:6888/default1/
</VirtualHost>

<VirtualHost *:8080>
 ProxyPreserveHost On
 ServerAdmin [email protected]
 ServerName localhost2
 ProxyPass / http://localhost:6888/default2/
 ProxyPassreverse  / http://localhost:6888/default2/
</VirtualHost>
3. 启动apusic应用服务器,通过http://localhost:8080http://localhost1:8080http://localhost2:8080就可以得到不同的展示页面。
(后两个页面显示不正确,因为它们的图片路径不正确,在后台他们其实使用的不是前台显示的路径,因此服务器无法找到图片)
这个就使不同虚拟主机都以根路径的方式显示不同的门户,同时在后台应用服务器上可以共享应用,但是同时也带来了潜在的维护成本和系统风险。
那么到底采用什么样的方式配置虚拟主机呢?
其实这个需要实际场景来决定,以下几个条件可以参考:
1. 是否需要共享应用?
2. 是否需要都使用根路径?
3. 是否需要通过Apache来提供负载均衡?
根本目标是开发和维护简单化,够用就是最好的,做技术的朋友最怕追求技术先进性。
参考文献:
1. mod_proxy - Apache 2.2 中文版参考手册,
http://doc.chinahtml.com/Manual/ApacheManual/mod/mod_proxy.html
2. 基于反相代理的Web缓存加速
http://www.chedong.com/tech/cache.html

你可能感兴趣的:(apache,应用服务器,虚拟机,浏览器,配置管理)