如何在 Tomcat 9 中的不同端口上部署多个 Web 应用程序?

How to deploy multiple web apps on different ports in Tomcat 9?

我正在尝试在 Tomcat 9 的不同端口上部署一个 spring 应用程序。我想要实现的是:
1. 保留其他应用程序的默认 Tomcat 配置,将它们部署在端口 8080
上的 webapps 文件夹中 2. 在根路径

的端口 8081 上仅部署一个 spring 应用程序

例如:
localhost:8080/app1
localhost:8080/app2
[...]
localhost:8081/

我为我的第二个服务创建了新文件夹:/var/lib/tomcat9/webapps_8081/
对于第一项服务,我将其保留在默认位置:/var/lib/tomcat9/webapps/

这是我的 server.xml 文件:

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <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>
    </Engine>
  </Service>

  <Service name="Catalina_8081">
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
    <Engine name="Catalina_8081" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps_8081" unpackWARs="true" autoDeploy="true">
        <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>
    </Engine>
  </Service>

到目前为止我尝试了什么,结果如何

方法一:将war文件放入部署文件夹

  1. 当我将 myapp.war 文件放入 webapps 文件夹时,它在 localhost:8080/myapp

  2. 上的部署没有任何问题
  3. 当我将 myapp.war 文件放入 webapps_8081 文件夹时,出现以下错误:

07-Sep-2019 15:20:29.370 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/var/lib/tomcat9/webapps_8081/myapp.war]
07-Sep-2019 15:20:29.384 SEVERE [main] org.apache.catalina.startup.ContextConfig.beforeStart Exception fixing docBase for context [/myapp]
 java.io.IOException: Unable to create the directory [/var/lib/tomcat9/webapps_8081/myapp]

当我手动创建此文件夹时,日志显示应用程序已部署,但文件夹为空,部署本身仅需 3 毫秒。

  1. 当我将文件重命名为 ROOT.war 并将其放入 webapps 文件夹时,它的部署没有任何问题:
07-Sep-2019 15:23:50.845 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/var/lib/tomcat9/webapps/ROOT.war]
07-Sep-2019 15:25:13.486 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TL$
07-Sep-2019 15:25:13.568 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/var/lib/tomcat9/webapps/ROOT.war] has finished in [82,722] ms

但是打开 localhost:8080/ 时出现 404 错误

  1. 当我将文件重命名为 ROOT.war 并将其放入 webapps_8081 文件夹时,出现与第 2 点相同的错误。

我手动创建的文件夹的权限似乎有些问题,但两者的权限是相同的:webappswebapps_8081(我已将组和所有者更改为 tomcat webapps_8081 的用户):

$ sudo ls -l
drwxrwxr-x 3 tomcat tomcat     4096 Sep  7 14:31 webapps
drwxrwxr-x 2 tomcat tomcat     4096 Sep  7 14:04 webapps_8081

方法二:使用外部内容文件

作为第二种部署方法,我尝试使用上下文文件。我正在关注 Christopher's answer in this topic

我将 war 文件放在了 webapps 文件夹之外:/var/lib/tomcat9/myapp.war

myapp.xml 文件:
<Context docBase="/var/lib/tomcat9/myapp.war"></Context>

  1. 我将 myapp.xml 放在 /var/lib/tomcat9/conf/Catalina/localhost/osp.xml - 应用程序在 localhost:8080/myapp

  2. 上成功部署
  3. 我将 myapp.xml 放在 /var/lib/tomcat9/conf/Catalina_8081/localhost/osp.xml 中 - 我收到以下错误:

07-Sep-2019 16:09:33.483 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor Deploying deployment descriptor [/etc/tomcat9/Catalina_8081/localhost/myapp.xml]
07-Sep-2019 16:09:33.501 SEVERE [main] org.apache.catalina.startup.ContextConfig.beforeStart Exception fixing docBase for context [/myapp]
 java.io.IOException: Unable to create the directory [/var/lib/tomcat9/webapps_8081/myapp]
  1. 我将 myapp.xml 重命名为 ROOT.xml 并将其放入 /var/lib/tomcat9/conf/Catalina/localhost/ROOT.xml - 根据日志,应用已成功部署
07-Sep-2019 16:16:36.411 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.16 (Debian)]
07-Sep-2019 16:16:36.438 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor Deploying deployment descriptor [/etc/tomcat9/Catalina/localhost/ROOT.xml]
07-Sep-2019 16:18:06.839 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TL$
07-Sep-2019 16:18:06.923 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of deployment descriptor [/etc/tomcat9/Catalina/localhost/ROOT.xml] has finished in [90,485] ms

但是打开 localhost:8080/ 时出现 404 错误

  1. 我将 myapp.xml 重命名为 ROOT.xml 并将其放入 /var/lib/tomcat9/conf/Catalina_8081/localhost/ROOT.xml - 我收到以下错误:
07-Sep-2019 16:14:08.417 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor Deploying deployment descriptor [/etc/tomcat9/Catalina_8081/localhost/ROOT.xml]
07-Sep-2019 16:14:08.434 SEVERE [main] org.apache.catalina.startup.ContextConfig.beforeStart Exception fixing docBase for context []
 java.io.IOException: Unable to create the directory [/var/lib/tomcat9/webapps_8081/ROOT]

如您所见,我这里有 2 个主要问题。

问题 1 为什么 Tomcat 不能在 webapps_8081 中创建新目录?
问题 2 当应用程序部署为 ROOT.war 而它在常规映射上运行良好时,为什么我会收到 404 错误?

我能够解决问题。
首先,我按照 Dung 在本主题中描述的步骤完全重新安装了 Tomcat 并删除了所有残留物:how to completely remove tomcat 7 from ubuntu 14.04。这解决了根映射的问题。所以结果我不知道是什么原因造成的。

权限问题已通过创建 override.conf

中描述的文件解决