多实例Tomcat中应用文件夹名与上下文名不同时,如何正确配置<Context>的docBase参数
让我来帮你搞定这个Context路径的问题!你的核心需求是把应用映射到/handbook,但目前只能通过/handbook-server访问,问题出在Context配置文件的位置和Tomcat自动部署的冲突上,下面是一步步的解决方案:
1. 纠正Context XML文件的存放位置
Tomcat对单独的Context配置文件有严格的路径要求:
- 你需要把
handbook.xml从$CATALINA_BASE/conf/移动到$CATALINA_BASE/conf/Catalina/localhost/目录下 - 如果
Catalina/localhost目录不存在,手动创建它(对应路径是/usr/local/tomcat_instance/idev/conf/Catalina/localhost/)
这个位置是Tomcat默认加载自定义Context配置的地方,并且文件名会直接作为上下文路径——比如你命名为handbook.xml,Tomcat就会自动把应用映射到/handbook,此时path属性可以省略(写了也会被Tomcat忽略)。
2. 正确设置docBase参数
根据你的应用部署位置,有两种安全的设置方式:
方式一:应用保留在webapps目录下
因为你的应用在$CATALINA_BASE/webapps/handbook-server,而Host的appBase就是webapps,所以直接用相对路径即可:
<Context docBase="handbook-server" reloadable="true" />
但这里要注意:Tomcat默认会自动部署webapps目录下的所有应用,这会导致你的自定义Context配置和自动部署的应用冲突。所以需要在server.xml的Host标签里关闭自动部署:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false"> </Host>
方式二:把应用移出webapps目录(更推荐,避免冲突)
把你的应用文件夹handbook-server从webapps移到其他目录,比如/usr/local/tomcat_instance/idev/apps/,然后用绝对路径设置docBase:
<Context docBase="/usr/local/tomcat_instance/idev/apps/handbook-server" reloadable="true" />
这种方式不需要修改Host的自动部署配置,因为应用不在appBase目录下,Tomcat不会自动部署它,只会加载你自定义的Context配置。
3. 验证配置
完成以上步骤后,重启Tomcat实例,然后访问http://localhost:8280/handbook,就可以正常访问你的应用了。
为什么之前的设置不生效?
- 你把
handbook.xml放在了conf根目录,Tomcat不会自动加载这个位置的Context配置 webapps目录下的handbook-server被Tomcat自动部署,生成了默认的/handbook-server上下文路径,覆盖了你的自定义配置
内容的提问来源于stack exchange,提问作者Mario Garrido

