博文大纲:
一、Tomcat概述
二、Tomcat组件及其特点
三、安装Tomcat
四、Tomcat中server.xml 文件结构
五、多实例(一台主机运行多个Tomcat)
六、自定义目录
七、使用Tomcat实时监控JVM虚拟机资源使用情况
八、开启JMX远程调试功能
九、配置使用https访问tomcat服务器
十、开启Manager管理页面
十一、开启host-mangent管理页面
十二、分割Tomcat的运行日志
十三、定义Tomcat 404错误返回的页面
十四、Tomcat服务的内存优化
十五、Tomcat线程池的优化
十六、更改Tomcat服务的请求方式
一、Tomcat概述
Tomcat是apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的web应用服务器,属于轻量级的应用服务器,在中小型企业和访问并不是很高的场景很受欢迎,普遍被使用,而且在开发和调试JSP程序的首选!
可以这样认为,当一台服务器部署好Apache服务器后,可以利用Apache服务器响应客户端的静态页面访问请求,而Tomcat是Apache服务器的扩展,当运行Tomcat的时候实际上是作为一个Apache独立的进程单独运行的,Apache服务器为静态页面提供服务,而Tomcat是解析JSP页面和servlet,并且Tomcat也具备静态页面的解析能力,但是跟Apache相比还是有些区别的。
关于Tomcat的内容可不是一两句话就可以说完的,建议访问Tomcat官网详细了解!
二、Tomcat组件及其特点
1.Servlet是什么?
Servlet(Server Applet):是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口;广义的Servlet是指任何实现了这个Servlet接口的类;一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Tomcat处理请求和响应的过程都是由servlet程序来完成的,并且servlet是为解决实现动态页面衍生的内容,与Nginx和Apache想要实现动态页面需要和PHP服务器沟通的过程一样,就可以把servlet看做LAMP或LNMP中的PHP。如图:
Tomcat是web应用服务器,是一个servlet/jsp容器,Tomcat作为servlet容器,负责处理客户端请求,并将servlet的响应传送给客户,而servlet是一种运行在Java语言的服务器上的组件,servlet最常见的用途是扩展Java web服务器功能,提供非常安全的易于使用cgi替代品。
Servlet工作流程:
servlet程序是Web服务器调用的,当Web服务器收到客户端的Servlet访问请求后,将执行以下几个过程:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步;否则,将执行第②步;
②装载并创建该servlet的一个实例对象;
③调用Servlet实例;
④创建一个用于封装HTTP请求的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法;
2.Tomcat处理数据的流程
①客户端通过浏览器发送请求数据;
②Tomcat收到客户端的请求数据,由servlet容器处理并进行解析,并且把客户端的数据请求request改为servlet request交给后端的servlet实例;
③servlet实例收到客户端的请求数据的请求对象,进行处理客户端的请求,处理完成后将数据响应给servlet容器,响应给servlet容器叫做servlet response;
④servlet容器将收到的响应数据交给客户端;
Servlet容器与Servlet实例进行通信时需要使用Java servlet api接口,而这个接口是由开发人员在写代码的时候定义或编写的。
3.Servlet与JSP
jsp作为Servlet技术的扩展,经常会有人将两者搞混,下面简单介绍一下:
Servlet与JSP的区别:
Servlet在Java代码中可以通过HttpServletResponse对象动态输出HTML内容;
JSP在静态HTML内容中嵌入Java代码,然后Java代码在被动态执行后生成HTML页面;
Servlet与JSP各自的特点:
Servlet虽然能很好地组织业务逻辑代码,但在Java源文件中,因为是通过字符串拼接的方式生成HTML内容,这样就很容易导致代码维护困难、可读性较差;
JSP虽然避开了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂得业务逻辑;
4.Tomcat的特点
运行时占用的资源小,扩展性强,支持负载均衡和邮件服务器等开发应用系统常用的功能。
三、安装Tomcat
下载Tomcat所需软件
安装Tomcat需要系统Java环境1.8版本以上,Centos 7默认就已经支持Java环境1.8版本,由于现在大部分使用还是Centos 6的系统,,由于本人采用的Centos 7系统,所以首先需要卸载JDK环境。
[root@localhost ~]# rpm -qa | grep jdk //查询本机默认JDK环境
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
copy-jdk-configs-3.3-2.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
[root@localhost ~]# rpm -e java-1.8.0-openjdk-headless --nodeps
[root@localhost ~]# rpm -e java-1.7.0-openjdk-headless --nodeps
//将原本的jdk-headless包卸载
[root@localhost ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local //将提供的JDK软件包进行解压
[root@localhost ~]# vim /etc/profile //编写系统环境变量,在末尾添加以下内容
export JAVA_HOME=/usr/local/jdk1.8.0_211 //指定Java安装路径
export JRE_HOME=/usr/local/jdk1.8.0_211/jre //Java运行环境
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar //声明Java中的类,类就是一类事务的属性
export PATH=$JAVA_HOME/bin/:$JRE_HOME/bin/:$PATH //将定义的变量添加到系统环境变量中
[root@localhost ~]# source /etc/profile //重新加载系统环境变量文件
[root@localhost ~]# java -version //查询支持的Java版本信息
java version "1.8.0_211" //符合要求
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
[root@localhost ~]# tar zxf apache-tomcat-8.5.35.tar.gz
[root@localhost ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat //将tomcat软件包解压,并移动到相应的位置
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //启动Tomcat服务
[root@localhost ~]# netstat -anpt | grep 8080 //可以看出Tomcat的访问端口是8080
tcp6 0 0 :::8080 :::* LISTEN 2186/java
也可以使用另一种方法,编写好的控制tomcat的脚本在网盘链接中。
[root@localhost ~]# mv tomcat /etc/init.d/
[root@localhost ~]# chmod +x /etc/init.d/tomcat
[root@localhost ~]# /etc/init.d/tomcat start //这样也是可以的
- bin: 存放Tomcat服务有关的命令和脚本文件;
- conf:存放Tomcat服务的配置文件;
- lib:存放Tomcat服务运行时所需的库文件;
- logs:存放Tomcat服务的日志文件;
- temp:存放Tomcat服务产生的临时文件;
- work:Tomcat的工作目录,存放Tomcat运行时的编译配置文件;
- webapps:存放Tomcat服务的网络文件;
常用的配置文件:
- Server.xml:Tomcat服务的主配置文件;
- web.xml:实现主配置文件没有定义到的功能;
- tomcat-users.xml:用来配置管理Tomcat的用户与权限;
四、Tomcat中server.xml 文件结构
Server:代表整个容器,实例的顶层元素,一个配置文件中只能有一个server元素,可以包含多个service。比如:
//表示关闭Tomcat,使用telnet连接8005,输入shutdown指令
Service:提供完整jvm的独立组件,jvm表示Java虚拟机,是一个虚构出来的虚拟机,可以包含一个engine包含多个connector;
//代表接受所有tomcat接受的请求,如果是Service name="apache"则表示接受所有apache转发过来的请求
Connector:接口定义,负责接受客户端的请求,以及向客户端返回响应的结构;
//port:接受数据的端口;protocol:设置http协议;
//Connection Timeout:与客户端的连接超时时间,-1代表不限制客户端的连接时间;
//Redirectport :当客户端请求是https将请求转发到8443去
Engine:处理客户端的请求,可以包含多个hots;
//name:是引擎名称,处理客户的请求默认去寻找localhost
Host:定义的虚拟主机,为特定的虚拟主机处理所有的客户端请求;
Context:运行在虚拟主机中的单个web应用;
具体过程:
①用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
②Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应;
③Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;
④Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理);
⑥path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类;
⑥构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序;
⑦Context把执行完之后的HttpServletResponse对象返回给Host;
⑧Host把HttpServletResponse对象返回给Engine;
⑨Engine把HttpServletResponse对象返回Connector;
⑩Connector把HttpServletResponse对象返回给客户Browser;
五、多实例(一台主机运行多个Tomcat)
说白了,更虚拟主机差不多一个意思。方法如下:
[root@localhost ~]# cp -ra /usr/local/tomcat/ /usr/local/tomcat2
[root@localhost ~]# vim /usr/local/tomcat2/conf/server.xml
22 //将原本的8005改为8006
69 //将原本的8443改为8444
116
//将原本的8009改为8010、8443改为8444
//行首为行号,修改配置文件,以免端口冲突
[root@localhost ~]# /usr/local/tomcat2/bin/startup.sh //启动第二个tomcat实例
[root@localhost ~]# netstat -anpt | grep 8081 //通过配置文件的修改,监听的端口为8081
tcp6 0 0 :::8081 :::* LISTEN 57572/java
六、自定义目录
说白了就是访问指定路径的文件。方法如下:
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //编辑tomcat服务主配置文件
148
150
151
//添加150行和151行即可!
//path:指出访问的路径; docBase:指定文件存放的路径;
//debug:指出debug的等级为输出信息最少,9提供最多信息;
//reloadable:为true时当web.xml文件有改动时将会自动重新加载,不许重启服务;
//crossContext:为true时,表示不同的context共享一个session(会话池)
[root@localhost ~]# mkdir /data/project -p
[root@localhost ~]# echo "hello word
" >> /data/project/index.jsp //创建测试页面
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重启tomcat服务
Tomcat默认禁止目录遍历的,测试如下:
[root@localhost ~]# mv /data/project/index.jsp /data/project/index1.jsp
//改变默认首页文件名
[root@localhost ~]# vim /usr/local/tomcat/conf/web.xml //注意:这个文件不是tomcat主配置文件
112 true //将原本的false改为true
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重新启动tomcat服务
七、使用Tomcat实时监控JVM虚拟机资源使用情况
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //编辑tomcat服务主配置文件
152
//上面已经解释过了,这里就不解释了
[root@localhost ~]# mkdir /data/jiankong
[root@localhost ~]# vim /data/jiankong/index.jsp //在指定目录下编写监控脚本
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :
");
out.println("Max memory:"+mm+"MB"+"
");
out.println("Total memory: "+tm+"MB"+"
");
out.println("Free memory: "+fm+"MB"+"
");
out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"
");
%>
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重启tomcat服务
八、开启JMX远程调试功能
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh //编写这个脚本
307CATALINA_OPTS=" $CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
308
309 # ----- Execute The Requested Command ----------------------------------------- //填写的内容必须在这行上面
//port:监听的端口; ssl:关闭ssl安全传输 authenticate:开启用户认证
[root@localhost ~]# cd //usr/local/jdk1.8.0_211/jre/lib/management/
[root@localhost management]# cp jmxremote.password.template jmxremote.password
[root@localhost management]# vim jmxremote.password //定义用户的文件并在文件末尾添加以下内容
64 lzj 123456 //64为行号,定义用户为lzj,密码为123456,使用“wq!”强制保存退出
[root@localhost management]# vim jmxremote.access //定义用户权限的文件
77 lzj readwrite \ //将原本的用户定义为刚才定义的用户lzj
78 create javax.management.monitor.*,javax.management.timer.* \
79 unregister
[root@localhost management]# chmod 600 jmxremote.access
[root@localhost management]# chmod 600 jmxremote.password //更改这两个配置文件的权限为600
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重启tomcat服务
[root@localhost ~]# netstat -anpt | grep 8888
tcp6 0 0 :::8888 :::* LISTEN 58760/java
//确认刚才定义的端口8888在监听
由于其为图像化界面,所以需要在桌面环境下执行以下命令:
[root@localhost ~]# jconsole //调出图形化终端
九、配置使用https访问tomcat服务器
[root@localhost ~]# keytool -genkey -v -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/conf/tomcat.keystore -validity 36500
//alias:别名,这里设置为tomcat;
//keyalg:证书算法,RSA;
//validity:证书有效期,单位为天
//keystore:指定证书存放路径,可以自定义
输入密钥库口令: //实验环境,以下内容随意输入
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: lv
您的组织单位名称是什么?
[Unknown]: lv
您的组织名称是什么?
[Unknown]: lv\
您所在的城市或区域名称是什么?
[Unknown]: lv
您所在的省/市/自治区名称是什么?
[Unknown]: lv
该单位的双字母国家/地区代码是什么?
[Unknown]: lv
CN=lv, OU=lv, O="lv\\", L=lv, ST=lv, C=lv是否正确?
[否]: y
正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 36,500 天):
CN=lv, OU=lv, O="lv\\", L=lv, ST=lv, C=lv
输入 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
[正在存储/usr/local/tomcat/conf/tomcat.keystore]
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /usr/local/tomcat/conf/tomcat.keystore -destkeystore /usr/local/tomcat/conf/tomcat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //内容可以自行编写,也可修改原本的配置,注意将其注释去掉
87 //指定生成证书所输入的密码
91
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重启tomcat服务
十、开启Manager管理页面
在访问Tomcat的默认首页界面时,有一个“Manager App”,如图:
接下来通过配置开启Tomcat的manager管理页面,方法如下:
[root@localhost ~]# vim /usr/local/tomcat/conf/tomcat-users.xml
45
46 //自定义用户名和密码
47 //注意要写在这个闭合中
[root@localhost ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
20 allow="192.168.1.253|192.168.1.8|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
//将需要访问的IP的地址添加到“allow=”后,以“|”进行分隔
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重新启动Tomcat服务
[root@localhost ~]# echo "hello word" >> index.jsp
[root@localhost ~]# jar -vcf index.war index.jsp //做成war包,并命名为index.war
十一、开启host-manager管理页面
修改服务器的配置文件:
[root@localhost ~]# vim /usr/local/tomcat/conf/tomcat-users.xml
45
46
47 //在末行的闭合标签中,添加以上内容,用户名和密码定义
[root@localhost ~]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
19 //添加允许访问的IP地址
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh //重启服务
十二、分割Tomcat的运行日志
对Tomcat进行日志跟Apache做日志分割差不多,不过Tomcat本身并没有日志分割工具,需要使用第三方日志分割工具——cronolog日志分割工具
操作如下:
[root@localhost ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/cronolog-1.6.2/
[root@localhost cronolog-1.6.2]# ./configure && make && make install //编译安装cronolog工具
[root@localhost cronolog-1.6.2]# which cronolog //查询到该命令的绝对路径
/usr/local/sbin/cronolog
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh
471 org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog /usr/local/tomcat/logs/test.%Y-%m-%d.out >> /dev/null &
//将原本的内容修改为以上内容
472
473 #>> "$CATALINA_OUT" 2>&1 "&" //将这行内容进行注释
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
[root@localhost ~]# ll /usr/local/tomcat/logs/
总用量 380
-rw-r----- 1 root root 159033 12月 8 16:51 catalina.2019-12-08.log
-rw-r----- 1 root root 140209 12月 8 16:51 catalina.out
-rw-r----- 1 root root 162 12月 8 15:10 host-manager.2019-12-08.log
-rw-r----- 1 root root 8722 12月 8 16:51 localhost.2019-12-08.log
-rw-r----- 1 root root 6071 12月 8 15:10 localhost_access_log.2019-12-08.txt
-rw-r----- 1 root root 1719 12月 8 14:41 manager.2019-12-08.log
-rw-r----- 1 root root 18824 12月 8 16:51 test.2019-12-08.out //确认这个文件存在
十三、定义Tomcat 404错误返回的页面
默认情况下,客户端访问Tomcat服务器上一个不存在的目录时,就会提示404错误,而且会将我们Tomcat的版本信息显示出来,这是非常危险的。默认的404返回的错误页面如下:
解决的方法也很简单,就是将404状态码进行重定向,以便我们自定义返回的页面信息,方法如下:
[root@localhost ~]# echo "Access Error ..." >> /usr/local/tomcat/webapps/ROOT/error.jsp
//自定义错误页面内容
[root@localhost ~]# vim /usr/local/tomcat/conf/web.xml
22 version="3.1"> //在这行内容的下面添加以下内容
23
24 404
25 /error.jsp
26
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
十四、Tomcat服务的内存优化
方法如下:
[root@localhost ~]# vim /usr/local/tomcat/bin/catalina.sh
1 #!/bin/sh //在第一行下面添加以下内容
2 JAVA_OPTS="-Dfile.encoding=UTF-8
3 -server
4 -Xms1023M
5 -Xmx1024M
6 -XX:NewSize=512M
7 -XX:MaxNewSize=1020M
8 -XX:NewRatio=2
9 -XX:ParallelGCThreads=15
10 -XX:+DisableExplicitGC"
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
//重启Tomcat服务之后,可以实时监控JVM虚拟机资源进行验证
如果使用的是Tomcat8.0之前的版本,还需添加两个配置项,8.0以后的版本就被移除了:
-XX:PermSize=256M
-XX:MaxPermSize=356M
配置文件中添加的各个配置项解释如下:
- -Xms:表示 JVM初始内存大小,也可以说是Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64;
- -Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%;
- -Xmn:设置JVM最小内存(128-256就够了,一般不设置);
- -XX:NewSize:设置新生代内存大小。 新生代,对象新创建的时候分配的内存空间,老生代在垃圾回收器回收过后该对象依然没有被回收,该对象就会移动到老生代;
- -XX:PermSize:设置持久代内存大小,用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应 用可能动态生成或者调用一些class,持久带也称为方法区,方法区存储每一个java类的结构信息:比如运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容以及类、实例、接口初始化时需要使用到的特殊方法等数据,JDK8中已经把持久代(PermGen Space) 干掉了,取而代之的元空间(Metaspace)。Metaspace占用的是本地内存,不再占用虚拟机内存;
- -XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代;
- -XX:NewRatio:改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8);
- -XX:ParallelGCThreads 可用来增加并行度,需要多cpu;
- -XX:+DisableExplicitGC:关闭System.gc(),简单理解就是关闭java中的内存回收机制;
十五、Tomcat线程池的优化
方法如下:
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
53 //在这行内容下添加以下内容
54
70
116
Excutor重要参数说明:
- name:共享线程池的名字,这是connector为了共享线程池要引用的名字,该名称必须唯一
- namePrefix:在JVM上,每运行线程都可以有一个name字符串,这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀后面,默认值为tomcat-exec-
- maxThreads:该线程池可以容纳的最大线程数,默认200
- minSpareThreads:Tomcat应该始终打开的最小不活跃线程数,默认25
Connector参数说明:- executor:表示使用参数值对应的线程池。
AJP是为Tomcat与HTTP服务器之间通信而定制的协议,能够提供较高的通信速度与效率。如果Tomcat前端放的Apache的时候,会使用到这个AJP连接器。
十六、更改Tomcat服务的请求方式
Tomcat支持的三种请求方式:
- BIO:阻塞式I/O操作,Tomcat7以下版本默认情况下是以bio模式运行的,每个请求都要创建一个线程来处理,线程开销比较大,不适用高并发的场景,性能也最低;
- NIO:基于缓冲区,能提供非阻塞I/O操作,和传统的BIO相比,具备更好的并发性能;
- APR(Apache portable run-time libraries):简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和相应性能,也是Tomcat运行高并发的首选模式;
APR提供的主要功能模块包括:内存分配及内存池、原子操作、文件I/O、锁、内存映射、哈希表、网络I/O、轮询、进程及线程操作等等,通过采用APR,Tomcat可以获得高度可扩展性以及优越的性能,并且可以更好的与本地服务器技术集成,从而可以使Tomcat作为一款通用的Web服务器使用,而不仅仅作为轻量级应用服务器。在这种情况下,Java将不再是一门侧重于后端的编程语言,也可以更多的用于成熟的Web服务器平台。
1.更改其请求方式为NIO(Tomcat8以上版本,默认使用的就是NIO模式)
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh
查看其“catalina.out”日志,有以下字样,则表示是在nio接收请求处理方式,如下(由于上面对Tomcat日志进行了分割操作,所以需要查看test.2019-12-08.out日志文件):
2.更该其请求方式为APR方式
启用这种凡是稍微麻烦一些,需要安装一些依赖(本人使用的CentOS 7.3版本)。
下载apr软件包、apr-util软件包
[root@localhost ~]#yum -y install apr-devel openssl-devel gcc make //安装所需依赖
[root@localhost ~]# tar zxf apr-1.5.2.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/apr-1.5.2/
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr && make && make install
//编译安装apr
[root@localhost ~]# tar zxf apr-util-1.5.4.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/apr-util-1.5.4/
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
//编译安装apr-util
[root@localhost apr-util-1.5.4]# cd /usr/local/tomcat/bin/
[root@localhost bin]# tar zxf tomcat-native.tar.gz
[root@localhost bin]# cd tomcat-native-1.2.18-src/native/
[root@localhost native]# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/jdk1.8.0_211 && make && make install
//编译安装tomcat自带的tomcat-native软件包
[root@localhost ~]# vim /etc/profile //编写环境变量,添加以下内容
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
[root@localhost ~]# source /etc/profile
[root@localhost ~]# cd /usr/local/tomcat/
[root@localhost tomcat]# openssl genrsa -out ca.key 4096 //生成所需秘钥
[root@localhost tomcat]# openssl req -new -x509 -days 7304 -key ca.key -out ca.crt
//通过所需秘钥生成数字证书
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml //编写tomcat主配置文件
104
106 //升级为http 2.0协议
107
108
111
112
[root@localhost logs]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost logs]# /usr/local/tomcat/bin/startup.sh //重新启动tomcat服务
[root@localhost ~]# netstat -anpt | grep 443 //确认443端口在监听
tcp6 0 0 :::443 :::* LISTEN 17206/java
[root@localhost ~]# cat /usr/local/tomcat/logs/test.2019-12-09.out | grep apr
//根据查看tomat的日志来了解tomcat的工作模式
关于BIO模式,现在已经很少使用了,所以这里就不介绍了!
———————— 本文至此结束,感谢阅读 ————————