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

KuK*_*uKu 11 java tomcat

可能重复但不接受答案.

我有2个场景

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

其他人建议的解决方案

  1. 部署相同war文件的副本2次,Softlink,创建指向同一文件的2个上下文,使用别名.最后一个可能是不错的选择,但不知道我们如何将它用于不同的子域/域.
  2. 这可能是解决方案之一,但不确定它是否可以在相同的端口或不同的端口上工作
  3. 互联网上有很多文章展示了我们如何在单个tomcat服务器上的多个域上部署多个webapp,但不是我需要的方式.

注意:我可以为2个以上的方案创建2个AWS EC2实例.这意味着我不期望解决2个以上的问题.

Sel*_*ron 9

在Apache Tomcat中,您可以配置多个虚拟主机,每个虚拟主机部署相同的.war文件(或文档库),具有不同的上下文配置参数,如JDBC连接,资源,esternal JAR文件等.

要坚持您的方案(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>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

然后为每个主机创建一个ROOT.xml指向相同代码库(例如.war文件)但不同的数据库配置.通常,这为每个域提供不同的上下文配置.

$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>
Run Code Online (Sandbox Code Playgroud)

$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>
Run Code Online (Sandbox Code Playgroud)

此外,为了实现方案2,您可以为每个域配置不同的外部资源文件夹.

EG for anysubmain_anothermaindomain_com_dbnamein$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>
Run Code Online (Sandbox Code Playgroud)

这样,所有域的Web应用程序都基于相同的docBase,但可以添加不同(变体)的jar文件或其他资源依赖项.