一、什么是Tomcat
Tomcat 是由 Apache 软件基金会下属的 Jakarta 项目开发的一个 Servlet (Servlet初步了解见Servlet初步了解-CSDN博客)容器。是开源的轻量级Web应用服务器。
二、tomcat结构目录
①bin:启动和关闭tomcat的bat文件。
-
startup.bat , shutdown.bat 用于在windows下启动和停止脚本;
-
startup.sh, shutdown.sh 用于在linux下启动和停止脚本;
②conf:配置文件。
-
Catalina 用于存储针对每个虚拟机的Context配置
-
context.xml 用于定义所有web应用均需加载的Context配置,如果web应用指定了自己的context.xml ,该文件将被覆盖
-
catalina.properties Tomcat 的环境变量配置
-
catalina.policy Tomcat 运行的安全策略配置
-
logging.properties Tomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等
-
server.xml
该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)。 -
web.xml文件配置与web应用(web应用相当于一个web站点)
-
tomcat-user.xml配置用户名密码和相关权限。
③lib:该目录放置运行tomcat运行需要的jar包。
④logs:存放日志,当我们需要查看日志的时候,可以查询信息。
⑤webapps:放置我们的web应用。
⑥work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件。
启动:双击 bin/startup.bat 文件 ;
停止:双击 bin/shutdown.bat 文件 ;
访问:http://localhost:8080
三、Tomcat整体架构
1、Tomcat核心功能
我们已经了解了Tomcat要实现两个核心功能:
1) 处理Socket(套接字)连接,负责网络字节流与Request和Response对象的转化。
2) 加载和管理Servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件连接器(Connector)
和容器(Container)
来分别做这两件事情。连接器负责对外交流,容器负责内部处理。
2、连接器
连接器中有各个组件的作用如下:
1)EndPoint
-
EndPoint : Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
-
Tomcat 并没有EndPoint 接口,而是提供了一个抽象类AbstractEndpoint , 里面定义了两个内部类:Acceptor和SocketProcessor。Acceptor用于监听Socket连接请求。SocketProcessor用于处理接收到的Socket请求,它实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到线程池来执行。而这个线程池叫作执行器(Executor),我在后面的专栏会详细介绍Tomcat如何扩展原生的Java线程池。
2) Processor
Processor : Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象。
3)ProtocolHandler
ProtocolHandler: Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协议的处理能力。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol。我们在配置tomcat/conf/server.xml 时 , 至少要指定具体的ProtocolHandler , 当然也可以指定协议名称 , 如 : HTTP/1.1 ,如果安装了APR,那么将使用Http11AprProtocol , 否则使用 Http11NioProtocol。
4)Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来“存放”这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,也就意味着,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器的Service方法。
3、容器
Tomcat设计了4种容器,分别是Engine、Host、Context和Wrapper。容器的功能是处理Connector接收进来的请求,并产生相应的响应,这4种容器不是平行关系,而是父子关系, Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性。
每个Service 会包含一个Container容器。在Container内部包合了4个子容器:4个子容器的作用分别是:
1) Engine 表示整个Catalina(Apache Tomcat 服务器中使用的 Servlet 容器 的名字)的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host
2)Host 代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context
3)Context 表示一个Web应用程序, 一个Web应用可包含多个Wrapper
4)Wrapper 表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
四、server.xml
server.xml是Tomcat中最重要的配置文件,server.xml位于$TOMCAT_HOME/conf目录下;server.xml的每一个元素都对应了Tomcat中的一个组件;通过对xml文件中元素的配置,可以实现对Tomcat中各个组件的控制。
什么是组件?
组件(Component)是对数据和方法的简单封装。在软件开发中,组件是一个重要的概念,它通常是一个从TComponent(TComponent类是Delphi编程语言中的一个核心类,它定义了组件的许多核心元素。)派生出来的特定对象,具有自己的属性和方法。属性用于访问组件的数据,而方法则是组件的一些简单而可见的功能。使用组件可以实现拖放式编程、快速的属性处理以及面向对象的设计。
组件的定义和作用
组件的定义可以追溯到其基本概念,即对数据和方法的简单封装。在C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象,具有自己的属性和方法。属性用于访问组件的数据,方法则是组件的一些简单而可见的功能。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。
组件在不同技术中的应用
在不同的技术框架中,组件的应用有所不同。例如,在Vue.js中,组件是一个自定义标签,用于对页面进行模块化。每个标签包含HTML、CSS和JS代码,封装完整的功能。Vue.js的组件化开发使得代码更加模块化,易于维护和复用。
组件的优缺点
使用组件的优点包括:
- 复用性高:组件可以被多次使用,减少重复编码。
- 维护方便:组件的独立性和封装性使得维护更加简单。
- 开发效率高:通过组件化开发,可以提高开发效率,减少错误。
缺点包括:
- 学习曲线:对于新手来说,理解和使用组件可能需要一定的时间。
- 性能问题:过多的组件可能会导致页面加载变慢,影响用户体验。
server.xml的整体结构如下:
1、server.xml文件中的元素可以分为以下4类
(1)顶层元素:<Server>
和<Service>
<Server>
元素是整个配置文件的根元素,<Service>
元素则代表一个Engine元素以及一组与之相连的Connector(处理Socket(套接字)连接,负责网络字节流与Request和Response对象的转化)元素。
(2)连接器:<Connector>
<Connector>
代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
(3)容器:<Engine><Host><Context>
容器的功能是处理Connector接收进来的请求,并产生相应的响应。Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
(4)内嵌组件:可以内嵌到容器中的组件。实际上,Server、Service、Connector、Engine、Host和Context是最重要的最核心的Tomcat组件,其他组件都可以归为内嵌组件。
2、各个核心组件的作用、特点以及配置方式
1)Server
Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。
在第一部分的例子中,在最外层有一个元素,shutdown属性表示关闭Server的指令;port属性表示Server接收shutdown指令的端口号,设为-1可以禁掉该端口。
2)Service
Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。
一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。
在第一部分的例子中,Server中包含一个名称为“Catalina(Apache Tomcat 服务器中使用的 Servlet 容器 的名字)”的Service。实际上,Tomcat可以提供多个Service,不同的Service监听不同的端口。
3)Connector
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程(因篇幅过长,此处不做详细描述,进程线程连续与区别介绍文章:进程和线程的区别(超详细)-CSDN博客)让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。
通过配置Connector,可以控制请求Service的协议及端口号。Service可以配置两个Connector,也就是整体架构的该部分:
eg:配置两个Connector
(1)通过配置第1个Connector,客户端可以通过8080端口号使用http协议访问Tomcat。其中,protocol属性规定了请求的协议,port规定了请求的端口号,redirectPort表示当强制要求https而请求是http时,重定向至端口号为8443的Connector,connectionTimeout表示连接的超时时间。
在这个例子中,Tomcat监听HTTP请求,使用的是8080端口,而不是正式的80端口;实际上,在正式的生产环境中,Tomcat也常常监听8080端口,而不是80端口。这是因为在生产环境中,很少将Tomcat直接对外开放接收请求,而是在Tomcat和客户端之间加一层代理服务器(如nginx),用于请求的转发、负载均衡、处理静态文件等;通过代理服务器访问Tomcat时,是在局域网中,因此一般仍使用8080端口。
局域网不同网段的计算机互相访问,为什么要加上端口号8080?
去学校机房上课,局域网有一个网站,我的计算机IP是192.168.21.39,我访问这个网站里要在浏览器地址栏输入192.168.2.4:8080才能打开这个网站的网页,如果去掉端口8080之后,只输入192.168.2.4,却不能此网站,这是怎么回事?为什么不同网段的计算机不能能互相访问。
因为不加8080的话,默认是访问80端口,而该WEB服务器设置了是8080端口,所以必须访问8080端口才能访问网站。
不同网段的计算机能“访问”,这没有什么新鲜的。
就好比你要访问新浪,你输入新浪网址,其实跟你输入IP地址是一个道理,只是多了一个把这个网址通过DNS服务器解析成新浪网址所在服务器IP的过程,你每天浏览的网页,都是在访问不同网段的web服务器。
再者,你跟这个网站根本不是一个局域网的,能访问这个跟局域网的共享没有半毛钱关系,因为两个不是同个子网的,所以不是同个局域网的,之所以能访问该web服务器,是因为本身路由器知道该地址的路由,知道数据包该往哪发,这跟你能浏览外网的网站是一个道理,你能访问新浪网站,不能说你跟新浪网站所在的IP是同个局域网
代理服务器是一种数字中介,用于在用户和在线资源之间路由互联网流量,确保安全和受控的数据交换。代理服务器的主要功能是代理网络用户去取得网络信息,作为网络信息的中转站,负责转发合法的网络信息,并对转发进行控制和登记。
代理服务器的类型
代理服务器可以分为两种主要类型:正向代理和反向代理。
- 正向代理:正向代理位于客户端和目标服务器之间,主要用于内部网络对外部网络的访问请求。客户端必须指定代理服务器,并将请求发送到代理服务器,由代理服务器转发给目标服务器。正向代理通常用于访问被限制或不可访问的内容,或者在内部网络中提供对外访问的方式3。
- 反向代理:反向代理位于客户端和目标服务器之间,主要用于内部网络的服务对外提供服务。它将客户端的请求转发给内部网络上的目标服务器,并将结果返回给客户端。反向代理可以隐藏后端服务器的真实IP地址,增加系统的安全性,并实现负载均衡和缓存静态内容等功能3。
Nginx作为代理服务器的功能和应用场景
Nginx是一个高性能的HTTP和反向代理服务器,由俄罗斯的程序设计师Igor Sysoev开发。Nginx具有轻量级、内存占用少、并发能力强等特点,支持热部署和模块扩展。Nginx可以作为正向代理和反向代理服务器使用:
- 正向代理:Nginx可以配置为正向代理服务器,用于内部网络对外部网络的访问请求。通过配置Nginx的代理设置,客户端可以通过Nginx访问外部网络资源。
- 反向代理:Nginx常用于反向代理场景,可以隐藏后端服务器的真实IP地址,增加系统的安全性。Nginx支持负载均衡、缓存静态内容等功能,提高网站的性能和可用性。
常见网络服务端口
HTTP(端口80):
超文本传输协议(HTTP)是用于Web浏览的主要协议。它在默认情况下使用端口80,用于在客户端和服务器之间传输网页数据。HTTP协议是无状态的,即每个请求都是独立的,不保存任何会话信息。
HTTPS(端口443):
安全超文本传输协议(HTTPS)是HTTP的安全版本,使用SSL/TLS加密数据传输,确保数据的机密性和完整性。HTTPS在默认情况下使用端口443,广泛应用于需要保护敏感数据的网站,如在线银行、电子商务等。
FTP(端口21):
文件传输协议(FTP)用于在客户端和服务器之间传输文件。FTP在默认情况下使用端口21,用于控制连接和命令传输。数据传输则可以使用不同的端口(通常是20或被动模式下的随机端口)。
SMTP(端口25):
简单邮件传输协议(SMTP)是用于发送电子邮件的标准协议。SMTP在默认情况下使用端口25,负责将邮件从客户端发送到邮件服务器,再从邮件服务器发送到接收者的邮件服务器。
POP3(端口110):
邮局协议版本3(POP3)用于从邮件服务器上下载电子邮件。POP3在默认情况下使用端口110,适用于单个设备访问邮件的场景。
IMAP(端口143):
互联网邮件访问协议(IMAP)用于在邮件服务器上管理和读取电子邮件。IMAP在默认情况下使用端口143,支持多个设备同步访问邮件,适用于需要在多设备上访问邮件的场景。
DNS(端口53):
域名系统(DNS)用于将域名解析为IP地址。DNS协议在默认情况下使用端口53,支持TCP和UDP两种传输协议,主要用于域名解析查询和更新。
DHCP(端口67/68):
动态主机配置协议(DHCP)用于动态分配IP地址和其他网络配置。DHCP服务器在默认情况下使用端口67,客户端使用端口68,用于请求和接收IP地址及配置参数。
SSH(端口22):
安全外壳协议(SSH)用于安全地远程登录和管理网络设备。SSH在默认情况下使用端口22,提供加密的数据传输和强大的认证机制,广泛应用于服务器管理和安全访问。
数据库服务端口
MySQL(端口3306):
MySQL是一个流行的开源关系型数据库管理系统。默认情况下,MySQL使用端口3306进行数据库服务通信。通过这个端口,客户端可以连接到MySQL服务器,进行数据查询、插入、更新和删除等操作。确保3306端口开放且安全配置,以防止未经授权的访问。
PostgreSQL(端口5432):
PostgreSQL是一种功能强大的开源对象-关系型数据库系统。默认情况下,PostgreSQL使用端口5432进行通信。该端口用于接受客户端连接,执行SQL查询和其他数据库操作。确保5432端口配置正确,并采取必要的安全措施,如SSL加密和防火墙规则。
SQL Server(端口1433):
Microsoft SQL Server是一种企业级关系型数据库管理系统。默认情况下,SQL Server使用端口1433进行通信。客户端通过这个端口连接到SQL Server实例,执行数据库操作。为了保护数据库安全,建议对1433端口进行加密传输和访问控制。
Oracle(端口1521):
Oracle数据库是一个功能强大的企业级数据库管理系统。默认情况下,Oracle数据库监听端口1521,用于接受客户端连接和数据库通信。1521端口是Oracle Net Listener的默认端口,通过配置Listener文件可以更改该端口。确保对1521端口进行安全配置和加密传输,以防止数据泄露和未经授权的访问。
这些数据库服务端口是日常管理数据库系统时需要了解和配置的重要部分。通过熟悉和正确配置这些端口,可以确保数据库系统的正常运行和数据的安全传输。
端口和接口的区别
文中提及的接口和端口都是用于WEB端的接口和端口。
不同点:
1、不同的作用
接口是调用资源的出入口,所以接口对应的是资源。
端口是计算机于外界交流的出入口,所以端口对应的是协议和服务。
2、接口必须通过端口才能实现资源调用,而端口可以不通过接口未进行数据交互(服务)。
3、可以通过一个端口调用无数个接口,但是一个接口通常只能使用一个端口;
4、每个端口都只能按照固定的协议提供服务:但是可以通过不同的协议调用相同内容的资源,即指向相同内容的资源的端口的协议类型可以不同。
(2)通过配置第2个Connector,客户端可以通过8009端口号使用AJP协议访问Tomcat。是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。
4)Engine
Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。eg:
name属性用于日志和错误信息,defaultHost属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理;因此,defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配。
name属性用于日志和错误信息,在整个Server中应该唯一。
5)Host
Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。
Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。
Host的作用:
Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。
Host组件代表的虚拟主机,对应了服务器中一个网络名实体(如”www.test.com”,或IP地址”116.25.25.25”);为了使用户可以通过网络名连接Tomcat服务器,这个名字应该在DNS服务器上注册。
DNS(Domain Name System)是互联网上的一项核心服务,它负责将人类可读的域名转换为机器可识别的IP地址。简单来说,DNS就像是互联网的电话簿,它允许我们通过输入易于记忆的地址,如www.example.com,来访问网站,而不需要记住复杂的数字IP地址,如192.0.2.1。
DNS的工作原理
当用户尝试访问一个网站时,他们的计算机会使用DNS来将网站的域名转换为IP地址,这个过程称为域名解析。域名解析的过程涉及多个DNS服务器,包括根服务器、顶级域名服务器和权威域名服务器。这些服务器协同工作,确保用户能够找到他们想要访问的网站。
例如,当用户输入www.example.com时,他们的计算机首先会询问根服务器,根服务器会指向负责.com顶级域的服务器。然后,顶级域名服务器会指向负责example.com域的权威服务器。最终,权威服务器会提供www.example.com的IP地址,允许用户的计算机连接到该网站。
DNS的组成:由多个组件组成
域名:互联网资源的人类可读名称,如example.com。
IP地址:互联网资源的数字标识符,如192.0.2.1。
域名服务器:存储域名和IP地址映射关系的服务器。
解析器:用户计算机上的软件,负责发起域名解析请求。
资源记录:DNS数据库中的记录,包含域名到IP地址的映射信息。
客户端通常使用主机名来标识它们希望连接的服务器;该主机名也会包含在HTTP请求头中。Tomcat从HTTP头中提取出主机名,寻找名称匹配的主机。如果没有匹配,请求将发送至默认主机。因此默认主机不需要是在DNS服务器中注册的网络名,因为任何与所有Host名称不匹配的请求,都会路由至默认主机。
Host的参数:
-
unpackWARs指定了是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。
-
Host的autoDeploy和appBase属性,与Host内Web应用的自动部署有关;
一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配
Host元素内定义了Valve组件:
不同的Valve有不同的特性,AccessLogValve记录的日志就是访问日志,每天的请求会写到一个日志文件里。AccessLogValve可以与Engine、Host或Context关联;
一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。
Valve组件参数:
-
className:规定了Valve的类型,是最重要的属性;本例中,通过该属性规定了这是一个AccessLogValve。
-
directory:指定日志存储的位置,本例中,日志存储在$TOMCAT_HOME/logs目录下。
-
prefix:指定了日志文件的前缀。
-
suffix:指定了日志文件的后缀。通过directory、prefix和suffix的配置,在$TOMCAT_HOME/logs目录下,可以看到如下所示的日志文件。
-
pattern:指定记录日志的格式
小结:pattern中一些值:
%h:远程主机名或IP地址;如果有nginx等反向代理服务器进行请求分发,该主机名/IP地址代表的是nginx,否则代表的是客户端。后面远程的含义与之类似,不再解释。
%l:远程逻辑用户名,一律是”-”,可以忽略。
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri(uri和url的区别与联系(一看就理解)_uri url-CSDN博客)、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。
%D:请求处理的时间(单位是毫秒)
6)Context(静态部署)
Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录
<context>
元素参数如下:
-
docBase:docBase指定了该Web应用使用的WAR包路径,或应用目录。静态部署时,docBase可以在appBase目录下,也可以不在;本例中,docBase不在appBase目录下。
docBase和appBase的区别:
docBase,这个参数用来定义网站的文件存放路径,如果不定义,默认是在appBase/ROOT下面,定义了docBase就以该目录为主了,其中appBase和docBase可以一样。在这一步操作过程中很多同学遇到过访问404的问题,其实就是docBase没有定义对。 appBase为应用存放目录,通常是需要把war包直接放到该目录下面,它会自动解压成一个程序目录
-
path:静态部署时,可以显式指定path属性,但是仍然受到了严格的限制:只有当自动部署完全关闭(deployOnStartup和autoDeploy都为false)或docBase不在appBase中时,才可以设置path属性。在本例中,docBase不在appBase中,因此path属性可以设置。
-
reloadable属性指示tomcat是否在运行时监控在WEB-INF/classes和WEB-INF/lib目录下class文件的改动。如果值为true,那么当class文件改动时,会触发Web应用的重新加载。在开发环境下,reloadable设置为true便于调试;但是在生产环境中设置为true会给服务器带来性能压力,因此reloadable参数的默认值为false。
但是目前往往server.xml配置文件中看不到Context元素的出现,因为Tomcat开启了自动部署,Web应用没有在server.xml中配置静态部署,而是由Tomcat通过特定的规则自动部署。
Context是Host的子容器,每个Host中可以定义任意多的Context元素。
静态部署与自动部署是可以共存的。在实际应用中,并不推荐使用静态部署,因为server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而自动部署可以在Tomcat运行时通过定期的扫描来实现,不需要重启服务器。
7)Listener
Listener(即监听器)定义的组件,可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止。监听器需要配置的最重要的属性是className,该属性规定了监听器的具体实现类,该类必须实现了org.apache.catalina.LifecycleListener接口
下面依次介绍例子中配置的监听器:
-
VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器。
-
AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
-
JasperListener:在Web应用启动之前初始化Jasper,Jasper是JSP引擎,把JVM不认识的JSP文件解析成java文件,然后编译成class文件供JVM使用。
-
JreMemoryLeakPreventionListener:与类加载器导致的内存泄露有关。
-
GlobalResourcesLifecycleListener:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。< GlobalNamingResources>将在后文介绍。
-
ThreadLocalLeakPreventionListener:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。
8)GlobalNamingResources与Realm
Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用。Realm的配置使用name为UserDatabase的资源实现。而该资源在Server元素中使用GlobalNamingResources配置,GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。
五、Tomcat 三种部署方式
Tomcat 三种部署方式:
1)在server.xml文件上配置<Context>
节点,设置相关的属性即可(静态部署)【上文中提过】
2)直接把Web项目放在webapps下,Tomcat会自动将其部署(自动部署)
3)通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。(自动部署)
自动部署原理:
通过配置Host元素的deployOnStartup和autoDeploy属性可以开启虚拟主机自动部署Web应用:当检测到新的Web应用或Web应用的更新时,会触发应用的部署(或重新部署)。
二者的主要区别在于:deployOnStartup为true时,Tomcat在启动时检查Web应用,且检测到的所有Web应用视作新应用;autoDeploy为true时,Tomcat在运行时定期检查新的Web应用或Web应用的更新。
自动部署依赖于检查是否有新的或更改过的Web应用,而Host元素的appBase和xmlBase设置了检查Web应用更新的目录:
-
appBase属性指定Web应用所在的目录,默认值是webapps,这是一个相对路径,代表Tomcat根目录下webapps文件夹。
-
xmlBase属性指定Web应用的XML配置文件所在的目录,默认值为conf/<engine_name>/<host_name>,例如上文例子中,主机localhost的xmlBase的默认值是$TOMCAT_HOME/conf/Catalina/localhost。
而Tomcat按照如下的顺序进行扫描,来检查应用更新:
1)扫描虚拟主机指定的xmlBase下的XML配置文件
2)扫描虚拟主机指定的appBase下的WAR文件
3)扫描虚拟主机指定的appBase下的应用目录
六、常用端口
Tomcat 常见端口:8005、8009、8080、8443作用
8005 ==> 8005端口是关闭tomcat进程所用
8009 ==> HTTP等反向代理tomcat时就可以使用ajp协议反向代理到该端口
8080 ==>默认的HTTP监听端口
8843 ==> 默认的HTTPS监听端口(默认未开启)
七、tomcat容器如何创建servlet类实例
1、当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
2、在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
八、Tomcat工作模式
Tomcat作为servlet容器,有三种工作模式:
1、独立的servlet容器,servlet容器是web服务器的一部分;
2、进程内的servlet容器,servlet容器是作为web服务器的插件和java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足;
3、进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
参考文章:内容主要参考文章:什么是tomcat?tomcat是干什么用的?
端口类型:网络的端口类型有哪些? - 知乎
端口号:局域网不同网段的计算机互相访问,为什么要加上端口号8080?_百度知道
进程线程连续与区别:进程和线程的区别(超详细)-CSDN博客
端口和接口的区别:浅谈端口和接口的区别-CSDN博客