CentOS7 下安装 Tomcat8 并且解决启动速度巨慢的问题

博客:https://hacpai.com/article/1479778148182?p=1&m=0

 

CentOS7 下安装 Tomcat8 并且解决启动速度巨慢的问题

[0x0]介绍

Tomcat 的安装本身并没有什么复杂性,但是在启动的时候巨慢,运气不好卡个 3-5 分钟,所以这篇文章主要是为了记录解决巨慢的问题。

 

[0x1]环境介绍

  • CentOS7.0_x86-64

  • JDK1.8

[0x2]下载

Tomcat 的升级非常快,现在维持更新的有 7.x,8.0.x,8.5.x 和 9.x,每个版本对 JDK 的要求不一样,需要自己根据自己当时 JDK 环境选择不同的 Tomcat 版本。

我的服务器目前选择的是 Tomcat.8.0.38,要求 JDK7 以上,那么就下载吧,同样我已经下载好并且上传到微云了,有需要的可以直接下载。

[0x3]安装&启动

安装:Tomcat 的安装其实就是解压到一个目录就表示安装完成了。下面就是解压的命令。

[web@ebs-29770 ~]$ tar -zxf tomcat8.0.38-base.tar.gz[web@ebs-29770 ~]$ tar -zxf tomcat8.0.38-base.tar.gz

 

启动:进入刚刚解压的 Tomcat 目录,然后在进入 bin 目录,执行如下命令:

[web@ebs-29770 bin]$ ./startup.sh[web@ebs-29770 bin]$ ./startup.sh

 

下面是启动日志

[web@ebs-29770 tomcat8.0.38]$ ./bin/startup.sh
Using CATALINA_BASE: /home/web/tomcat8.0.38
Using CATALINA_HOME: /home/web/tomcat8.0.38
Using CATALINA_TMPDIR: /home/web/tomcat8.0.38/temp
Using JRE_HOME: /apps/java/jdk/jdk1.8.0_112/jre
Using CLASSPATH: /home/web/tomcat8.0.38/bin/bootstrap.jar:/home/web/tomcat8.0.38/bin/tomcat-juli.jar
Tomcat started.
[web@ebs-29770 tomcat8.0.38]$ tail -f logs/catalina.out
14-Nov-2016 23:15:37.559 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argumenttemp
14-Nov-2016 23:15:37.560 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/am
14-Nov-2016 23:15:37.781 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
14-Nov-2016 23:15:37.803 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
14-Nov-2016 23:15:37.809 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
14-Nov-2016 23:15:37.811 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
14-Nov-2016 23:15:37.815 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 902 m
14-Nov-2016 23:15:37.866 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Cat
14-Nov-2016 23:15:37.866 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engi
14-Nov-2016 23:15:37.878 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Dep/tomcat8.0.38/webapps/ROOT
14-Nov-2016 23:20:42.357 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecu for session ID generation using [SHA1PRNG] took [303,955] milliseconds.
14-Nov-2016 23:20:42.389 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Dep/web/tomcat8.0.38/webapps/ROOT has finished in 304,510 ms
14-Nov-2016 23:20:42.393 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
14-Nov-2016 23:20:42.400 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
14-Nov-2016 23:20:42.402 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 304587 ms[web@ebs-29770 tomcat8.0.38]$ ./bin/startup.sh
Using CATALINA_BASE: /home/web/tomcat8.0.38
Using CATALINA_HOME: /home/web/tomcat8.0.38
Using CATALINA_TMPDIR: /home/web/tomcat8.0.38/temp
Using JRE_HOME: /apps/java/jdk/jdk1.8.0_112/jre
Using CLASSPATH: /home/web/tomcat8.0.38/bin/bootstrap.jar:/home/web/tomcat8.0.38/bin/tomcat-juli.jar
Tomcat started.[web@ebs-29770 tomcat8.0.38]$ tail -f logs/catalina.out
14-Nov-2016 23:15:37.559 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argumenttemp
14-Nov-2016 23:15:37.560 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/am
14-Nov-2016 23:15:37.781 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]14-Nov-2016 23:15:37.803 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
14-Nov-2016 23:15:37.809 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]14-Nov-2016 23:15:37.811 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared
14-Nov-2016 23:15:37.815 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 902 m
14-Nov-2016 23:15:37.866 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Cat
14-Nov-2016 23:15:37.866 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engi
14-Nov-2016 23:15:37.878 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Dep/tomcat8.0.38/webapps/ROOT
14-Nov-2016 23:20:42.357 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecu for session ID generation using [SHA1PRNG] took [303,955] milliseconds.
14-Nov-2016 23:20:42.389 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Dep/web/tomcat8.0.38/webapps/ROOT has finished in 304,510 ms
14-Nov-2016 23:20:42.393 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]14-Nov-2016 23:20:42.400 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]14-Nov-2016 23:20:42.402 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 304587 ms

 

[0x4]启动巨慢问题分析

上面的 Tomcat 是刚下载解压出来的默认配置(只保留 Tomcat 自带),但根据上面的启动日志,竟然花了 3 分多钟,然后仔细观察日志,主要是卡在初始化 Session。开始我以为云服务器的问题,然后我在本地虚拟机上同样操作,问题重现,并且更换了 Tomcat7,问题仍然出现,所以。通过搜索和分析,Tomcat 的 SessionID 是通过 SHA1PRNG 算法计算得到的,SHA1 算法需要一个密钥,这个密钥在 Tomcat 启动的时候随机生成一个,生成是使用了 Linux 随机函数生成器/dev/random。读取它相当于生成随机数字。搜索/dev/random,大概知道是什么鬼了:/dev/random会根据 噪音 产生随机数,如果噪音不够它就会阻塞。Linux 是通过 I/O,键盘终端、内存使用量、CPU 利用率等方式来收集噪音的,如果噪音不够生成随机数的时候就会被阻塞

[0x5]解决问题

解决上述问题有两个方案,一个使用伪随机函数生成器,另外一个加大/dev/random的熵池,下面分别介绍这两种方案。

A.使用伪随机函数生成器/dev/unrandom

/dev/urandom并不是真正的随机行为(其实一般不容易重复),主要有两个地方可以修改。

  • 通过修改 Tomcat 启动文件 -Djava.security.egd=file:/dev/urandom

  • 通过修改 JRE 中的 java.security 文件 securerandom.source=file:/dev/urandom

B.增大/dev/random的熵池(推荐)

问题的原因是由于熵池不够大,所以增大它是最彻底的方法。我们可以通过软件的方法实现,下面是软件的安装和配置流程。

  1. 安装熵服务

yum install rng-toolsyum install rng-tools

 

  1. 启动熵服务

systemctl start rngdsystemctl start rngd

 

  1. 如果你的 CPU 不支持 DRNG 特性或者像我一样使用虚拟机,可以使用/dev/unrandom来模拟。

cp /usr/lib/systemd/system/rngd.service /etc/systemd/system 
  vim /etc/systemd/system/rngd.service
  #以下是编辑内容
  ExecStart=/sbin/rngd -f -r /dev/urandom  cp /usr/lib/systemd/system/rngd.service /etc/systemd/system 
  vim /etc/systemd/system/rngd.service  #以下是编辑内容
  ExecStart=/sbin/rngd -f -r /dev/urandom

 

  1. 重新载入服务

systemctl daemon-reload
  systemctl restart rngd  systemctl daemon-reload
  systemctl restart rngd

 

经过上面的修改,我们再观察 /proc/sys/kernel/random/entropy_avail 基本上在 3000 左右。这个时候重新启动 Tomcat,发现启动时间正常。

[0x6]总结

 

 

上面的 Tomcat 启动问题还是比较少见的,所以有时候不好找,所以专门做个笔记记录下。

作者:mzlion
链接:https://hacpai.com/article/1479778148182
来源:黑客派
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值