Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器。
- Tomcat的目录结构
Tomcat的目录结构是由bin、conf、lib、logs、temp、webapps和work七个部分组成。
1.1 bin目录
bin是存放服务启动、停止等相关程序和文件的目录,以.sh为后缀的用于Linux操作系统,.bat为后缀的用于Windows操作系统中。
1.2 conf目录
conf是Tomcat的相关配置文件目录,关于配置文件的说明可参见下表。
配置文件名 | 说明 |
server.xml | Tomcat服务主配置文件。 |
web.xml | 定义每个webapp以何种方式进行部署才能被访问,其存放位置为WEB-INF/目录中,此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件。 |
context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件。 |
tomcat-users.xml | 用户认证的账号和密*码文件。 |
catalina.policy | 当使用security选项启动tomcat时,用于为tomcat设置安全策略。 |
catalina.properties | 环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数。 |
logging.properties | Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等。 |
1.3 lib目录
lib是库目录,里面为Tomcat服务器运行时所需是要的各种jar依赖包。
1.4 logs目录
logs是日志文件目录,catalina.out为Tomcat服务日志;localhost.xxx.log为默认主机日志;manager.xxx.log和host-manager.xxx.log分别为webapps/manager和webapps/host-manager部分管理日志;localhost_access_log.xxx.txt为默认主机访问日志。
1.5 temp目录
temp是临时文件目录。
1.6 webapps目录
webapps是应用程序和程序部署目录,它的作用类似于httpd服务中的/var/www/html目录,默认的Tomcat主页是放在ROOT子目录下的。该目录也是Tomcat默认的根目录,关于这一目录的结构,笔者放在此篇的第三部分来讲。
1.7 work目录
work是jsp编译后的结果文件目录,当我们将jsp文件放到webapps/ROOT/目录下时,客户端访问时会自动在work/Catalina/localhost/ROOT/org/apache/jsp目录下生成class和java文件,相当于做了缓存,第一次访问时会比较慢,因此建议在用户访问前做好预热工作。如果是进行版本升级,记得要将jsp目录下的数据清空,否则用户查看到的还是旧的内容。
- Tomcat组件
2.1 组件分层和分类
Tomcat组件分层和分类包括以下几个:
①顶级组件:Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突;
②服务类组件:Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine;
③连接器组件:Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议;
④容器类:Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序;
⑤内嵌类:可以内嵌到其他组件内,valve、logger、realm、loader、manager等,以logger举例,在不同容器组件内分别定义。
⑥集群类组件:listener、cluster。
2.2 Tomcat核心组件
上图为Tomcat内部构成图,由Tomcat的6个核心组件组合而成,具体组件及说明请参加下表。
名称 | 说明 |
Server | 服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个。 |
Service | 服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine。 |
Connector | 负责客户端的HTTP、HTTPS、AJP等协议连接,一个Connector只属于某一个Engine。 |
Engine | 即引擎,用来响应并处理用户请求,一个Engine上可以绑定多个Connector。 |
Host | 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分。 |
Context | 应用的上下文,配置特定url路径映射和目录的映射关系:url => directory。 |
2.3 核心组件间的关系
①Tomcat启动一个Server进程,可以启动多个Server,即tomcat的多实例, 但一般只启动一个。
②Server通过创建一个Service来提供服务,可以创建多个Service,但一般也只创建一个。每个Service中,是Engine和其连接器Connector的关联配置。
③可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口,其作用就是处理来自客户端的不同的连接请求或响应。
④Service内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host。Engine对请求头做了分析,将请求发送给相应的虚拟主机;如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机;Engine上的缺省虚拟主机可以修改。
⑤Host定义虚拟主机,虚拟主机有name名称,通过名称匹配。
⑥Context 定义应用程序单独的路径映射和配置。
- Tomcat根目录结构
Tomcat中默认网站根目录是$CATALINA_BASE/webapps/,在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。以下笔者通过与Apache服务的对比来看Tomcat的根目录结构情况。
3.1 默认页面
以Apache服务为例,默认的网站首页是放在/var/www/html下面的,客户端访问时会自动在该目录下寻找默认页面。
Tomcat则是将默认的页面放在ROOT子目录下,相当于Tomcat把自身的默认网站也当成了一个APP,此时客户端去访问时,默认直接通过ROOT这个子目录去寻找默认页面。
3.2 不同服务部署
假设现在有两个服务test1和test2,在Apache服务中,我们可以在将服务部署在/var/www/html目录下,并且两个服务是保持平级的关系。
在Tomcat中,我们也可以将两个服务部署在ROOT目录下。
但不同的是,我们还可以直接将服务部署在webapps目录下,例如现在有个test3的服务,我们可以之间放在webapps目录下保持与ROOT目录的平级关系。
3.3 不同目录级别对比
如果同时存在一个在webapps和webapps/RPPT目录下,处于webapps目录下的服务会优先生效。例如笔者这边在webapps目录下创建一个test2的服务,在webapps/ROOT目录下创建test3服务,test2和test3服务同时存在与webapps和webapps/ROOT目录下,客户端访问时,都只会显示webapps目录下的服务。
- JSP WebApp目录结构
$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的:
①主页配置:默认按index.html→index.htm→index.jsp的顺序查找主页文件;
②WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件;
③META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问;
④classes/:类文件,当前webapp需要的类;
⑤lib/:当前应用依赖的jar包。