千家信息网

浅谈Tomcat服务器安装及优化

发表于:2024-11-21 作者:千家信息网编辑
千家信息网最后更新 2024年11月21日,博文大纲:一、Tomcat概述二、Tomcat组件及其特点三、安装Tomcat四、Tomcat中server.xml 文件结构五、多实例(一台主机运行多个Tomcat)六、自定义目录七、使用Tomca
千家信息网最后更新 2024年11月21日浅谈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_64copy-jdk-configs-3.3-2.el7.noarchjava-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64java-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的访问端口是8080tcp6       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。比如:

//表示关闭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应用;

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                  //将原本的8005改为8006 69                              //将原本的8443改为8444116     //将原本的8009改为8010、8443改为8444//行首为行号,修改配置文件,以免端口冲突 [root@localhost ~]# /usr/local/tomcat2/bin/startup.sh          //启动第二个tomcat实例 [root@localhost ~]# netstat -anpt | grep 8081        //通过配置文件的修改,监听的端口为8081tcp6       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 8888tcp6       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]:  lvCN=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服务

客户端访问测试:


准备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  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.sh1 #!/bin/sh                             //在第一行下面添加以下内容2 JAVA_OPTS="-Dfile.encoding=UTF-83 -server4 -Xms1023M5 -Xmx1024M6 -XX:NewSize=512M7 -XX:MaxNewSize=1020M8 -XX:NewRatio=29 -XX:ParallelGCThreads=1510 -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    

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

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

如图:

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

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

0