java - 在 tomcat 的单个 webapp 文件夹上托管多个域
问题描述
可能与此重复,但不接受答案。
我有2个场景
- 我们正在构建一个 CRM,我们将有多个客户使用相同的产品。举个例子,
subdomain1.maindomain1.com
应该anysubmain.anothermaindomain.com
指向同一个 webapp 文件夹。并且根据域,我们将动态选择数据库,但代码库将保持不变。这里要注意:整个代码库保持不变。 - 我们正在为客户构建一系列网站,其中部分代码库将保持不变,但取决于子域,我们将加载默认的 servlet 文件。举个例子,
manage.domain.com
crm.domain.com
equote.domain.com
应该指向同一个 webapp 文件夹。根据域,我们将加载默认的 servlet 文件。此处需要注意:部分代码库对于所有域都将保持不变。前任。核心架构师文件。
其他人建议了什么解决方案
- 部署同一个war文件的副本2次,软链接,创建2个指向同一个文件的上下文,使用别名。最后一个可能是不错的选择,但不知道我们如何将它用于不同的子域/域。
- 这可能是解决方案之一,但不确定它是否适用于相同端口或不同端口
- 互联网上有很多文章展示了我们如何在单个 tomcat 服务器上的多个域上部署多个 webapp,但不是我需要的方式。
注意:我可以为以上 2 个场景创建 2 个 AWS EC2 实例。这意味着我不期待上述 2 个问题的解决方案。
解决方案
在 Apache Tomcat 中,您可以配置多个虚拟主机,每个虚拟主机部署相同的 .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
each 指向相同的代码库(例如 .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>
$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,您可以为每个域配置不同的外部资源文件夹。
EG for anysubmain_anothermaindomain_com_dbname
in$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 文件或其他资源依赖项。
推荐阅读
- react-native - ScrollView 后面的 Touchable Handler
- javascript - 如何使用 React Hooks 在提交到表格时添加表单值
- django - DJango:如何正确使用 Django 身份验证?
- python - 部署到 Heroku 时 Flask-Mail 不工作
- c# - 将时区信息添加到日期时间对象 C#
- visual-studio-code - 我的 Visual Studio 代码扩展未显示在侧边栏中
- android - 检测应用程序是否从最近的应用程序列表中关闭或被操作系统杀死
- jquery - 加载预选选项时隐藏和显示表单元素
- c# - 当父视图具有相同的模型时,如何在部分视图中获取 HTML 表单数据以进行序列化?
- python - 如何通过比较两个数据框来计算缺失值