tomcat如何部署vhost多站点?webapps目录有何特殊之处?
发布于 作者:苏南大叔 来源:程序如此灵动~本文探讨tomcat
如何部署多站点的事情,如何配置server.xml
文件?server.xml
里面被特殊定义的webapps
目录究竟有什么特殊的地方存在?这也是本文要探讨的支线话题。
苏南大叔的程序如此灵动博客,记录苏南大叔的代码所看所想。测试环境:tomcat@10.0.27
,maven@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
压缩包里面数据一致。
.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
的一个应用,生效规则同上一条。
【结论三】.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
模式下的unpackWARs
和autoDeploy
参数
配置文件是存放在<tomcat>/conf/server.xml
文件里面,默认的配置信息如下:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
</Host>
unpackWARs
指的是不自动解压.war
文件到当前文件夹,但是并不是说站点不生效。如果unpackWARs
为false
的话,而autoDeploy
为true
的话,一样也是可以做到放入.war
文件,应用就生效的。
关于这个过程,苏南大叔是这么理解的。【仅仅是个人理解,不一定和现实一致】:
.war
文件放到webapps/
目录下之后,如果unpackWARs
为false
,那么不解压到当前目录,但是解压到内存中。然后检测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>
同时存在着appBase
和docBase
两个概念,两者其实是并列的。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
经验文字,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。