我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文探讨tomcat如何部署多站点的事情,如何配置server.xml文件?server.xml里面被特殊定义的webapps目录究竟有什么特殊的地方存在?这也是本文要探讨的支线话题。

苏南大叔:tomcat如何部署vhost多站点?webapps目录有何特殊之处? - tomcat-webapps
tomcat如何部署vhost多站点?webapps目录有何特殊之处?(图5-1)

苏南大叔的程序如此灵动博客,记录苏南大叔的代码所看所想。测试环境:tomcat@10.0.27maven@3.8.6

准备测试代码

这里就是准备一个测试的例子,并不是非maven不可。

这里假设代码都是基于maven的。如果您还没有安装好maven。可以参考:

测试项目来说,就使用最简单的maven-archetype-webapp模版即可,推荐生成项目的命令,如下所示:

mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=RELEASE -DgroupId=com.sunan.test -DartifactId=test -Dversion=1.0-SNAPSHOT -DinteractiveMode=false

打包项目:

mvn package

就可以在项目的target目录下面获得test.war包了。当然,值得说明的是同级还会有test文件夹存在,里面放置的是相关的.jsp文件,内容和test.war压缩包里面数据一致。

苏南大叔:tomcat如何部署vhost多站点?webapps目录有何特殊之处? - war-test
tomcat如何部署vhost多站点?webapps目录有何特殊之处?(图5-2)

.war包就是zip格式的,换个后缀就能直接解压,里面就是相关源码,和同级同名文件夹是一致的。

特殊的webapps目录

配置文件是存放在<tomcat>/conf/server.xml文件里面,默认的配置信息如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
</Host>

appBase就指的是webapps这个文件夹。基于上述xml配置前提,得出下面的结论:

【结论一】代码都是放在webapps/下的子文件夹下的。可以放.war文件,也可以直接放源码目录。

对于代码部署来说,tomcat默认是要安装.war包到webapps目录下面的。该webapps目录下面有个更加特殊的目录叫做ROOT,它存放的是<domain>/的代码。而其它的<folder>/目录,则对应着<domain>/<folder>/

【结论二】<name>.war会自动解压成<name>文件夹
.war包会自动解压成对应文件夹,对应文件夹就会成为tomcat的一个应用,生效规则同上一条。

苏南大叔:tomcat如何部署vhost多站点?webapps目录有何特殊之处? - xml-server配置
tomcat如何部署vhost多站点?webapps目录有何特殊之处?(图5-3)

【结论三】.war包不能随便删除
<tomcat>/webapps/<war>/目录和<tomcat>/webapps/<name>.war同时存在的时候,

  • 删除<tomcat>/webapps/<name>.war文件,就会导致<tomcat>/webapps/<name>/文件夹也被删除。
  • 直接修改<tomcat>/webapps/<name>/文件夹下面的代码,直接生效。但是并不会逆向反馈到<tomcat>/webapps/<name>.war文件中去。
  • 删除<tomcat>/webapps/<name>/文件夹的话,只要<tomcat>/webapps/<name>.war存在,就会再次生成<tomcat>/webapps/<name>/同名目录。

【结论四】.war包具有特权
如果没有对应.war包,本来就是文件夹部署的。那么,可以随便修改<tomcat>/webapps/<name>/文件夹下面的代码。但是,一旦<name>.war出现,那么,<name>/文件夹下面的代码,就要被<name>.war控制。删除<name>/目录,<name>.war就会自动解压一个目录出来。所以如果主动修改了<name>/文件夹下面的代码,请注意及时异地保存修改的代码。

appBase模式下的unpackWARsautoDeploy参数

配置文件是存放在<tomcat>/conf/server.xml文件里面,默认的配置信息如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
</Host>

unpackWARs指的是不自动解压.war文件到当前文件夹,但是并不是说站点不生效。如果unpackWARsfalse的话,而autoDeploytrue的话,一样也是可以做到放入.war文件,应用就生效的。

关于这个过程,苏南大叔是这么理解的。【仅仅是个人理解,不一定和现实一致】:

苏南大叔:tomcat如何部署vhost多站点?webapps目录有何特殊之处? - 流程逻辑一
tomcat如何部署vhost多站点?webapps目录有何特殊之处?(图5-4)

.war文件放到webapps/目录下之后,如果unpackWARsfalse,那么不解压到当前目录,但是解压到内存中。然后检测autoDeploy参数,如果为false,那么就等着下次重启服务器后,这个应用才能生效。

个人理解,总的原则就是:运行的源码以文件夹为准,但是这个文件夹你可能看不到,存在于内存中。

docBase模式

在配置里面还可以配置docBase,这种设置其实还是配置可访问的地址和真正的源码直接的关系。但是,docBase的优先级大于webapps。对应关系冲突的时候,以docBase为准。

<Host name="localhost" appBase="E:\test\appBase\" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">  
     <Context path="" debug="0" docBase="E:\test\docBase\Root\" reloadable="true" />
     <Context path="/a" debug="0" docBase="E:\test\docBase\a\" reloadable="true" />
</Host>

苏南大叔:tomcat如何部署vhost多站点?webapps目录有何特殊之处? - 生效顺序
tomcat如何部署vhost多站点?webapps目录有何特殊之处?(图5-5)

同时存在着appBasedocBase两个概念,两者其实是并列的。docbase的配置优先级较高。

所以,代码可以部署在自定义的webapps目录下面,那么,它就会满足上述一切特殊的webapps的规则设定。如果不想要这么智能的webapps的规则设定,就还是可以部署一条甚至多条docbase规则的。它所定义的目录和传统意义上的目录效果一致,是属于摆脱.war文件控制的目录。

配置vhost

依然是修改<tomcat>/conf/server.xml文件,范例配置为:

<Host name="newsn.net" appBase="E:\test\appBase\" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
     <Alias>newsn.com.cn</Alias>
     <Context path="/" debug="0" docBase="E:\test\docBase\Root\" reloadable="true" />
     <Context path="/a" debug="0" docBase="E:\test\docBase\a\" reloadable="true" />
</Host>

对于新增加的vhost来说,(这个是nginx的叫法,tomcat里面没有这个概念)。实际上就是修改Host标签的name属性,同时可以定义alias

相关链接

结束语

更多tomcat经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   tomcat