总结tomcat的核心组件以及根目录结构

一.核心组件

1.组件分层和分类

顶级组件
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. Tomcat 内部组成

由上述组件就构成了Tomcat,如下图

image-20220713141144180

名 称说 明
Server服务器,Tomcat 运行的进程实例,一个Server中可以有多个service,但通常就一个
Service服务,就是一个容器,用来组织Engine和Connector的对应关系,一个service中只有一个Engine,多个 Connector
Connector连接器,相当于端口号,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某 一个Engine
Engine即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector,一个引擎中包好多个host主机,
Host即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
Context应用的上下文,配置特定url路径映射和目录的映射关系:url => directory

每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...

范例: 查看类

[root@centos8:/usr/local/tomcat/conf]#
grep className /usr/local/tomcat/conf/server.xml
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.security.SecurityListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

3.核心组件

  • Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个

  • 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
    每个Service中,是Engine和其连接器Connector的关联配置(name=“Catalina”)决定关联

  • 可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应,有关闭服务(8005),有访问请求(8080),有jsp请求(8009)

  • Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host

    • Engine对请求头做了分析,将请求发送给相应的虚拟主机
    • 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
    • Engine上的缺省虚拟主机可以修改
  • Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配

  • Context 定义应用程序单独的路径映射和配置

范例:多个组件关系 conf/server.xml ,这个文件提现了这些组件的关系,

一个tomcat有一个server,最外层是server,对应一个实例,server中包含services,services对应的是connector,connector,engine,当中connector和engine进行了关联(catalina进行关联),当用户通过某个接口发过来请求,应该有对应的engine进行处理,而engine中可以包含多个虚拟主机,下文中的host为localhost,appsbace为apps目录,webapps是/usr/local/tomcat/webapps文件夹,虚拟主机目录就在此文件夹下,(表示当用户访问connector port8080的时候,请求就是由对应的引擎engine进行处理,虚拟主机对应的为default指定的localhost虚拟主机)

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"
			  redirectPort="8443" />
	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
	<Engine name="Catalina" defaultHost="localhost">
		<Host name="localhost" appBase="webapps" unpackWARs="true"  autoDeploy="true">
		<Context >
		<Context />
	  </Host>
	</Engine>
  </Service>
</Server>

4. tomcat 处理请求过程

假设来自客户的请求为:http://localhost:8080/test/index.jsp

  • 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
  • Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
  • Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
  • Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
  • localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  • Host匹配到路径为/test的Context
  • path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
  • Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
  • Context把执行完了之后的HttpServletResponse对象返回给Host
  • Host把HttpServletResponse对象返回给Engine
  • Engine把HttpServletResponse对象返回给Connector
  • Connector把HttpServletResponse对象返回给浏览器端

二.根目录结构

1.tomcat的根目录结构

Tomcat中默认网站根目录是$CATALINA_BASE/webapps/
在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。

nginx
假设在nginx中部署2个网站应用eshop、forum,假设网站根目录是/data/nginx/html,那么部署可以是这样的。
eshop解压缩所有文件放到 /data/nginx/html/ 目录下,forum 的文件放在 /data/nginx/html/forum/ 下。

最终网站链接有以下对应关系

http://localhost/ 对应于eshop的应用,即 /data/nginx/html/
http://localhost/forum/ 对应于forum的应用,即/data/nginx/html/forum/

Tomcat
Tomcat中默认网站根目录是$CATALINA_BASE/webapps/
在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录,在根目录/usr/local/tomcat/webapps/中多一层ROOT目录,访问时候不添加。根目录/usr/local/tomcat/webapps/下的文件夹都认为不同的应用文件夹,默认是root,访问的时候root可以省略,但是其他应用访问的时候就不能省略应用文件夹,必须写全部uri。

将eshop解压后的文件放到这个$CATALINA_BASE/webapps/ROOT中
bbs解压后文件都放在$CATALINA_BASE/webapps/forum目录下。

$CATALINA_BASE/webapps下面的每个目录都对应一个Web应用,即WebApp
最终网站链接有以下对应关系  
http://localhost/ 对应于eshop的应用WebApp,即$CATALINA_BASE/webapps/ROOT/目录,
http://localhost/forum/ 对应于forum的应用WebApp,即$CATALINA_BASE/webapps/forum/
如果同时存在$CATALINA_BASE /webapps/ROOT/forum ,仍以 $CATALINA_BASE/webapps/forum/ 优先生效
每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为
主站目录。  
1.路径测试
[root@centos8:/usr/local/tomcat/conf]#
cd /usr/local/tomcat/webapps/
[root@centos8:/usr/local/tomcat/webapps]#
mkdir blog
[root@centos8:/usr/local/tomcat/webapps]#
vim blog/index.html
/usr/local/tomcat/webapps/blog/index.html

#测试
[root@centos8:/usr/local/tomcat/webapps]#
curl 10.0.0.18:8080/blog/
/usr/local/tomcat/webapps/blog/index.html

2.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包
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值