Tomcat个人笔记
一、Tomcat简介概述
1. Tomcat 历史由来
- Tomcat 最初由 Sun 公司的软件架构师 James Duncan Davidson 开发,名称为 “JavaWebServer”。
- 1999年,在 Davidson 的帮助下,该项目于1999年 于 apache软件基金会旗下的 JServ 项目合并,并发布第一个版本(3.x),即是现在的Tomcat,该版本实现了 Servlet2.2 和 JSP 1.1规范。
- 2001年,Tomcat 发布了4.0版本,作为里程碑式的版本,Tomcat 完全重新设计了其架构,并实现了Servlet 2.3 和 JSP1.2 规范。
- 目前Tomcat已经更新到9.0.x版本,但是目前企业中的Tomcat服务器 ,主流版本还是 7.x 和8.x 。
2. Tomcat基本简介
Tomcat是由java语言开发的,只要遇见java语言开发的软件包,就一定要提前安装JDK。因为java语言号称是一次编译,到处运行。(跨平台运行,且不会出现问题)
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。说白了用来解析 jsp 网页的
与Tomcat功能类似的web软件
1
2
3
4
5
6
7 webLogic: oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
webSphere: IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费。
JBOSS: JBOSS公司的,大型的JavaE服务器,支持所有的JavaEE规范,收费。
Tomcat: Apache基金组织,中小型的JavaEE服务器,支持少量的JavaEE规范servlet/jsp,开源。Tomcat与其他开源的Web软件有什么不同点
1
2
3
4
5 Apache #默认只能解析html的页面
Nginx #默认只能解析html的页面
Tomcat #默认也能解析html的页面,但远远不如以上两者,他主要的作用是能够解析.jsp页面,在公司,很多人把它称之为中间件。
二、Tomcat架构原理
1. HTTP工作原理
2. Tomcat基本架构图
3. Tomcat各目录及文件说明
整体目录 | 目录下文件 | 简单说明 |
---|---|---|
bin | / | 存放 Tomcat的启动、停止等批处理脚本和Shell脚本 |
startup. bat | 用于在 Windows下启动 Tomcat | |
startup. sh | 用于在 Linux下启动 Tomcat | |
shutdown. bat | 用于在 Windows下停止 Tomcat | |
shutdown. sh | 用于在 Linux下停止 Tomcat | |
conf | / | 用于存放 Tomcat的相关配置文件 |
Catalina | 用于存储针对每个虚拟机的 Context 配置目录 | |
context.xml | 用于定义所有Web应用均需要加载的 Context 配置,如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖。 | |
catalina.properties | Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数 | |
catalina.policy | 当 Tomcat在安全模式下运行时,此文件为默认的安全策略配置 | |
logging.properties | Tomcat日志配置文件,可通过该文件修改 Tomcat日志级别以及日志路径等 | |
server.xml | Tomcat服务器核心配置文件,用于配置 Tomcat的链接器、监听端口、处理请求的虚拟主机等。 | |
tomcat-users.xml | 用于定义 Tomcat默认用户及角色映射信息,Tomcat的 Manager模块即用该文件中定义的用户进行安全认证。 | |
web.xml | Tomcat中所有应用默认的部署描述文件,主要定义了基础 Servlet 和MIME 映射。 |
|
logs | / | Tomcat默认的日志存放路径 |
catalina.out | Tomcat的日志输出,只要Tomcat服务出问题,就看他 | |
localhost_access.log.txt | 客户端访问 Tomcat 服务的访问日志记录 | |
localhost.log | 程序(代码)异常没有被捕获的时候抛出了的地方 | |
manager.log | webapps/manager项目生成的日志 | |
host-manager.log | webapps/host-manager项目生成的日志 | |
webapps | / | Tomcat默认的Web应用部署目录 |
lib | / | Tomcat服务器依赖库目录,包含 Tomcat服务器运行环境依赖 jar包 |
temp | / | 存放tomcat在运行过程中产生的临时文件 |
work | / | 存放Web应用JSP代码生成和编译后产生的class文件目录 |
三、Tomcat部署
1. 安装JDK
- 官方下载
- 个人网站下载
- Centos7安装Tomcat
1 | [root@tomcat ~]# tar xf jdk-8u181-linux-x64.tar.gz |
2. 安装 Tomcat
官方下载
个人网站下载
1 | [root@tomcat ~]# tar xf apache-tomcat-8.5.32.tar.gz |
- Tomcat的三个端口及作用
- 8005:这个端口负责 监听 关闭 Tomcat的请求
- 8009:负责与其他web服务器进行通信的接口,用的是AJP协议
- 8080:负责接收客户端的请求,用的是HTTP协议
- 访问Tomcat测试页面
默认是不让访问的服务器状态的
怎么解决这个问题?配置tomcat管理员账户
- 如果需要登录系统,必须配置 tomcat用户,在安装完 Tomcat后,进行如下操作
1 | #添加管理页面的用户认证,帐户名为tomcat,密码为123123 |
再来访问服务器状态
四、server.xml配置文件详解(重点)
1. 一个整体的 server.xml配置实例
1 |
|
2. server.xml文件的结构 和 元素
2.1. server.xml的整体结构如下:
1 | <Server> |
上面只给出了Tomcat的核心组件,除了核心组件外,Tomcat还有一些其他组件,下面介绍组件的分类。
2.2. server.xml文件中的元素可以分四类
顶层元素:<server> 和 </service>
- <server> :元素是整个配置文件的根元素
- </service> :元素则代表一个Engine元素以及一组与之相连的Connector元素
连接器:<Connector />
- <Connector />:代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
容器:<Engine><Host></Engine>
- 容器的功能是处理Connector接收进来的请求,并产生相应的响应。而Engine、Host 和 Context 都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。
- 一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
内嵌组件:可以内嵌到容器中的组件。
- 实际上, Server 、Service 、Connector 、Engine 、Host 和Context 是最重要的最核心的Tomcat 组件,其他组件都可以归为内嵌组件。
2.3. server.xml元素
1. <Server>元素
- Server 元素在最顶层,代表整个 Tomcat 容器,因此它必须是server.xml中唯一一个最外层的元素。 一个 Server 元素中可以有一个或多个Service 元素。
- Server 的主要任务,就是提供一个接口让客户端能够访问到这个 Service 集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
1 | <Server port="8005" shutdown="SHUTDOWN"> |
- 参数作用:
- 端口号8005:用来 监听 关闭 Tomcat服务的
- port:指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令,该属性必须设置。
- shutdown:指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串,该属性必须设置。
2. <service> 元素
- 包含一个<Engine>元素,以及一个或多个<Connector>元素,这些<Connector>元素共享同一个<Engine>`元素。
- Service 的作用是在Connector 和 Engine` 外面包了一层,把它们组装在一起,对外提供服务。
- 一个 Service 可以包含多个 Connector,但是只能包含一个 Engine;其中 Connector 的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。
3. <Connector>元素
- 接收客户端连接请求,创建Request 和 Response 对象用于和请求端交换数据,然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine,通过配置Connector,可以控制请求Service的协议及端口号。
1 | <Connector executor="tomcatThreadPool" |
- 参数作用
- 端口号8080:访问浏览器页面的时候使用8080端口;用的是HTTP协议
- 端口号8009:连接Web服务(httpd、nginx)的时候使用8009端口;用的是AJP协议
- port:服务端监听的端口号,即客户请求的端口号
- protocol:规定了请求协议
- redirectPort:表示当请求是https时,重定向至端口号为8443的Connector
- connectionTimeout:表示连接的超时时间,单位毫秒
- minSpareThreads:表示Connector最小等待客户请求的线程数,每个请求由一个线程负责,默认10。
- maxThreads:表示此连接器要创建的请求处理线程的最大数量,能处理的最大并发请求数,默认200。
- maxConnections:表示服务器在任何给定时间接受和处理的最大连接数。当达到这个数字时,客户端请求会被放到请求队列,默认最大队列数为acceptCount参数值,BIO模式下默认为maxThreads,NIO模式下默认10000。
- acceptCount:maxConnections达到最大值即所有请求线程正在使用时,传入连接请求的最大队列长度, 当队列满时收到的任何请求都将被拒绝, 默认值为100。
- maxHeaderCount:允许的请求中的最大header数。 包含比指定限制更多的header的请求将被拒绝。 小于0表示无限制,默认值100。
4. <Engine>元素
- Engine组件在Service组件中有且只有一个,Engine是Service组件中的请求处理组件,Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
- Engine、Host 和 Context 都是容器,但它们不是平行的关系,而是父子关系:Engine 包含 Host,Host 包含 Context。
1 | <Engine name="Catalina" defaultHost="localhost"> |
- 参数作用
- name:属性用于日志和错误信息,在整个Server中应该唯一。
- defaultHost:属性指定了默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理,因此defaultHost的值,必须与Engine中的一个Host组件的name属性值匹配。
5. Host元素
- Engine元素至少包含一个或多个Host元素,每个Host元素定义了一个虚拟主机,它可以包含一个或多个Web应用,其中一个Host的name必须与Engine组件的defaultHost属性相匹配。
- 另在<Host>元素中可以包含如下的子元素: <Logger>,<Realm>,<Valve>,<Context>`。
1 | <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> |
- 参数作用
- name:虚拟主机的名字。
- appBase: 指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于
的相对目录, 如果此项没有设定,默认值为 /webapps。 - unpackWARs: 如果此项设为true,表示将把Web应用的war文件先解压为开放目录结构后再运行,如果设为false,将直接运行war文件。
- autoDeploy:如果此项设为true,表示当Tomcat服务器处于运行状态时,能够监测appBase下的文件,如果有新的Web应用加入进来,会自动发布这个Web应用。
6. Context 元素
- 每个Context元素代表运行在虚拟主机上的单个Web应用,一个<Host>元素中可以包含多个<Context>`元素
1 | <Context path="/xxx" docBase="/xxx/xxx/app1.war" reloadable="true"></Context> |
- 参数作用
- path:指定访问该Web应用的URL入口。
- docBase:指定Web应用的文件路径,可以为绝对路径,也可以为相对于Host的appBase属性的相对路径,如果Web应用采用开放目录结构,那就指定Web应用的根目录;如果Web应用是个WAR文件,那就指定WAR文件的路径。
- reloadable:如果这个属性设为true,Tomcat服务器在运行状态下会监视在WEB-INF/class和WEB-INF/lib目录下CLASS文件的改动,如果检测到有calss文件被更新,服务器会自动重新加载Web应用。
五、部署项目
1. 安装Mariadb数据库
1 | [root@tomcat ~]# yum -y install mariadb-server mysql |
2. 导入 smbms_db.sql 数据库 并授权
1 | [root@tomcat ~]# mysql -uroot -p123123 < smbms_db.sql |
3. 部署超市项目网页
1 | #将其超市项目移动至网页存放目录 |
4. 重启Tomcat 并访问网页
1 | [root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh |
六、Tomcat的常见配置
1. 修改Tomcat默认网页位置
- 自定义.jsp页面
1 | [root@tomcat ~]# mkdir -p /usr/local/tomcat/web1 |
- 修改server.xml配置文件 并 重启Tomcat
1 | [root@localhost ~]# vim /usr/local/tomcat/conf/server.xml |
- 访问http://www.lemon.com:8080/
- 注:需要添加host解析
2. 配置基于域名的虚拟主机
- 自定义.jsp页面
1 | [root@tomcat ~]# mkdir -p /usr/local/tomcat/web2 |
- 修改server.xml配置文件 并 重启Tomcat
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml |
3. 配置Tomcat双实例
直接在添加一对且 将其名字、端口号改掉
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml |
- 查看Tomcat访问日志
4. 定义默认页面(不建议修改)
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml |
5. 设置页面超时时间(按情况而定)
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml |
6. 禁止列出目录(不建议更改)
- 默认就是禁止的,如果不想禁止,将false改成true就行。但是最好不要改!!!
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/web.xml |
七、Tomcat 的三种工作模式
1. 同步、异步、阻塞、非阻塞的理念
同步:自己亲自出马持银行卡到银行排队取钱。事必须一件一件事做,等前一件事情做完了才能做下一件事。
异步:异步的概念和同步相对。委托一小弟拿银行卡到银行取钱,然后给你。
阻塞:ATM排队取款,你只能等待。
非阻塞:柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去。
总结:同步和异步是一个过程,阻塞和非阻塞是线程的一种状态。
2. Tomcat的三种模式
(1)bio:同步阻塞
即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源。
使用方式:现在通常不使用
(2)nio:同步非阻塞
Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。利用 Java 的异步请求 IO 处理,可以通过少量的线程处理大量的请求。
使用方式:tomcat默认模式
(3)apr:异步非阻塞
Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。Tomcat apr也是在Tomcat上运行高并发应用的首选模式。
使用方式:在server.xml中更改使用的协议,更加详细的说明可以之间看tomcat的文档。
3. BIO、NIO、AIO适用场景分析
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
4. Tomcat三种模式性能比较
八、Tomcat优化
对于Tomcat软件的优化,主要是从2个方面入手
- Tomcat自身的配置文件调优
- Tomcat所运行的 Jvm 虚拟机的调优;针对JVM的调优主要有两个方面:内存调优和垃圾回收策略调优。
服务器资源
- CPU
- 内存
- 硬盘
注:最好调优完成后测试以下,看看性能方面是否提升
1. Tomcat自身的配置文件调优
1.1. 禁用AJP协议连接器节省系统资源
为什么要禁言AJP连接器?
- 因为项目中一般使用Nginx + tomcat的架构, 所以用不着AJP协议,一般我们可以把AJP连接器禁用,这样有利于提高Tomcat的性能。
怎么禁用?
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml |
- 重启 tomcat,查看效果。可以看到 AJP服务已经不存在了
1.2. 配置网页传输压缩
- 如果有apache或nginx的服务做代理,tomcat则没必要在配置网页传输压缩
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml |
1.3. Tomcat修改为 apr工作模式
怎么查看当前tomcat的工作模式?
修改apr工作模式
- 首先需要安装APR的三个依赖 http://apr.apache.org/download.cgi
安装这些APR包
1 | 1、安装相关环境包 |
- 查看是否修改
1.4. Tomcat 修改 nio工作模式
- 修改nio工作模式
1 | [root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml |
- 查看是否修改
2. Tomcat所运行的 Jvm 的调优。
2.1. Tomcat内存调优
找到catalina.sh文件中JAVA_OPTS变量即可,因为后面的启动参数会把JAVA_OPTS作为JVM的启动参数来处理
内存调优这块呢,无非就是通过修改它们各自的内存空间的大小,使应用能够更加合理的运用:
注意:不是JVM内存设置越大越好,具体还是根据项目对象实际占用内存大小而定,可以通过Java自带的分析工具来查看。如果设置过大,会增加回收时间,从而增加暂停应用时间。
内存结构图
1 | [root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh |
- 参数说明:
1 | -Dfile.encoding 默认文件编码 |
AB压力测试
作用:Apache 附带了压力测试工具 ab,非常容易使用,并且完全可以模拟各种条件对 Web 服务器发起测试请求。在进行性能调整优化过程中,可用 ab 压力测试工具进行优化效果的测试。
语法:ab -n 请求数总和 -c 并发用户数 网站网址
重要输出参数:
- Concurrency Level 并发的用户数
- Time taken for tests 表示所有请求被处理完成所花费的总时间 越少越好
- Complete requests 总请求数
- Failed requests 表示失败的请求数量 越少越好
- Requests per second 吞吐率,每秒能处理多少个并发 越多越好
- Transfer rate 每秒处理字节数的大小 越多越好
未加入配之前压力测试结果
1 [root@tomcat ~]# ab -n 500000 -c 1000 http://192.168.2.1:8080/
第一次测试结果
- Time taken for tests: 29.393 seconds 越少越好
- Requests per second: 17010.63 [#/sec] (mean) 越多越好
- Transfer rate: 188412.68 [Kbytes/sec] received 越多越好
第二次测试结果
- Time taken for tests: 24.984 seconds
- Requests per second: 20013.16 [#/sec] (mean)
- Transfer rate: 221669.22 [Kbytes/sec] received
加入配之前压力测试结果
1
2
3
4
5
6
7 [root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh
111 JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m"
[root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# ab -n 500000 -c 1000 http://192.168.2.1:8080/
第一次测试结果
- Time taken for tests: 26.420 seconds
- Requests per second: 18924.84 [#/sec] (mean)
- Transfer rate: 210039.88 [Kbytes/sec] received
第二次测试结果
- Time taken for tests: 21.101 seconds
- Requests per second: 23695.83 [#/sec] (mean)
- Transfer rate: 262991.32 [Kbytes/sec] received
2.2. 垃圾回收策略调优
- 找到Tomcat根目录下的bin目录,也是设置catalina.sh文件中JAVA_OPTS变量即可。我们都知道Java虚拟机都有默认的垃圾回收机制,但是不同的垃圾回收机制的效率是不同的,正是因为这点我们才经常对Java虚拟机的垃圾回收策略进行相应的调整。下面也是通过我的一些需求来配置的垃圾回收策略:
1 | [root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh |
- Java虚拟机的垃圾回收策略一般分为:串行收集器、并行收集器和并发收集器
1 | ## 串行收集器: |
- 以上的各种GC机制是需要组合使用的,制定方式有下表所示