目录结构

Tomcat是一款纯绿色安装的软件,从官网下载下来以后解压即可使用,期目录结构如下图所示

后端程序员必须要懂的Tomcat服务器

  • bin:  tomcat服务器的可执行文件和脚本文件
  • conf: tomcat的配置信息文件
  • lib:   tomcat的依赖jar包
  • log:  tomcat的日志信息
  • temp:  tomcat的临时文件
  • webapps:存放web应用的目录,web应用会部署到该目录下
  • work: 存放jsp编译后产生的字节码文件

当服务器上没有部署任何项目时,启动服务器默认访问的是webapps下的ROOT文件夹下的index.jsp文件

整体架构

HTTP服务器

浏览器发送给服务端的是一个http格式的需求,http服务器收到这个请求后,需要调用服务端程序来处理,所谓的服务端程序就是我们写的java类,一般来说,不同的请求需要不同的Java类来处理

后端程序员必须要懂的Tomcat服务器

  1. 图1表示服务器直接调用具体业务类,此时他们是耦合的
  2. 图2 HTTP服务器不直接调用业务类,而是将请求分发给Servlet容器来处理,容器再通过Servlet接口来调用业务类处理。正是因为Servlet接口和Servlet容器的出现,使得HTTP服务器和业务类实现了解耦。我们把Servlet接口和Servlet容器这一整套规范称作Servlet规范。Tomcat按照Servlet规范实现了Servlet容器,同时它也具有HTTP服务器的功能。所以这也是为什么Java程序员只需要实现一个Servlet接口就能处理一个请求的原因所在,即我们负责实现,tomcat负责调用。

Servlet容器运行原理

由前面我们知道,Servlet容器解决了HTTP服务器和业务类之间的耦合关系,业务类的具体调用交由自己处理,那么它是如何处理的呢?

当客户请求某个资源时,HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法;Servlet容器拿到请求信息后,会根据请求的URL和Servlet的映射关系找到对应的Servlet,如果Servlet还没有被加载,就会利用反射机制创建这个Servlet对象,然后调用init()方法来完成初始化,接着调用service()方法来处理请求,最后返回给HTTP服务器一个ServletResponse对象,HTTP服务器会把响应的数据发送给客户端;如下图所示

后端程序员必须要懂的Tomcat服务器

容器(Catalina)

Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的Servlet容器;Catalina是Servlet容器的具体实现,它集成了安全,管理,集群,会话等Servlet容器架构的各个方面;它在Tomcat整体架构中的位置如下图所示

后端程序员必须要懂的Tomcat服务器

Tomcat的本质是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模块都是为Calina提供支持的。那么Catalina的内部组成又是如何的呢?它的主要结构如下

后端程序员必须要懂的Tomcat服务器

如上图所示,Catalina负责管理Server,而Server表示整个服务器,Server下面又有多个Service,每个Service包含着多个Connector(连接器组件)和一个容器组件Container。在Tomcat启动的时候,会初始化一个Catalina对象。

各组件的职责如下

后端程序员必须要懂的Tomcat服务器

相关配置

Tomcat服务器的配置主要集中于conf文件夹下的catalina.policy,Catalina.properties,context.xml,server.xml,tomcat-users.xml以及web.xml中

服务配置

服务配置的相关信息主要都封装在server.xml文件中

Executor(线程池)

默认情况下service并未添加共享线程池配置,如果我们想添加一个,可以在<service>下添加如下配置

后端程序员必须要懂的Tomcat服务器

相关的属性说明如下

后端程序员必须要懂的Tomcat服务器

附:我们可以通过JDK提供的JConsole来监控线程变化

Connector(连接器)

Connector用于创建链接器实例。默认情况下,server.xml配置来两个链接器,一个支持HTTP协议,一个支持AJP协议,因此大多数情况下,我们并不需要增减链接器配置,只是根据需要对已有链接器进行优化

后端程序员必须要懂的Tomcat服务器

相关的属性说明

  1. port:端口号,用于创建服务端Socket并进行监听,如果属性值设置为0,tomcat会随机分配一个可用端口号给当前连接器用
  2. protocol:当前连接器支持的访问协议。默认为HTTP/1.1
  3. connectionTimeOut:连接器接收连接后的等待超时时间,单位毫秒,-1表示不超时
  4. redirectPort:当前connector不支持SSL请求,当需要SSL传输时指定的一个端口
  5. executor:指定共享线程池的名称
  6. URIEncoding:用于指定URI的字符编码,Tomcat8以上默认是UTF-8

关于protocol配置的简单补充

后端程序员必须要懂的Tomcat服务器

Engine(引擎)

Engine作为Servlet引擎的顶级元素,内部可以嵌入Cluster,Listener,Value和Hosts

后端程序员必须要懂的Tomcat服务器

属性说明

  1. name:用于指定Engine的名称,默认为Catalina。该名称会影响部分文件的存储路径
  2. defaultHost:默认使用的虚拟主机名称,当客户端请求指向的主机无效时,将交由默认的虚拟主机处理,默认为localhost

Host(主机)

Host元素用于配置一个虚拟主机,它支持很多嵌套原色

后端程序员必须要懂的Tomcat服务器

属性说明

  1. name:当前Host通用的网络名称,必须与DNS(域名)服务器上的注册信息一致
  2. appBase:当前Host应用的基础目录,当前部署的项目应都在该目录下,默认为webapps
  3. unpackWARs:设置为true,Host启动时会将war包解压,false则不解压
  4. autoDeploy:控制tomcat是否在运行时定期监测并自动部署新增或变更的web应用

Context

用来配置一个web应用,默认配置如下

后端程序员必须要懂的Tomcat服务器

属性描述

  1. docBase:Web应用目录或者War包的部署路径,可以是绝对路径也可以是Host/appBase的相对路径
  2. path:Web应用的Context路径,如果我们Host名为localhost,则web应用的访问跟路径为http://localhost:8080/myApp/

管理配置

Tomcat作为一个服务器软件,本身对外提供了虚拟主机管理和对部署的所有web应用的管理,如下图所示

后端程序员必须要懂的Tomcat服务器

这两个模块都默认添加了访问权限控制,当你点击某个按钮时都需要你输入用户名和密码登入,所以想要访问该页面,必须在conf/tomcat-users.xml中配置并分配对应的角色

Host Manager

配置如下:

后端程序员必须要懂的Tomcat服务器

其中

  1. admin-gui:用于控制页面访问权限
  2. admin-script:用于控制以简单文本的形式访问

Manager

配置如下

后端程序员必须要懂的Tomcat服务器

服务器安全

Tomcat 作为一个运行我们项目的服务器,如何保证其安全是我们必须要关注的问题,通常我们会从配置安全,应用安全以及传输安全这三个方面同时加强系统的安全性。

配置安全

  1. 删除webapps下的目录
  2. 注释或删除tomcat-users.xml文件内的所有用户权限
  3. 配置异常页面
  4. 更改关闭tomcat指令或禁用:Tomcat的server.xml中定义了可以直接关闭tomcat实例的管理端口。可以通过telnet连接上端口以后,输入SHUTDOWN(默认关闭指令)即可关闭tomcat实例(注意,此时虽然实例关闭了但是进程依然存在),由与默认的端口和指令都很简单,所以我们可以通过一下方式修改或禁用

     后端程序员必须要懂的Tomcat服务器

应用安全

在大部分web应用中,特别是一些后台应用系统,都会实现自己的安全管理模块或者说是权限模块,用于控制应用系统的安全访问,基本包含两个部分:认证(登入/单点登入)和授权(功能权限和数据权限)两个部分。对于当前的业务系统,可以自己做一套适用于自己系统的安全管理模块,也可以用一些功能完善的安全模块,将其集成到我们的系统中来,如Spring-security,shiro等

传输安全

HTTPS介绍

后端程序员必须要懂的Tomcat服务器

至此,仅剩调优部分的知识了,有时间再更新

相关文章:

  • 2022-12-23
  • 2021-08-25
  • 2021-08-28
  • 2021-12-05
  • 2021-09-25
  • 2021-05-30
  • 2021-12-24
猜你喜欢
  • 2021-08-28
  • 2021-09-07
  • 2021-05-26
  • 2021-05-08
  • 2022-12-23
  • 2021-07-08
相关资源
相似解决方案