深度解析tomcat核心配置文件server.xml

前言

对于tomcat,大家都应该很熟悉。在日常开发中我们一般都是用tomcat来进行部署测试的,tomcat是属于apache的一个轻量级的应用服务器,tomcat本身涉及的底层技术有很多,大家有兴趣可以深入研究一下。这里主要是和大家一起学习一下tomcat的核心配置文件server.xml。之所以说它是tomcat的核心配置文件,因为tomcat中的组件都是在server.xml中进行配置的,了解清楚server.xml是很有必要的。话不多说,开始正文!

请求在tomcat中的处理流程

请求从客户端发出之后,进入了tomcat(这里是指没有经过nginx等代理服务器),然后在tomcat容器中是怎么运转的?要先了解大致的运转流程,再来结合流程看server.xml配置文件。
这里写图片描述
上图的具体流程如下

  1. 用户在浏览器上输入地址,发送http请求,被端口号为8080,协议是http的Connector捕获。
  2. Connector将请求传递给自己所属service的容器,就是tomcat中Engine(引擎)
  3. Engine再将请求根据配置的虚拟主机的name来确定对应的虚拟主机,如果没有匹配的虚拟主机,则使用默认的虚拟主机
  4. Host容器然后再根据context中配置的path来确定具体web应用
  5. Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet,Context匹配到URL 为*.jsp的Servlet,对应JspServlet类。
  6. 将HttpServletRequest,HttpServletResponse作为参数来调用doGet()或者doPost()方法,执行业务逻辑,或者数据存取
  7. 将程序调用结果放在HttpServletResponse对象中,将HttpServletResponse传递给context所属于的虚拟主机
  8. Host虚拟主机将HttpServletResponse对象传递给Engine
  9. Engine把HttpServletResponse对象返回Connector。
  10. Connector把HttpServletResponse对象返回给客户Browser

上面的具体流程详细的解析了,一个http请求在tomcat内部是如何进行运转的。而这些组件如何正确的进行运行是需要依赖于tomcat的核心配置文件server.xml。

解析server.xml中的元素

下面是一个基础的server.xml的例子,其中除掉了tomcat中默认的注释,监听器还有全局命名资源。只是保留了一些核心组件,结合下面的例子来学习server.xml

<?xml version="1.0" encoding="UTF-8"?>
  <Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector connectionTimeout="20000" disableUploadTimeout="true" 
    port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
    <Engine defaultHost="localhost" name="Catalina">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
        resourceName="UserDatabase"/>
      </Realm>
      
      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
      
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." 
      resolveHosts="false" suffix=".txt"/>
      
      <Context docBase="htgl" path="/htgl" reloadable="true" 
      source="org.eclipse.jst.j2ee.server:htgl"/>
      </Host>
    </Engine>
  </Service>
</Server>

上面的server.xml中的组件元素和tomcat容器的实际组件是一一对应的,可以对比下图来进行比对
这里写图片描述
从上面可以看出,在最顶层是一个顶层元素server,一个tomcat中对应一个server,他是一个非容器组件,里面不能内嵌像valve这样的组件。server上的8005端口是用来监听tomcat的shutdown动作的。Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
对于Service,他也是一个非容器组件,当然也是不能内嵌像valve这样的组件的。一个server中包含多个Service,Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
在上面的server例子中,一个Service中包含了两个Connector,分别是

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

上面的两个Connector,上面那个是用来监听8080端口,http协议的请求连接。其中,protocol属性规定了请求的协议,port规定了请求的端口号,redirectPort表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。
下面那个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。
对于Engine组件,Engine在Service组件中有且只有一个;他是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
对于Host组件,一个Engine引擎中至少包含一个Host虚拟主机,而且至少存在一个虚拟主机的name是和Engine中的defaultHost是对应的,当在客户端输入地址的请求匹配不到对应的虚拟主机的时候,就会跳转到默认的虚拟主机。虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。

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

上面的appBase是指web应用发布存放的路径,上面就是我们一般存放在webapps目录下面,而autoDeploy是指是否会自动发布,name就是虚拟主机的名字,upapackWARs是指web应用是直接以war包的形式运行,还是以解压之后的目录来运行。
对于Context,可以认为就是所谓的web应用,Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中。

上图中还包含一些jsp编译监听器,全局命名资源等等一些其他组件,这里就不一一介绍了,有兴趣的可以自己深入了解一下!

总结

tomcat本身能够作为一个轻量级的服务器,在日常开发中发挥很大作用,主要是靠内部的各个组件和容器协同合作。所以理解清楚内部的运行机制和一些基础原理,对自己在日常开发中会有不小的作用。不会出现问题就懵逼的窘境!当然tomcat里面还运行了很多很好的设计模式设计理念,像责任链模式等等,这些后续再和大家一起学习总结!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值