Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,它早期的名称为catalina,后来由Apache、Sun 和其他一些公司及个人共同开发而成,并更名为Tomcat。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选,因为Tomcat 技术先进、性能稳定,成为目前比较流行的Web 应用服务器。Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,但它是独立运行的。

1、Tomcat内核架构名词

常见组件类型 名称
服务组件 服务器(Server)
服务(Service)
连接器类组件 连接器(Connector)
容器类组件 引擎(Engine)
主机(Host)
上下文(Context)
被嵌套类组件 阀门(Valve)
日志记录器(Logger)
领域(Realm)
引擎(Engine)

Tomcat基础知识 - 图1

1.1 常用组件名词解析

1. 服务器(Server)

Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台服务器上可以启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。

2. 服务(Service)

一个服务组件通常包含一个引擎和与此引擎有关的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志;一个Server可以包含多个Service组件,但通常情况下只为一个Service指派一个Server。

3. 连接器(Connectors)

负责连接客户端(可以使浏览器或Web服务器)请求至Servlet容器内的Web程序,通常指的是接收客户端发来请求的位置以及服务器端分配的端口。

  • 默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。
  • 一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。
  • 默认的连接器是基于HTTP/1.1的Coyote

注:Tomcat也支持AJP、JServ和JK2连接器

4. 引擎(Engine)

引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎。 它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context;并将请求处理后的结果返回的相应的客户端。 严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。 如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。 而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处;一个引擎可以包含多个host组件。

5. 主机(Host)

主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。

6. 上下文(Context)

Context组件是最内层次的组件,它表示Web应用程序本身。 配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。 Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。

以下组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。

7. 阀门(Valve)

用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。 Valve可以定义在任何容器类的组件中。 Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。 请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。

8. 日志记录器(Logger)

用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。 日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。

9. 领域(Realm)

用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。 Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。 Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。