在tomcat中的单个webapp文件夹上托管多个域

时间:2019-01-23 06:57:37

标签: java tomcat

可能的this重复项,但答案不被接受。

我有2种情况

  1. 我们正在建立CRM,我们将有多个使用同一产品的客户。让我们举个例子,subdomain1.maindomain1.comanysubmain.anothermaindomain.com应该指向同一webapp文件夹。根据域,我们将动态选择数据库,但代码库将保持不变。 此处要注意的地方:整个代码库保持不变
  2. 我们正在为客户构建一系列网站,其中所有代码库的一部分都将保持不变,但根据子域,我们将加载默认的servlet文件。让我们举个例子,manage.domain.com crm.domain.com equote.domain.com应该指向同一个webapp文件夹。并且根据域,我们将加载默认的servlet文件。 此处要注意的地方:对于所有域,部分代码库将保持不变。例如核心架构师文件

其他人提出了什么解决方案

  1. Deploy copy of same war file 2 time, Softlink, Create 2 contexts that point to the same file, Use alias。最后一个可能是个不错的选择,但不知道我们如何将其用于不同的子域/域。
  2. This can be one of the solution but not sure whether it will work on same port or different port
  3. Internet上有很多文章,展示了我们如何在单个tomcat服务器上的多个域上部署多个Web应用程序,而不是我需要的方式。

注意:我可以为上述2个场景创建2个AWS EC2实例。这意味着我不希望对上述两个问题有一个解决方案。

1 个答案:

答案 0 :(得分:9)

在Apache Tomcat中,您可以configure multiple virtual hosts部署具有相同上下文配置参数(例如JDBC连接,资源,外部JAR文件等)的每个.war文件(或文档库)。

要坚持您的方案(1),请在server.xml中配置两个域的主机元素:

<Engine name="Catalina" defaultHost="subdomain1.maindomain1.com">
    <Host name="subdomain1.maindomain1.com"    appBase="subdomain1.maindomain1.com"/>
    <Host name="anysubmain.anothermaindomain.com" appBase="anysubmain.anothermaindomain.com"/>
</Engine>

并为两者创建资源和配置文件夹:

mkdir $CATALINA_HOME/subdomain1.maindomain1.com
mkdir $CATALINA_HOME/anysubmain.anothermaindomain.com
mkdir $CATALINA_HOME/conf/Catalina/subdomain1.maindomain1.com
mkdir $CATALINA_HOME/conf/Catalina/anysubmain.anothermaindomain.com

然后为每个主机创建一个ROOT.xml,每个指向相同的代码库(例如.war文件),但指向不同的data bases configuration。通常,这为每个域提供了不同的context configuration

$CATALINA_HOME/conf/Catalina/subdomain1.maindomain1.com/ROOT.xml

<Context docBase="/path/to/your/webapp.war" path="">
     <Resource name="jdbc/Database" auth="Container" type="javax.sql.DataSource"
               username="subdomain1_maindomain1_com" password="anysecurepassword" driverClassName="com.your.jdbc.Driver"
               url="jdbc:xyz://localhost:321/subdomain1_maindomain1_com_dbname"/>
   ...
</Context>

$CATALINA_HOME/conf/Catalina/anysubmain.anothermaindomain.com/ROOT.xml

<Context docBase="/path/to/your/webapp.war" path="">
     <Resource name="jdbc/Database" auth="Container" type="javax.sql.DataSource"
               username="anysubmain_anothermaindomain_com" password="anysecurepassword" driverClassName="com.your.jdbc.Driver"
               url="jdbc:xyz://localhost:321/anysubmain_anothermaindomain_com_dbname"/>
   ...
</Context>

另外,为了实现方案2,您可以为每个域configure different external resource folders

E.G。 anysubmain_anothermaindomain_com_dbname中的$CATALINA_HOME/conf/Catalina/anysubmain.anothermaindomain.com/ROOT.xml

<Context>
...
  <Resources>
    <PreResources base="/path/to/anysubmain_anothermaindomain_com_dbname/jarfiles/"
      className="org.apache.catalina.webresources.DirResourceSet" readOnly="true"
      internalPath="/" webAppMount="/WEB-INF/lib" />
  </Resources>
...
</Context>

通过这种方式,所有域的Web应用程序都基于相同的docBase,但是可以添加不同的(各种)jar文件或添加其他资源依赖项。