浅谈Tomcat服务器安装及优化

系统运维

博文大纲:
一、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                    //这样也是可以的

客户端访问测试:

Tomcat服务安装目录中的目录介绍:

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。比如:

<Server port=8005 shutdown=SHUTDOWN>
//表示关闭Tomcat,使用telnet连接8005,输入shutdown指令

Service:提供完整jvm的独立组件,jvm表示Java虚拟机,是一个虚构出来的虚拟机,可以包含一个engine包含多个connector;

  <Service name=Catalina>
//代表接受所有tomcat接受的请求,如果是Service name=apache则表示接受所有apache转发过来的请求

Connector:接口定义,负责接受客户端的请求,以及向客户端返回响应的结构;

    <Connector port=8080 protocol=HTTP/1.1
               connectionTimeout=20000
               redirectPort=8443 />
//port:接受数据的端口;protocol:设置http协议;
//Connection Timeout:与客户端的连接超时时间,-1代表不限制客户端的连接时间;
//Redirectport :当客户端请求是https将请求转发到8443去

Engine:处理客户端的请求,可以包含多个hots;

    <Engine name=Catalina defaultHost=localhost>
//name:是引擎名称,处理客户的请求默认去寻找localhost

Host:定义的虚拟主机,为特定的虚拟主机处理所有的客户端请求;

      <Host name=localhost  appBase=webapps
            unpackWARs=true autoDeploy=true>

Context:运行在虚拟主机中的单个web应用;

Tomcat处理http请求过程,如图:

具体过程:
①用户点击网页内容,请求被发送到本机端口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 <Server port=8006 shutdown=SHUTDOWN>                 //将原本的8005改为8006
 69     <Connector port=8081 protocol=HTTP/1.1            //将原本的808端口改为8081
 70                connectionTimeout=20000
 71                redirectPort=8444 />                         //将原本的8443改为8444
116     <Connector port=8010 protocol=AJP/1.3 redirectPort=8444 />
//将原本的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       <Host name=localhost  appBase=webapps
149             unpackWARs=true autoDeploy=true>
150         <Context path = /shop docBase = /data/project debug = 0 reloadable  = false crossContext = true>                  
151         </Context>            
//添加150行和151行即可!
//path:指出访问的路径;          docBase:指定文件存放的路径;
//debug:指出debug的等级为输出信息最少,9提供最多信息;
//reloadable:为true时当web.xml文件有改动时将会自动重新加载,不许重启服务;
//crossContext:为true时,表示不同的context共享一个session(会话池)
[root@localhost ~]# mkdir /data/project -p
[root@localhost ~]# echo <h2>hello word</h2> >> /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             <param-value>true</param-value>               //将原本的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         <Context path=/jiankong docBase=/data/jiankong debug=0 reloadable=    false crossContext=true/>
//上面已经解释过了,这里就不解释了
[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 :<br>);
out.println(Max memory:+mm+MB+<br>);
out.println(Total memory: +tm+MB+<br>);
out.println(Free memory: +fm+MB+<br>);
out.println(Available memmory can be used is :+(mm+fm-tm)+MB+<br>);
    %>
[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
输入 <tomcat> 的密钥口令
    (如果和密钥库口令相同, 按回车):  
再次输入新口令: 
[正在存储/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 <Connector port=443   protocol=org.apache.coyote.http11.Http11NioProtocol                   //将原本的8443改为443
 88                maxThreads=150 SSLEnabled=true
 89                 keystoreFile=/usr/local/tomcat/conf/tomcat.keystore                   //指定证书存放路径
 90                 keystorePass=123456>                      //指定生成证书所输入的密码
 91     </Connector>

[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 <role rolename=manager-gui/>
 46 <user username=lzj password=123456 roles=manager-gui/>        //自定义用户名和密码
 47 </tomcat-users>                        //注意要写在这个闭合中
[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服务

客户端访问测试:

准备war包添加到自定义的目录中!

[root@localhost ~]# echo hello word >> index.jsp 
[root@localhost ~]# jar -vcf index.war index.jsp              //做成war包,并命名为index.war

在web图形页面进行添加war包:

十一、开启host-manager管理页面

方法跟开启manger管理页面差不多,方法如下:

修改服务器的配置文件:

[root@localhost ~]# vim /usr/local/tomcat/conf/tomcat-users.xml 
 45 <role rolename=admin-gui/>
 46 <user username=lzj password=123456 roles=admin-gui/>
 47 </tomcat-users>                 //在末行的闭合标签中,添加以上内容,用户名和密码定义
[root@localhost ~]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
 19   <Valve className=org.apache.catalina.valves.RemoteAddrValve
 20          allow=192.168.1.253|192.168.1.8|127\\.\\d+\\.\\d+\\.\\d+|::1|0:0:0:0:0:0:0:1     />                       //添加允许访问的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 <error-page>
  24 <error-code>404</error-code>
  25 <location>/error.jsp</location>
  26 </error-page>
[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   <Service name=Catalina>             //在这行内容下添加以下内容
 54         <Executor name=tomcatThreadPool namePrefix=catalina-exec- maxThreads=    500 minSpareThread=4/>

70     <Connector port=8080 protocol=HTTP/1.1
71                executor=tomcatThreadPool            //调用刚才定义的规则,需手动添加
72                connectionTimeout=20000
73                redirectPort=8443 />

116     <!--
117     <Connector port=8009 protocol=AJP/1.3        redirectPort=8443 />                    //关闭AJPI接口原本存在,将其注释即可!
118     -->

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 
    <Connector port=8080 protocol=org.apache.coyote.http11.Http11NioProtocol              //修改原本的protocol内容
               executor=tomcatThreadPool        //添加这行内容
               connectionTimeout=20000
               redirectPort=8443 />
[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     <Connector port=443 protocol=org.apache.coyote.http11.Http11AprProtocol            //更改端口为443
105                maxThreads=150 SSLEnabled=true >
106         <UpgradeProtocol className=org.apache.coyote.http2.Http2Protocol />        //升级为http 2.0协议
107         <SSLHostConfig>
108             <Certificate certificateKeyFile=/usr/local/tomcat/ca.key        //更改秘钥存放路径
109                          certificateFile=/usr/local/tomcat/ca.crt               //更改证书存放路径
110                          type=RSA />
111         </SSLHostConfig>
112     </Connector>
[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    

客户端使用https协议进行访问,如图:

[root@localhost ~]# cat /usr/local/tomcat/logs/test.2019-12-09.out | grep apr
//根据查看tomat的日志来了解tomcat的工作模式

如图:

关于BIO模式,现在已经很少使用了,所以这里就不介绍了!

———————— 本文至此结束,感谢阅读 ————————

新网虚拟主机

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注