【问题标题】:Hosting multiple domains on single webapp folder in tomcat在 tomcat 的单个 webapp 文件夹上托管多个域
【发布时间】:2019-06-16 17:00:25
【问题描述】:

this 可能重复,但不接受回答。

我有两个场景

  1. 我们正在构建一个 CRM,我们将有多个客户使用相同的产品。举个例子,subdomain1.maindomain1.comanysubmain.anothermaindomain.com 应该指向同一个 webapp 文件夹。并且根据域,我们将动态选择数据库,但代码库将保持不变。 请注意:整个代码库保持不变
  2. 我们正在为客户构建一系列网站,其中部分代码库将保持不变,但取决于子域,我们将加载默认的 servlet 文件。举个例子,manage.domain.comcrm.domain.comequote.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. 互联网上有很多文章展示了我们如何在单个 tomcat 服务器上的多个域上部署多个 web 应用程序,但不是我需要的方式。

注意:我可以为上述 2 个场景创建 2 个 AWS EC2 实例。这意味着我不期待上述 2 个问题的一种解决方案。

【问题讨论】:

  • 如果我是你,我会使用反向代理,并运行 2 个 Tomcat 实例(或至少 2 个基于同一 Tomcat 中的同一应用程序的 servlet 上下文)。它更安全,更不容易出错。
  • 在多个目录中保留一段代码是没有意义的。背后的原因是,如果我们更新代码,我将不得不在部署时在多个地方更新。
  • 我想知道为什么这是个问题。这不是重复的代码。它是工件/二进制文件的副本。出于包括故障转移在内的多种原因,运行应用程序的多个实例(完整堆栈)是一种常见的做法。这就是部署任务自动化的原因。当这是一个我强烈怀疑的问题时,我认为可以启动多个 tomcat 实例并指向同一个文档根目录(尽管我不记得如何设置它)。
  • @ernest_k,我来接你了。我想我需要用不同的方式来表达。虽然你的观点是绝对正确的。我这样做是为了减少开发方面和部署方面的工作量。想象一下,我从核心架构文件中对数据库类进行了微小的更改,我必须将该更改复制到所有站点。这可以手动完成,也可以使用 git 或其他我现在想不到的东西来完成。然而,我的计划是,一次提交,一次推送,一次部署。所以这就是我走这条路的原因。
  • 您是否在 Tomcat 前运行 Apache Web 服务器?

标签: java tomcat


【解决方案1】:

在 Apache Tomcat 中,您可以configure multiple virtual hosts 部署相同的 .war 文件(或文档库),但具有不同的上下文配置参数,如 JDBC 连接、资源、外部 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>

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

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

例如对于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 文件或其他资源依赖项。

【讨论】:

  • 哇!很棒。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多