zoukankan      html  css  js  c++  java
  • 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 zhuyuanxiang@apusic.com
     ServerName localhost
     ProxyPass / http://localhost:6888/
     ProxyPassreverse  / http://localhost:6888/
    </VirtualHost>

    <VirtualHost *:8080>
     ProxyPreserveHost On
     ServerAdmin zhuyuanxiang@apusic.com
     ServerName localhost1
     ProxyPass / http://localhost:6888/default1/
     ProxyPassreverse  / http://localhost:6888/default1/
    </VirtualHost>

    <VirtualHost *:8080>
     ProxyPreserveHost On
     ServerAdmin zhuyuanxiang@apusic.com
     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

  • 相关阅读:
    Linux:正则表达式2
    Linux:基础命令三
    Linux:正则表达式1
    虚拟机:主机能ping通虚拟机,虚拟机不可以ping通主机
    Linux:安装禅道
    ssh免密钥登录
    CKA-Harbor简单使用
    CKA-docker部署LNMP网站平台
    CKA-构建Nginx、PHP、Tomcat镜像
    CKA-docker卸载以及安装
  • 原文地址:https://www.cnblogs.com/zhuyx/p/10402000.html
Copyright © 2011-2022 走看看