Tomcat7 在 Ubuntu 14.04 x64 [Digitalocean] 上启动过慢

50

我正在使用DigitalOcean,在Ubuntu上尝试安装和启动Tomcat,但不幸的是我无法完成它。 (创建了新的Droplets并尝试了10次)

1GB内存30GB SSD磁盘阿姆斯特丹2 Ubuntu 14.04 x64

当我启动Tomcat时,它显示“Tomcat已启动”。 但我无法从浏览器访问页面。 ./shutdown.sh返回错误。

问题可能是什么?

我现在注意到一些事情。 当我写这个问题时,Tomcat页面被显示出来。 它花了28分钟才显示该页面

catalina.out说:INFO:使用[SHA1PRNG]为会话ID生成创建SecureRandom实例花费[1,718,769]毫秒。

以下是我的安装步骤(这些步骤适用于不同的VPS,但在DigitalOcean Droplets上不起作用):

安装Oracle JDK

 sudo apt-get install python-software-properties
 sudo add-apt-repository ppa:webupd8team/java
 sudo apt-get update
 sudo apt-get install oracle-java7-installer
 sudo apt-get install oracle-java7-set-default
      java -version
      java version "1.7.0_72"
      Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
      Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)

设置Java路径

      sudo nano /etc/environment
      JAVA_HOME="/usr/lib/jvm/java-7-oracle"
      source /etc/environment
      wget http://ftp.itu.edu.tr/Mirror/Apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz
      tar xvzf apache-tomcat-7.0.56.tar.gz
      mv apache-tomcat-7.0.56/ apache-tomcat-7.0.56-server-1/

启动Tomcat

        ./startup.sh
            Using CATALINA_BASE:   /usr/local/apache-tomcat-7.0.56-server-1
            Using CATALINA_HOME:   /usr/local/apache-tomcat-7.0.56-server-1
            Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.56-server-1/temp
            Using JRE_HOME:        /usr/lib/jvm/java-7-oracle/jre
            Using CLASSPATH:       /usr/local/apache-tomcat-7.0.56-server-1/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.56-server-1/bin/tomcat-juli.jar
            Tomcat started.

结账端口为8080

        netstat -ln 
            tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
            tcp6       0      0 :::8009                 :::*                    LISTEN
            tcp6       0      0 :::8080                 :::*                    LISTEN
            tcp6       0      0 :::22                   :::*                    LISTEN

结账流程

            ps -ef | grep tomcat
            root      2825     1  1 14:23 pts/0    00:00:03 /usr/lib/jvm/java-7-oracle/jre/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-7.0.56-server-1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-7.0.56-server-1/endorsed -classpath /usr/local/apache-tomcat-7.0.56-server-1/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.56-server-1/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-7.0.56-server-1 -Dcatalina.home=/usr/local/apache-tomcat-7.0.56-server-1 -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.56-server-1/temp org.apache.catalina.startup.Bootstrap start

在端口8080打开网站 http://5.101.107.56:8080/ 页面正在等待... [28分钟或更长时间后显示内容]

如果页面仍未显示,请尝试关闭tomcat(在tomcat启动正常之前)。

      ./shutdown.sh 
            SEVERE: Could not contact localhost:8005. Tomcat may not be running.
            Oct 17, 2014 2:40:29 PM org.apache.catalina.startup.Catalina stopServer
            SEVERE: Catalina.stop:
                java.net.ConnectException: Connection refused
                at java.net.PlainSocketImpl.socketConnect(Native Method)
                at java.net.AbstractPlainSoc

查看日志

      catalina.out
            Oct 17, 2014 2:31:47 PM org.apache.coyote.AbstractProtocol init
            INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
            Oct 17, 2014 2:31:47 PM org.apache.catalina.startup.Catalina load
            INFO: Initialization processed in 1492 ms
            Oct 17, 2014 2:31:47 PM org.apache.catalina.core.StandardService startInternal
            INFO: Starting service Catalina
            Oct 17, 2014 2:31:47 PM org.apache.catalina.core.StandardEngine startInternal
            INFO: Starting Servlet Engine: Apache Tomcat/7.0.56
            Oct 17, 2014 2:31:47 PM org.apache.catalina.startup.HostConfig deployDirectory
            INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.56-server-1/webapps/host-manager

我还安装了nginx并导航至http://5.XXX.XXX.XX/,nginx欢迎页面立即打开。

当我在浏览器中查看页面时,我检查了catalina.out,它显示:

    Oct 17, 2014 2:31:47 PM org.apache.catalina.startup.HostConfig deployDirectory
    INFO: Deploying web application directory /usr/local/apache-tomcat-7.0.56-server-1/webapps/host-manager
    Oct 17, 2014 3:00:27 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
    INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took **[1,718,769] milliseconds.**

内存:

               total       used       free     shared    buffers     cached
  Mem:       1017912     849512     168400        332      18780     688468

2
看起来机器的随机数生成器熵值不足。 - Henry
是的,我正在尝试设置-Djava.security.egd=file:/dev/./urandom。 - yuceel
3个回答

79

$JAVA_PATH/jre/lib/security/java.security中的securerandom.source=file:/dev/urandom替换为securerandom.source=file:/dev/./urandom解决了我的问题。

即使指定了file:/dev/urandom,JRE仍会使用/dev/random用于SHA1PRNG(参见错误JDK-4705093):

在SHA1PRNG中,有一个SeedGenerator根据配置文件进行各种操作。
  1. 如果java.security.egd或securerandom.source指向"file:/dev/random"或"file:/dev/urandom",则使用NativeSeedGenerator,它调用super(),然后调用SeedGenerator.URLSeedGenerator(/dev/random)(SeedGenerator中的嵌套类)。这个错误中唯一改变的是,urandom也会触发使用此代码路径。
  2. 如果这些属性指向存在的另一个URL,则我们将初始化SeedGenerator.URLSeedGenerator(url)。这就是为什么"file:///dev/urandom"、"file:/./dev/random"等都可以工作的原因。

来自维基百科关于/dev/random
在这种实现中,生成器会估计熵池中噪声的位数。随机数是从这个熵池中创建的。当读取时,/dev/random设备将只返回估计位数内的随机字节。/dev/random适用于需要非常高质量随机性的用途,例如一次性密码或密钥生成。
当熵池为空时,从/dev/random读取将阻塞,直到收集到额外的环境噪声。目的是作为一个加密安全的伪随机数生成器,提供尽可能大的熵输出。建议用于生成高价值或长期保护的加密密钥。
环境噪声?
随机数生成器从设备驱动程序和其他来源收集环境噪声到熵池中。生成器还会估计熵池中噪声的位数。从这个熵池中创建随机数。
这意味着在实践中,可能会阻塞tomcat未知的时间。

4
感谢您的反馈,这让我花费了8个小时的工作时间。一开始我还以为是我的问题。其次,如果您通过apt-get安装了Tomcat,则$JAVA_HOME位于/usr/lib/jvm/default-java - EsseTi
2
谢谢。我正在使用JDK8,而不是.../urandom,我有.../random。我已经将random更改为urandom。 - mohi
非常感谢您的帮助。7分钟启动对于新手来说是非常误导的......通过yum install java-1.8.0-devel安装了Java的CentOS 7版本,其java.security位于/usr/lib/jvm/jre-1.8.0/lib/security - P Marecki
我有一个后续问题。https://dev59.com/SFkS5IYBdhLWcg3wFi-k。在生产环境中这样做可以吗?这会对安全性产生任何影响(例如Session ID变得可预测)吗? - so-random-dude
非常感谢。就像其他人所说的,我已经花了大部分时间来解决这个可怕的问题。 - jbowman
有没有适用于Windows的解决方案?在Windows NT 6.2环境中,TomEE启动时间较长的问题仍然存在。 - N00b Pr0grammer

17

https://dev59.com/4l8d5IYBdhLWcg3wzEv4#DDoPoYgBc1ULPQZFhj_T - yuceel
有没有适用于Windows的解决方案?问题仍然存在,其中TomEE启动在Windows NT 6.2环境中需要更长时间。 - N00b Pr0grammer

13

虽然使用/dev/urandom作为熵源是减少Tomcat启动时间的一种解决方法,但这并不是一个好主意,因为它可能会产生意外的副作用。

运行在Tomcat服务器上的其他组件(例如Web应用程序)可能依赖于安全初始化的SecureRandom实例,当随机数的熵不足时,可能会存在安全问题。

事实上,这就是为什么使用/dev/urandom无法工作的原因之一,而使用/dev/./urandom则可行。SHA1PRNG非常依赖于良好的种子。如果种子不好,则随机数是可预测的。因此,开发者确保为此目的使用/dev/random作为熵源,即使JVM配置为使用/dev/urandom。有两个关于此的错误报告(Bug 1Bug 2)。

因此,与其将熵源更改为/dev/urandom,不如确保/dev/random具有足够的熵。如果系统有硬件RNG,则安装rng-tools就可以解决问题。否则,安装haveged提供了一个非常好的熵源,不依赖于特殊的硬件RNG存在。在虚拟机中,rng-tools可以通过虚拟硬件RNG从主机获取熵。作为此方法的替代方案,可以使用EGD,但目前这个软件还没有包含在Ubuntu存储库中,因此使用起来有些麻烦。


谢谢。我确认通过安装haveged并不更改/dev/random,我解决了Tomcat启动时间的问题,并且通过查看/proc/sys/kernel/random/entropy_avail,熵池似乎再次充满。 - cherouvim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接