前言:记录一下在部署JavaWeb项目时详细了解了Tomcat的几大部署方式,根据配置方式分析一下配置参数,加深对这些参数意义的理解。
目录
一、webapps目录部署
操作过程:
把项目复制到Tomcat安装目录下的webapps目录,启动Tomcat,访问【http://localhost:8080/1/】即可。
示例:
复制项目名为1的项目到webapps目录下
项目名为1文件夹下的文件
访问该URL结果:
分析:
可以这样部署的原因是什么呢?分析一下默认的配置文件,打开Tomcat安装目录下的conf/server.xml,看到Host标签部分如下:
<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>
appBase:指定了webapps目录下的项目将被部署为应用;
unpackWars:为true时表示该目录下放入的war包会自动解压为项目文件;
autoDeploy:为true时表示自动部署,Tomcat在运行时定期检查新的Web应用或Web应用的更新;
完整描述一下过程:Tomcat启动后,当我们把项目复制到webapps中如果复制的是war包,那么Tomcat会把它解压成项目文件(直接复制项目文件Tomcat还省一步解压过程,但一般部署到Linux服务器上需要打成war包上传的),然后自动部署。。。当地址栏输入【http://localhost:8080/1/】时,先由这个域名(本机域名映射到127.0.0.1)找到本机处理,再由8080端口找到Tomcat处理,Tomcat中再找到默认的webapps目录下项目名为1的项目,最后就将index.jsp显示出来啦。当然地址栏输入【http://localhost:8080/1/index.jsp】也是一样可以访问到里面的index.jsp的噢。
注意:在webapps下存在的都是文件夹(项目)形式,若以文件存在,那么通过Tomcat是访问不到的。
二、通过Context配置文件部署
操作过程:
在tomcat安装目录中打开conf/server.xml配置文件,并在<host>和</host>之间插入如下语句。
<Context path="/XXX" docBase="/usr/local/tomcat/webapps/XXX" debug="0" privileged="true"> </Context>
之后通过【IP地址:8080/XXX】就可以访问项目啦。
示例:
docBase处有两种方式,一个相对路径,一个绝对路径。
2.1相对路径:
我把项目就不放在webapps中了,放在webapps同级的data目录下(其实任何地方都可以)
在Host标签中间插入下面这个代码
<!-- 配置相对路径,若项目名为2.1relative的项目位于tomcat安装目录下的data中,即webapps同级目录下的data文件夹下 -->
<Context path="relative" docBase="../data/2.1relative" debug="0" reloadable="false" crossContext="true"/>
访问【http://localhost1:8080/relative/】
2.2绝对路径:
在Host标签中间插入下面这个代码
<!-- 配置绝对路径,我的项目名为absolute的项目位于tomcat安装目录下的data文件夹下,不同路径配置相应变化 -->
<Context path="absolute" docBase="G:\JavaWeb\tool\apache-tomcat-8.5.37\data\2.2absolute" debug="0" reloadable="false" crossContext="true"/>
访问【http://localhost:8080/absolute/】
分析:
path:指定项目访问URL,即Tomcat会通过这个路径知道你想访问哪个项目,为空则不加路径就能访问,默认访问appBase下ROOT中的内容;
docBase:设置项目所在位置,Tomcat通过path知道了需要访问某个项目,那么这个项目位于Tomcat的什么位置呢?这个就由docBase来确定。这个路径可以是计算机中的绝对路径如:【G:\data\XXX(windows下);/data/XXX(Linux下)】;也可以是相对路径,这个相对是相对于host标签中的appBase中确定的位置,如果appBase为【/data】而该项目是位于/data目录下的XXX,那么docBase写成【XXX】即可。
完整描述一下过程:当我们把项目放在某个文件夹后,若不在appBase下,那需要重启一下Tomcat,因为Host标签中指定的在appBase下的文件夹才会自动部署,不是这个文件夹就需要重启一下才能部署成功。。。当地址栏输入【http://localhost:8080/XXX/】时,先由这个域名(本机域名映射到127.0.0.1)找到本机处理,再由8080端口找到Tomcat处理,Tomcat中再找到Host标签中name为localhost的域名下面的项目名为XXX的项目,再由docBase指定的位置找到这个项目在计算机中的具体位置,最后就将项目中的index.jsp显示出来啦。
Tomcat配置域名访问项目
有了前面的铺垫这里说得稍微再说深入一些,顺便说下通过Tomcat配置域名访问。
Host标签:定义了虚拟主机,一个Tomcat中可以定义多个虚拟主机,一个虚拟主机可以包含一个或多个web应用。这个虚拟主机的名字实际上可以理解为访问的域名,localhost是本机域名,windows在【C:\Windows\System32\drivers\etc\host】Linux在【/etc/hosts】中可以修改IP和域名的映射关系,,localhost域名映射到127.0.0.1本地回环IP,当需要定义多个Host时这多个Host的name不能相同。
举个栗子:
1.增加一个Host标签,并指定名字为domain.test
<!--指定Host的name为domain.test,让它访问data中的domain项目 -->
<Host name="domain.test" appBase="data" unpackWARs="true" auoDeploy="true">
<Context path="" docBase="domain" debug="0" reloadable="false" crossContext="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>
2.修改【C:\Windows\System32\drivers\etc\host】host文件,让domain.test域名映射到本地回环IP
3.通过刚刚指定的域名访问
另外,在公网服务器上部署项目通过Tomcat配置域名也就是用这个方法。
三、在conf/Catalina目录下配置
操作过程:
在conf/Catalina目录下可以看到localhost文件夹,在localhost文件夹下新建一个confTest.xml文件,文件内容如下:
<Context path="" docBase="G:\JavaWeb\tool\apache-tomcat-8.5.37\data\confTest"
debug="0" privileged="true"> </Context>
启动Tomcat之后,地址栏输入【http://localhost:8080/confTest/】就可以访问到confTest项目啦。注意这儿path指定的没有作用,这个xml文件名取代了path的作用。
示例:
配置xml文件
访问【http://localhost:8080/confTest/】
分析:
在conf/Catalina目录下可以看到localhost文件夹是因为conf/Catalina目录下的文件夹名字是conf/server.xml中配置Host的name值,默认是localhost。如果在server.xml中配置的多个Host,那么在conf/Catalina目录下可以看到多个Host指定的name那些文件夹。这儿的每个文件夹相当于是Tomcat中的各个虚拟主机。这种配置方式相比在server.xml中添加Context更加方便快捷,当该Host指定了自动部署属性为true,这种方式也是一样有热部署效果的,不需要部署某项目直接把那个项目的xml文件删了即可,非常方便。
总结一下涉及到的参数:
Host标签:
定义了虚拟主机,一个Tomcat中可以定义多个虚拟主机,一个虚拟主机可以包含一个或多个web应用。另外Host标签至少有一个,且其中一个的name必须与Engine组件中的defaultHost属性相匹配。
重要属性:
name:通常是虚拟主机的网络名称,注册在你的域名服务器上。无论指定的主机名称是什么样的,Tomcat 在内部都会将其转换为小写。嵌套在 Engine 内部的 Host ,其中必须有一个 Host 的名称匹配 Engine 的默认 Host 设置,当需要定义多个Host时这多个Host的name不能相同。
appBase:虚拟主机的目录,下面的子目录将被部署为应用。可以用绝对目录的形式或者相对于<CATALINA_HOME>的目录,默认是<CATALINA_HOME>/webapps。
unpackWARs:appBase目录下的 WAR-file 是否应该被解压。默认为true,对于 unpackWARs=”false“,Tomcat 将会直接从 WAR-file 运行应用,而不解压,这可能导致应用运行变慢。
autoDeploy:是否自动部署放到appBase目录下的应用。默认autoDeploy为true,Tomcat在运行时定期检查新的Web应用或Web应用的更新;
Context标签:
Host的子元素,含义是一个虚拟主机目录下的一个应用程序,一个Host中可以有多个Context标签,可以没有,没有默认访问appBase下的ROOT。
重要属性:
path:指定项目访问URL,即Tomcat会通过这个路径知道你想访问哪个项目,为空则不加路径(直接通过域名和端口访问)就能访问,默认访问appBase下ROOT中的内容,可指定相对路径或者绝对路径;
docBase:设置项目所在位置(本机位置),可指定相对路径或者绝对路径,Tomcat通过path知道了需要访问某个项目,那么这个项目位于Tomcat的什么位置呢?这个就由docBase来确定。这个路径可以是计算机中的绝对路径如:【G:\data\XXX(windows下);/data/XXX(Linux下)】;也可以是相对路径,这个相对是相对于host标签中的appBase中确定的位置,如果appBase为【/data】而该项目是位于/data目录下的XXX,那么docBase写成【XXX】即可。另外,docBase不在appBase目录中,才需要指定;如果docBase指定的WAR包或应用目录就在appBase中,则不需要指定。