同一Tomcat之中实现绑定多个域名,并实现直接通过域名访问其应用(不加引用上下文[项目名称]、加上有可以访问)

1、同一tomcat之中如何配置不同域名(多个域名指向一台物理机器及绑定一个ip),并且实现直接输入域名就可以访问对应的项目。

   由于公司为了节省服务器(本来可以用vm vsphere 虚拟出多台虚拟机),需要在一台计算机上部署以下内容:1、web应用(2个);2、数据库服务器 3、资源文件服务器 于是就会绑定三个域名到一台服务器上

   资源服务绑定域名,两个web应用对应不同的域名。

  要在一台计算机上实现 不同域名访问不同应用有有两种方式:1、使用tomcat的server.xml配置其 host 通过制定不同的访问路径进行区分 2、使用Nginx代理分别部署不同的tomcat方式

  本文主要讲述在tomcat之中实现不同域名访问不同的项目,并且实现直接输入域名即可访问Web应用。

    首先需要创建两个host配置片段如下所示:

<Host name="jiaofu.study.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>jiaofu.study.com</Alias> 
     <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/feot-web"  reloadable="true" caseSensitive="false" debug="0"/>
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

<Host name="product.study.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Alias>product.study.com</Alias> 
    <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/hongplus-web"  reloadable="true" caseSensitive="false" debug="0"/>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log." suffix=".txt"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

  但是这个配置之后虽然可以实现 其目标,但是发现一个问题,启动tomcat之时,居然耗时长达414秒,进7分钟。那这是怎么回事情呢?

   经过分析发现,以上配置,会重复加载tomcat的webapps下的应用。于是有了以下解释:

这里appBase与docBase区别 

   appBase是指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于的相对目录.如果没有此项,默认为/webapps。 
   docBase是指定Web应用的文件路径.可以给定绝对路径,也可以给定相对于Host的appBase属性的相对路径. 如果Web应用采用开放目录结构,那就指定Web应用的根目录;如果Web应用  是个WAR文件,那就指定WAR文件的路径。

   出现上述问题的原因是tomcat加载玩appBase=”webapps”之后又去加载docBase,因此造成加载两次项目的问题,修改path参数path="\feot-web"(项目名称),配置文件内容是。

<Host name="jiaofu.study.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>jiaofu.study.com</Alias> 
     <Context path="/feot-web" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/feot-web"  reloadable="true" caseSensitive="false" debug="0"/>
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

  虽然这样配置可以防止项目重复启动,但是并不能达到可以通过域名直接访问项目,如果不想修改path="/feot-web的参数,那么可以修改appBase="webapps"的参数。这样的方式也可以解决当前多次加载问题;appBase的参数指到其他文件目录不能出现在tomcat的webapps目录下,这样就可以访问根目录不用敲项目名称。配置文件内容是 

 

<Host name="jiaofu.study.com"  appBase="/data0/javanew"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>jiaofu.study.com</Alias> 
     <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/feot-web"  reloadable="true" caseSensitive="false" debug="0"/>
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

 

如果项要把项目搬到其他目录中部署,前提是不能在webapps目录下,appBase="webapps"参数可有可无,配置文件内容是

<Host name="jiaofu.study.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>jiaofu.study.com</Alias> 
     <Context path="" docBase="/data0/javanew/www-apps-release/feot-web"  reloadable="true" caseSensitive="false" debug="0"/>
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

于是整体解决方案有以下两种方式:

方案1:修改appBase为其他任意路径非webapps:

<
Host name="jiaofu.study.com" appBase="/data0/javanew" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>jiaofu.study.com</Alias> <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/feot-web" reloadable="true" caseSensitive="false" debug="0"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> <Host name="product.study.com" appBase="/data0/javanew" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Alias>product.study.com</Alias> <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-online/webapps/hongplus-web" reloadable="true" caseSensitive="false" debug="0"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host>
方案2:修改docBase为非webapps其他路径:

<Host name="jiaofu.study.com"  appBase="/data0/javanew"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>jiaofu.study.com</Alias> 
     <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-apps-release/feot-web"  reloadable="true" caseSensitive="false" debug="0"/>
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

<Host name="product.study.com"  appBase="/data0/javanew"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Alias>product.study.com</Alias> 
    <Context path="" docBase="/data0/javanew/tomcat-feot-wdedu-apps-release/hongplus-web"  reloadable="true" caseSensitive="false" debug="0"/>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="localhost_access_log." suffix=".txt"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>

以上两种方法均可解决重复加载多次应用的问题。

本人使用第2种方案,效果很明显减少时间一半:

 

Sep 21, 2017 11:13:14 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 237396 ms

参考文章:解决Tomcat启动时项目重复加载问题

posted @ 2017-09-21 22:52  蜀山剑侠  阅读(476)  评论(0)    收藏  举报