文章目录
Web服务(12)——Tomcat管理
一、检查tomcat是否启动
当我们需要查看tomcat服务是否在工作中可以通过监听服务的方式来查看,而所有与java相关的服务启动都是java命名的进程。
8080:建立http,客户端访问链接的端口
8005:tomcat自身的端口,监听关闭tomcat请求的端口,比如shutdown指令
8009:ajp端口,是与其他http服务通讯的一个接口,如apache、nginx
PS:AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的,在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
二、Tomcat日志说明
1.查看日志
[root@TTTTTTT conf]# tail -f /usr/local/tomcat/logs/catalina.out
27-Jul-2022 14:19:40.764 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/docs] has finished in [24] ms
27-Jul-2022 14:19:40.764 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat/webapps/examples]
27-Jul-2022 14:19:40.994 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/examples] has finished in [230] ms
27-Jul-2022 14:19:40.994 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat/webapps/host-manager]
27-Jul-2022 14:19:41.006 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/host-manager] has finished in [12] ms
27-Jul-2022 14:19:41.007 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat/webapps/manager]
27-Jul-2022 14:19:41.020 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [13] ms
27-Jul-2022 14:19:41.023 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
27-Jul-2022 14:19:41.033 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["ajp-nio-8009"]
27-Jul-2022 14:19:41.041 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in [684] milliseconds
其中我们可能会发现启动时间较长,而其中有一项的启动时间占据了绝大多数时间:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSuLUPWP-1658923053729)(https://s2.loli.net/2022/07/27/fmXqWojvMzVHkg9.png)]
耗时原因:是session引起的随机数问题导致的。tomcat的session id是通过SHA1算法计算得到的,计算session id的时候必须要有一个密钥,为了提高安全性tomcat在启动的时候会通过随机生成一个密钥。
如何解决tomcat由于生成随机数的时候卡死,导致启动慢的问题?
这时候们要查看是否有足够的熵来用于产生随机数:
[root@TTTTTTT conf]# cat /proc/sys/kernel/random/entropy_avail
3266
PS:熵:Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。 在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。
如果这个值小于要产生的随机数,那么/dev/random就会阻塞,导致tomcat卡死,所以这个值越大越好。
为了加速/dev/random提供随机数的速度,我们需要生成大量的随机字节。这个时候可以多做些琐事(像是敲打键盘、移动鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
或者我们可以修改jdk参数:
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/random #117行
#修改为
securerandom.source=file:/dev/urandom
/dev/urandom是/dev/random的非阻塞版本,/dev/random的random pool
依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用,/dev/ràndom设备可以保证数据的随机性。
/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高,所以该随机数的安全性理论上不高。如果应用对安全性要求很高,那么应该使用/dev/random。
三、Tomcat主配置文件详解
1.server.xml组件类别
顶级组件:位于整个配置的顶层,如server。
容器类组件:可以包含其它组件的组件,如service、engine、host、context。
连接器组件:连接用户请求至tomcat,如connector。
被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。
<server>
<service>
<connector />
<engine>
<host>
<context></context>
</host>
chost>
<context></context>
</host>
</engine>
</service>
</server>
2.server.xml配置文件注释
<?xml version='1.0'encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素,由org.apache.catalina.5 erver接口来定义,它包含一个<Service>元素,并且它不能做为任何元素的子元素。
port指定Tomcat监听shutdown命令端口,终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令,该属性是必须的。
shutdown指定修止Tomcat服务得运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置。
-->
<Server port="8005"shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener
className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase"auth="container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryuserDatabaseFactory"
pathname="conf/tomcat-users.xm1"/>
</GlobalNamingResources>
<!--service服务组件-->
<Service name="Catalina">
<!--Connector主要参数说明(见下表)-->
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8009"protocol="AJP/1.3"redirectPort="8443"/>
<!--engine,核心容器组件,cata1ina引章,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
-->
<Engine name="Catalina"defaultHost="localhost">
<!--Realm表示存放用户名,密码及ro1e的数据库-->
<Realm className="org.apache.catalina.realm.LockoutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--详情常见下表(host参数详解)-->
<Host name="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true">
<!--详情常见下表(Context参数说明)-->
<Context path=""docBase=""debug=""/>
<Valve className="org.apache.catalina.valves.AccessLogvalve"directory="logs"
prefix="localhost_access_log"suffix=".txt"
pattern="%h %u %t "%r"%s %b"/>
</Host>
</Engine>
</Service>
</server>
3.connector主要参数说明
参数 | 参数说明 |
---|---|
connector | 将诶受用户请求,类似于http的listten配置监听端口 |
port | 指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求 |
address | 指定链接器监听的地址,默认为所有地址(0.0.0.0) |
protocol | 连接器使用的协议,支持http和ajp |
minProcessors | 服务器启动时创建的处理请求的线程数 |
maxProcessors | 最大可以创建的处理请求的线程数 |
enableLookups | 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名;若为false则不进行DNS查询,而是返回其ip地址 |
redirectPort | 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 |
acceptCount | 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 |
connectionTimeout | 指定超过的事件数(单位:毫秒) |
4.host参数详解
参数 | 参数说明 |
---|---|
host | 表示一个虚拟主机 |
name | 指定主机名 |
appbase | 应用程序基本目录,即存放应用程序的目录,一般为appBase=“webapps”,相对于CATALINA_HOME而言的,也可以写绝对路径。 |
unpackWARs | 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 |
autoDeploy | 在tomcat启动时,是否自动部署 |
xmlValidation | 是否启动xml的校验功能,一般xmlValidation=“false” |
xmlNamespaceAware | 检测名称空间,一般xmlNamespaceAware=“false” |
5.Context参数说明
参数 | 参数说明 |
---|---|
Context | 表示一个web应用程序,通常为WAR文件 |
docBase | 应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径 |
path | 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**** |
reloadable | 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以再不重启tomcat的情况下改变应用程序 |
四、Tomcat优化
Tomcat默认安装下的缺省配置只适合于测试环境,它可能会频繁出现假死现象需要重启,只有通过不断压则优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。
在Connector模块中添加
…………
<Connect> port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
#在下面插入以下内容(71行)
minSpareThreads="50"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressionableMimeType="text/html,text/html,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"/>
END