当我们需要查看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协议)。
[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。
顶级组件:位于整个配置的顶层,如server。
容器类组件:可以包含其它组件的组件,如service、engine、host、context。
连接器组件:连接用户请求至tomcat,如connector。
被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。
chost>
<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 name="Catalina">
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8009"protocol="AJP/1.3"redirectPort="8443"/>
<Engine name="Catalina"defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockoutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
Realm>
<Host name="localhost"appBase="webapps"
unpackWARs="true"autoDeploy="true">
<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>
| 参数 | 参数说明 |
|---|---|
| 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 | 指定超过的事件数(单位:毫秒) |
| 参数 | 参数说明 |
|---|---|
| host | 表示一个虚拟主机 |
| name | 指定主机名 |
| appbase | 应用程序基本目录,即存放应用程序的目录,一般为appBase=“webapps”,相对于CATALINA_HOME而言的,也可以写绝对路径。 |
| unpackWARs | 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 |
| autoDeploy | 在tomcat启动时,是否自动部署 |
| xmlValidation | 是否启动xml的校验功能,一般xmlValidation=“false” |
| xmlNamespaceAware | 检测名称空间,一般xmlNamespaceAware=“false” |
| 参数 | 参数说明 |
|---|---|
| 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配置文件参数优化,Java虚拟机(JVM)调优。
在Connector模块中添加
…………
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