Tomcat有三种工作模式:
Tomcat作为一个独立的web服务器。
在这种模式下,Tomcat在一个Java虚拟机进程中运行,此时客户端直接和tomcat通信。Tomcat可看作是能运行Servlet的独立Web服务器。Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。
Tomcat作为应用程序服务器,与其他web服务器集成,servlet容器运行在web服务器进程内。
在这种模式下,Tomcat分为Web服务器插件和Servlet容器组件两部分。如下图所示,Web服务器插件在其他Web服务器进程的内部地址空间启动一个JVM进程,Servlet容器组件在此JVM进程中运行。如有客户端发出调用Servlet的请求,Web服务器插件获得对此请求的控制并将它转发(使用JNI通信机制)给Servlet容器组件。Tomcat不直接和客户端通信,仅仅为其他Web服务器处理客户端访问Servlet的请求。
进程内的Servlet容器对于单进程、多线程的Web服务器非常合适,可以提供较高的运行速度,但缺乏伸缩性。
Tomcat作为应用程序服务器,与其他web服务器集成,servlet容器运行在web服务器进程外。
在这种模式下,Tomcat同样分为Web服务器插件和Servlet容器组件两部分。如下图所示,Web服务器插件在其他Web服务器的外部地址空间启动一个JVM进程,Servlet容器组件在此JVM进程中运行。如有客户端发出调用Servlet的请求,Web服务器插件获得对此请求的控制并将它转发(使用IPC通信机制)给Servlet容器组件。Tomcat不直接和客户端通信,仅仅为与它集成的其他Web服务器处理客户端访问Servlet的请求。
进程外Servlet容器对客户请求的响应速度不如进程内Servlet容器,但进程外容器具有更好的伸缩性和稳定性。
通过查看Tomcat的启动日志,或者登录Tomcat网页的Server Status页可以查看使用的I/O模型。
Tomcat的I/O模型主要有以下几种:BIO、NIO、NIO2、APR
BIO模型即阻塞式I/O操作,表示Tomcat使用的是 Java 的 IO类库,是传统的Java I/O操作(即java.io包及其子包)。是基于 Java 的HTTP/1.1连接器。
BIO的特点是一个线程处理一个请求,并发量高时,线程数较多,浪费资源。Tomcat7以下版本在默认情况下是以bio模式运行的。一般而言,BIO模型是几种运行模式中性能最低的一种。
在server.xml中配置BIO模型
1 | <Connector port="8080" protocol="HTTP/1.1" |
NIO模型即同步非阻塞I/O操作,表示Tomcat使用的是 Java 的NIO类库,是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。
Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。NIO模型利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。它拥有比传统I/O操作(bio)更好的并发运行性能。
在server.xml中配置NIO模型
1 | <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" |
NIO2模型即异步非阻塞I/O操作,是在Java 7中引入的,构建在NIO的基础之上,引入了异步通道来实现异步IO操作,因此也叫AIO(Asynchronous I/O),提供了包括对AsynchronousChannelGroup的支持、异步文件I/O、自定义文件系统提供程序、套接字选项和更好的性能等。
因此,NIO2相对于NIO来说,提供了更强大和灵活的异步I/O功能,能够更好地满足高性能和并发需求。
在server.xml中配置NIO2模型
1 | <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" |
APR模型即 “Apache可移植运行时(Apache Portable Runtime)” ,是Apache HTTP服务器的支持库。
APR是使用原生C语言编写的非堵塞I/O,利用了操作系统的网络连接功能,速度很快。最初,APR是作为Apache HTTP服务器的一部分而存在的,后来成为一个单独的项目。 Tomcat将以 JNI 的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从操作系统级别来解决异步的IO问题,从而大大地提高Tomcat对静态文件的处理性能。Tomcat apr是在Tomcat上运行高并发应用的首选模式。
在server.xml中配置APR模型
APR模型的配置比较复杂,本次仅介绍yum安装,编译安装的方式可自行谷歌。
1 | # 首先安装三个软件包 |
修改server.xml
文件
1 | <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" |
在几种I/O模型的选择上,BIO性能是最差的这是毋庸置疑的,NIO2模型是基于NIO模型的优化,所以表现是优于NIO模型的。如果是考虑到高并发的情况,显然异步非阻塞I/O模式的NIO2和APR库在性能上更有优势,实际上NIO2的性能表现也和APR不相上下,但是NIO2要求Tomcat的版本要在8.0以上,而APR只需要5.5以上即可,但是APR需要额外配置库环境,相对于内置集成的NIO2来说APR这个操作比较麻烦,两者各有优劣。具体使用哪个还是需要结合实际业务需求和环境进行测试才能决定。
实际场景中,一台服务器可能只需要运行一个web应用,也经常有在一台服务器上运行多个web应用的需求,所以tomcat有几种部署方式:
webapps
目录下,执行启动 Tomcat 的脚本就行了。webapps
目录下,执行启动 Tomcat 的脚本,访问不同项目加上不同的虚拟目录。这种方式要慎用在生产环境,因为重启或挂掉 Tomcat 后会影响另外一个应用的访问。本次介绍多实例多应用的部署方式。
比较简单的方式是复制出多个 Tomcat 目录然后改一下端口,这样做并不能最大化利用服务器资源,也不方便管理。
比较优雅的部署多实例的方式是多个Tomcat实例独立存放各自的web应用相关的目录,同时共享Tomcat的bin目录和lib目录。下面是图解:
上图中的 CATALINA_HOME
指Tomcat安装路径,CATALINA_BASE
指实例所在位置。CATALINA_HOME
路径下只需要包含 bin
和 lib
目录,而 CATALINA_BASE
只存放 conf、webapps、logs
等这些文件,这样部署的好处在于升级方便,配置及安装文件间互不影响,在不影响 Tomcat 实例的前提下,替换掉 CATALINA_HOME
中的安装文件。
另外还需要创建一个tomcat-shell
目录,存放启动脚本和停止脚本
目录结构如下:
1 | [root@web03 app]$ tree -L 2 |
之后替换掉不同tomcat目录中的Server Port
端口(用于监听关闭tomcat的shutdown命令,默认为8005)和Connector Port
端口(用于监听HTTP的请求,默认为8080)即可。
启动脚本start_tomcat.sh
,使用方法:sh start_tomcat.sh 实例路径(比如:/app/tomcat-1)
1 |
|
停止脚本stop_tomcat.sh
,使用方法:sh stop_tomcat.sh 实例路径(比如:/app/tomcat-1)
1 |
|
查看tomcat进程信息
1 | # 系统命令查看tomcat进程信息 |
查看java运行的状态信息(内存,线程,请求等)
可以通过shell脚本根据下述信息获取详细数据,然后进行下一步处理,生成监控信息
1 | jmap -heap [tomcat进程的pid] # jmap是java的高级调试工具,-heap表示堆相关选项,tomcat进程pid通过上一步获取 |
查看Java进程相关命令以及故障分析详解博客:https://blog.csdn.net/weixin_43849415/article/details/110631837
Java性能分析以及shell脚本仓库:https://github.com/oldratlee/useful-scripts
查看日志信息
conf
目录下会存储tomcat的日志信息
catalina.out
会存储所有运行信息,并且切割后文件大小不会删减,是需要优化的内容。具体日期的日志可以查看其切割日志。
localhost_access_log
会存储访问信息,具体日期的日志可以查看其切割日志。
另外管理端的日志信息,也会存储在响应文件中。