共计 6583 个字符,预计需要花费 17 分钟才能阅读完成。
在介绍 Tomcat 之前我们再来好好回顾一下 Servlet 和 JSP
Servlet 是一种 CGI 技术,能实现让 Java 开发动态的 Web 资源,并通过 CGI 技术与前端的 Web 服务器进行通信,但其对 HTML 文档的定义都要有 JAVA 程序来实现,任何静态资源以发生修改都要重新编译整个 Java 页面程序,非常的麻烦,并且 Java 程序员必须了解前端 HTML 的展示方式
servlet 也可以被认为是服务器端的 applet。servlet 被 Web 服务器加载和执行,就如同 applet 被浏览器加载和执行一样。servlet 从客户端 (通过 Web 服务器) 接收请求,执行某种作业,然后返回结果。使用 servlet 的基本流程如下:
1. 客户端通过 HTTP 提出请求.
2.Web 服务器接收该请求并将其发给 servlet。如果这个 servlet 尚未被加载,Web 服务器将把它加载到 Java 虚拟机并且执行它。
3.servlet 将接收该 HTTP 请求并执行某种处理。
4.servlet 将向 Web 服务器返回应答。
5.Web 服务器将从 servlet 收到的应答发送给客户端。
由于 servlet 是在服务器上执行,通常与 applet 相关的安全性的问题并不需实现。要注意的是 Web 浏览器并不直接和 servlet 通信,servlet 一般是由前端 Web 服务器加载和执行的;而 servlet 是用 Java 编写的,所以 servlet 编写一次就可以在任何平台运行(write once,run anywhere)。
JSP 是一种脚本语言,它可以实现将 Java 程序以标签 <% %> 的形式嵌入到 HTML 文档中,这样极大的方便了程序的编译和修改(Servlet 的程序一发生修改(那怕是 HTML 静态资源修改)就要重新编译整个 Java 程序页面),JSP 修改后可以立即看到结果,不需要手工编译,JSP 引擎会来做这些工作;而 Servelt 却需要编译,重新启动 Servlet 引擎等一系列动作
但是 JSP 程序(一般为.jsp 结尾)要被执行必须先被转译(如 Jasper)为.java 的源代码,.java 再由编译器编译为.class 类,然后在 JVM 中进行类加载、解释才能执行
总之相对于 Servlet 来说,JSP 可以方便的让 Java 与 HTML 进行结合,让程序员可以很方便的实现在 HTML 静态文档中加入或者修改 Java 编写的动态内容,这也可以说是 Servlet 和 JSP 唯一区别,其他区别是在不大
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选;一般来说以 JSP 格式开发的网站,几乎都用 Tomcat 来作为 Java 的应用程序服务器。Tomcat 不严格来说的话就是一个 Web Container(具有 JVM,Jasper 的功能,可以直接对.jsp 程序进行处理执行),可以让 JSP 编写的动态 web 资源在 Tomcat 中运行,并将运行结果直接响应给 client 或者交给前端 web server 再响应给 client
Tomcat 的集群一般都是前端由 Apache 作为代理服务器, 将用户的.jsp 请求全部转发给位于后端的 Tomcat 进行处理,当配置正确时,Apache 为 HTML 页面服务,而 Tomcat 实际上运行 JSP 页面和 Servlet。另外,Tomcat 和 IIS 等 Web 服务器一样,具有处理 HTML 页面的功能,另外它还是一个 Servlet 和 JSP 容器,独立的 Servlet 容器是 Tomcat 的默认模式。不过,Tomcat 处理静态 HTML 的能力不如 Apache 服务器。目前 Tomcat 最新版本为 9.0。
Tomcat 的组件构成如图
tomcat news
Tomcat 的架构:
Tomcat 6 支持 Servlet 2.5 和 JSP 2.1 的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:
1. 顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;Server、Service
2. 连接器:连接客户端(可以是浏览器或 Web 服务器)请求至 Servlet 容器,
3. 容器:包含一组其它组件;Engine、Host、Context
4. 被嵌套的组件:位于一个容器当中,但不能包含其它组件;
各常见组件:
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 的“虚拟主机”。一个引擎至少要包含一个主机组件,但当引擎有多个 Host 时,请求到达引擎要决定发往哪个 HOST 或者用户请求了一个不存在的主机, 所以这时一般要为引擎指定一个默认的虚拟主机;每一个虚拟主机都可以是一个独立的网站。
6、上下文(Context):Context 组件是最内层次的组件,它表示 Web 应用程序本身。配置一个 Context 最主要的是指定 Web 应用程序的根目录,以便 Servlet 容器能够将用户请求发往正确的位置。Context 组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息;每个 context 都可以单独部署一个应用程序。
容器类组件:Engine、Host、Context
顶级组件:Server、Service
一个 Service 内只能有一个 Engine,但可以将一个或多个 Connector(连接器)关联到 Engine 上,一个 Engine 内可以有多个 Host,一个 Host 内可以有多个 Context
此外还有其他被嵌套类 (nested) 组件:
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其它组件,但有些却可以由不同层次的容器各自配置。
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 所覆盖。
Tomcat 连接器架构:
基于 Apache 做为 Tomcat 前端的架构来讲,Apache 通过 mod_jk、mod_jk2 或 mod_proxy 模块与后端的 Tomcat 进行数据交换。而对 Tomcat 来说,每个 Web 容器实例都有一个 Java 语言开发的连接器模块组件,在 Tomcat6 中,这个连接器是 org.apache.catalina.Connector 类。这个类的构造器可以构造两种类别的连接器:HTTP/1.1 负责响应基于 HTTP/HTTPS 协议的请求,AJP/1.3 负责响应基于 AJP 的请求。但可以简单地通过在 server.xml 配置文件中实现连接器的创建,但创建时所使用的类根据系统是支持 APR(Apache Portable Runtime)而有所不同。
APR 是附加在提供了通用和标准 API 的操作系统之上一个通讯层的本地库的集合,它能够为使用了 APR 的应用程序在与 Apache 通信时提供较好伸缩能力时带去平衡效用。
同时,需要说明的是,mod_jk2 模块目前已经不再被支持了,mod_jk 模块目前还 apache 被支持,但其项目活跃度已经大大降低。因此,目前更常用 的方式是使用 mod_proxy 模块。
如果支持 APR:
1、HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol
2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
如果不支持 APR:
HTTP/1.1: org.apache.coyote.http11.Http11Protocol
AJP/1.3: org.apache.jk.server.JkCoyoteHandler
连接器协议:
Tomcat 的 Web 服务器连接器支持两种协议:AJP 和 HTTP,它们均定义了以二进制格式在 Web 服务器和 Tomcat 之间进行数据传输,并提供相应的控制命令。
AJP(Apache JServ Protocol)协议:
如果 Tomcat 的集群前端是 Apache 依据自己的 proxy_mod 模块作为反向代理,则 Apache 可以将前端的 http 请求以 AJP 协议发送给后端的 Tomcat,AJP 协议是基于二进制的格式在 Web 服务器和 Tomcat 之间传输数据
HTTP 协议:如过 Tomcat 集群的前端是由 Nginx 实现的反向代理,则其是使用 HTTP 或 HTTPS 协议在 Web 服务器和 Tomcat 之间建立通信,此时,Tomcat 就是一个完全功能的 HTTP 服务器,它需要监听在某端口上以接收来自于商前服务器的请求。
其使用 Http 协议转发请求效率不如 AJP 的二进制格式,所以一般推荐 Tomcat 集群的前端为 Apache,况且 Apache 与 Tomcat 都是 ASF(Apache Software Foundation)出品的开源软件。
Tomcat 工作模式
(1). 独立的 Servlet 容器
Tomcat 的默认工作模式,作为独立的 Servlet 容器,是内置在 Web 服务器中的一部分,是指使用基于 JAVA 的 Web 服务器的情形。其他两种方式是 TOMCAT 与其他服务器集成的方式。
(2). 进程内的 Servlet 容器
Servlet 容器作为 Web 服务器的插件和 JAVA 容器的实现。Web 服务器的插件在内部地址空间打开一个 JVM(JAVA VIRTUAL MACHINE)使 JAVA 容器得以在内部运行。如有某个需要调用 Servlet 的请求,插件将取得对此请求的控制并将它传递(使用 JNI)给 JAVA 容器。进程内的容器对于多线程、单进程的服务器非常适合,并且提供了很好的运行速度,只是伸缩性有所不足。
注,JNI 是 JAVA NATIVE INTERFACE 的缩写,是 JAVA 本地调用接口,通过 JNI,JAVA 程序可以和其他语言编写的本地程序进行通信。
(3). 进程外的 Servlet 容器
Servlet 容器运行于 Web 服务器之外的地址空间,并且作为 Web 服务器的插件和 JVM 使用 IPC(如 TCP/IP)进行通信。进程外容器的反应时间不如进程内的容器,但有较好的伸缩性、稳定性等性能。
IPC INTERPROCESS COMMUNICATION(进程间通信)的简写,它是实现进程间通信的一种技术。
6.Tomcat 各组件之间的关系
Tomcat 是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是 CATALINA SERVLET 容器,其他的组件按照一定的格式要求配置在这个顶层容器中。Tomcat 的各个组件是 server.xml 文件中配置的,Tomcat 服务器默认情况下对各种组件都有默认的实现,server.xml 是 Tomcat 的核心配置文件, 描述了 Tomcat 各个组件之间的关系
<Server> 顶层组件,代表一个服务器
<Service> 顶层组件,是 Connector 的集合,一个 service 只能有一个 Engine
<Connectior/> 连接器,多个连接器可以关联到同一个 Engine
<Engine> 容器类组件,为特定的 Service 组件处理所有客户请求,可包含多个 Host
<Host> 容器类组件,为特定的虚拟主机处理所有客户请求
<Context> 容器类组件,为特定的 WEB 应用处理所有客户请求
</Context>
</Host>
</Engine>
</Service>
</Server>
Tomcat 中真正处理客户请求与生成响应的三个组件是 Engine、Host、Context。
如下图为 Tomcat 对用户请求的处理及个组件的关系图:
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
CentOS 6.5 下安装 Tomcat http://www.linuxidc.com/Linux/2015-01/111415.htm
Tomcat 中 session 的管理机制 http://www.linuxidc.com/Linux/2016-09/135072.htm
Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140687.htm