相对于mysql数据库优化,tomcat的优化知识在面试中被问的频率会少一些,但是如果被问到tomcat的优化,如果能清晰的,有条理答出来在面试中还是很加分的,虽然在工作中如果没有涉及到高并发访问,其实tomcat的默认配置就挺好,基本上不需要怎么修改配置。整理一下,以备平时及面试使用。
Tomcat配置优化
对于tomcat的优化,主要是从2个方面入手,一是,tomcat自身的配置,另一个是tomcat所运行的jvm虚拟机的调优。
1、部署安装tomcat9
1、下载并安装: https://tomcat.apache.org/download-90.cgi

linux系统下载tar包
2、wget镜像安装
cd /usr/local
mkdir download
cd download
mkdir tomcat9
wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.44/bin/apache-tomcat-9.0.44.tar.gz
tar ‐zxvf apache‐tomcat‐9.0.44.tar.gz
mv apache‐tomcat‐9.0.44 tomcat9
cd tomcat9/apache‐tomcat‐9.0.44/conf
#修改配置文件,配置tomcat的管理用户
vi tomcat‐users.xml
#写入如下内容:
<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
#保存退出
#如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat9中不行,还需要修改
另一个配置文件,否则访问不了,提示403
cd ../
vim webapps/manager/META‐INF/context.xml
#将<Valve的内容注释掉
<Context antiResourceLocking="false" privileged="true" >
<!‐‐ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> ‐‐>
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.Cs
rfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
#保存退出即可
#启动tomcat
cd /usr/local/download/tomcat9/apache‐tomcat‐9.0.44/bin/
./startup.sh && tail ‐f ../logs/catalina.out
#打开浏览器进行测试访问
http://106.53.226.148:8080/

点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
如果之前在tomcat-user.xml中没有配置 role和user的话也是会提示403,并且页面中会给出各种role和user的作用,以及推荐如何配置
这个就是tomcat-user.xml,现在故意把manager-gui角色配错,多一个空格,

然后重启tomcat,访问Server Status
如果配置格式没有错误,则访问后,页面展示如下:

进入之后即可看到服务器的信息。(进去看看)
ps:安全起见,生产环境会禁用这个管理界面,最直接的办法是删除webapp下的默认项目。因为我们根本不需要从界面上部署。
2、禁用ajp协议(8.5.51之前的版本默认是开启的,后续的版都是禁用的)
在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口 。
我在windows电脑上安装的tomcat8,可以查看一下:
我安装的8.5.39,可以看到ajp服务默认是打开的,端口用的是8109

在到linux服务器上看一下tomcat9

tomcat9的server.xml文件中ajp服务默认是关闭的,端口是8009
什么是AJP呢? AJP(Apache JServer Protocol) AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。

我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。 修改conf下的server.xml文件,将AJP服务禁用掉即可 。
重启tomcat,查看效果。
可以看到AJP服务以及不存在了。
ps:禁用ajp后,看节省了多少内存??查询某个pid占多少内存
3、执行器(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。 修改server.xml文件:
<!‐‐将注释打开(注释没打开的情况下默认10个线程,最小10,最大200)‐‐>
<Executor name="tomcatThreadPool" namePrefix="catalina‐exec‐"
maxThreads="500" minSpareThreads="50"
prestartminSpareThreads="true" maxQueueSize="100"/>
<!‐‐
参数说明:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业
务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的
参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize,最大的等待队列数,超过则拒绝请求
‐‐>
<!‐‐在Connector中设置executor属性指向上面的执行器‐‐>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
保存退出,重启tomcat,查看效果。
ps:idea中源码启动或者用jvisualvm查看线程的变化
4、3种运行模式
tomcat的运行模式有3种:
ps:每个模式都需要线程演示查看
1)、bio(tomcat7演示,压测看线程增长)
默认的模式,性能非常低下,没有经过任何优化处理和支持,tomcat8.5已经舍弃了该模式,默认就是nio模式。
2)、nio(nio2)
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。NIO2异步的本质是数据从内核态到用户态这个过程是异步的,也就是说nio中这个过程必须完成了才执行下个请求,而nio2不必等这个过程完成就可以执行下个请求,nio2的模式中数据从内核态到用户态这个过程是可以分割的。
3)、apr
apr(Apache portable Run-time libraries/Apache可移植运行库)是Apache HTTP服务器的支持库。
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能。推荐使用nio,不过,在tomcat8及后续的版本中有最新的nio2,速度更快,建议使用nio2。
设置nio2:
<Connector executor="tomcatThreadPool" port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
ps:为什么nio快呢?
简单地说,nio 模式最大化压榨了CPU,把时间片更好利用起来。通俗地说,bio hold住连接不干活也占用线程,nio hold住连接不干活也没关系,让需要处理的连接执行就行了。
如果通道选择apr,apr需要独立安装。
apr安装步骤:
1、先安装gcc, expat-devel,perl-5
yum install gcc
yum install expat-devel
cd /usr/local
wget ftp://mirrors.ustc.edu.cn/CPAN/src/5.0/perl-5.30.1.tar.gz
tar -xzf perl-5.30.1.tar.gz
cd perl-5.30.1
./Configure -des -Dprefix=$HOME/localperl
make
make install
2、安装apr
cd /usr/local
wget https://mirrors.cnnic.cn/apache/apr/apr-1.6.5.tar.gz
tar -zxvf apr-1.6.5.tar.gz
cd apr-1.6.5
./configure --prefix=/usr/local/apr && make && make install
3、安装apr-util
cd /usr/local
wget https://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.gz
##安装apr-util前请确认系统是否安装了expat-devel包,如没安装请安装,不然会报错。yum install expat-devel
tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.0
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
4、安装openssl
cd /usr/local
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar -zxvf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l
./configure --prefix=/usr/local/openssl shared zlib && make && make install
##缺少zlib,会报错,所以得先安装zlib
cd /usr/local
**wget http://www.zlib.net/zlib-1.2.11.tar.gz**
tar -zxvf zlib-1.2.1.tar.gz
cd zlib-1.2.11
##因为要用共享方式安装,所以执行以下命令
make clean && ./configure --shared && make test && make install
cp zutil.h /usr/local/include
cp zutil.c /usr/local/include
##重新执行
./configure --prefix=/usr/local/openssl shared zlib && make && make install
##检查openssl是否安装成功
/usr/local/openssl/bin/openssl version -a 显示1.0.2l版本为成功
5、安装tomcat-native
tar /usr/local/tomcat9/bin/tomcat-native.tar.gz
cd /usr/local/tomcat9/bin/tomcat-native-1.2.12-src/native
./configure --with-apr=/usr/local/apr --with-java-home=/usr/local/jdk/ --with-ssl=/usr/local/openssl/ && make && make install
6、使tomcat支持apr配置apr库文件
##方式1:配置坏境变量:
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib" >> /etc/profile
echo "export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib" >> /etc/profile && source /etc/profile
##方式2:catalina.sh脚本文件:在注释行# Register custom URL handlers下添加一行
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
7、修改tomcat server.xml文件(把protocol修改成org.apache.coyote.http11.Http11AprProtocol)
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
8、启动tomcat
cd /usr/local/tomcat8/bin
./startup.sh
9、查看tomcat是否以http-apr模式运行,可以查看tomcat管理界面,也可以远程jmx监控查看
##连接远程jmx监控需要在catalina.sh文件中加上
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.0.107 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
查看管理页面
|