如何在 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 "%r" %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 "%r" %s %b" />
</Host>
</Engine>
</Service>
到目前为止我尝试了什么,结果如何
方法一:将war文件放入部署文件夹
当我将 myapp.war
文件放入 webapps
文件夹时,它在 localhost:8080/myapp
上的部署没有任何问题
当我将 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 毫秒。
- 当我将文件重命名为
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 错误
- 当我将文件重命名为
ROOT.war
并将其放入 webapps_8081
文件夹时,出现与第 2 点相同的错误。
我手动创建的文件夹的权限似乎有些问题,但两者的权限是相同的:webapps
和 webapps_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>
我将 myapp.xml
放在 /var/lib/tomcat9/conf/Catalina/localhost/osp.xml
- 应用程序在 localhost:8080/myapp
上成功部署
我将 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]
- 我将
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 错误
- 我将
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
中描述的文件解决
我正在尝试在 Tomcat 9 的不同端口上部署一个 spring 应用程序。我想要实现的是:
1. 保留其他应用程序的默认 Tomcat 配置,将它们部署在端口 8080
上的 webapps
文件夹中
2. 在根路径
例如:
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 "%r" %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 "%r" %s %b" />
</Host>
</Engine>
</Service>
到目前为止我尝试了什么,结果如何
方法一:将war文件放入部署文件夹
当我将
myapp.war
文件放入webapps
文件夹时,它在localhost:8080/myapp
上的部署没有任何问题
当我将 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 毫秒。
- 当我将文件重命名为
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 错误
- 当我将文件重命名为
ROOT.war
并将其放入webapps_8081
文件夹时,出现与第 2 点相同的错误。
我手动创建的文件夹的权限似乎有些问题,但两者的权限是相同的:webapps
和 webapps_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>
我将
myapp.xml
放在/var/lib/tomcat9/conf/Catalina/localhost/osp.xml
- 应用程序在localhost:8080/myapp
上成功部署
我将
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]
- 我将
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 错误
- 我将
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