Tomcat7 在 Ubuntu 14.04 x64 [Digitalocean] 上启动太晚了

Posted

技术标签:

【中文标题】Tomcat7 在 Ubuntu 14.04 x64 [Digitalocean] 上启动太晚了【英文标题】:Tomcat7 starts too late on Ubuntu 14.04 x64 [Digitalocean] 【发布时间】:2014-12-13 10:40:10 【问题描述】:

我正在使用 digitalocean 并尝试在 ubuntu 上安装和启动 tomcat,但不幸的是我做不到。 (创建新的液滴并尝试了 10 次)

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

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

可能是什么问题?

我现在注意到了一些事情。在我写这个问题时,会显示 tomcat 页面。显示页面花了 28 分钟

catalina.out 说:信息:使用 [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

【问题讨论】:

看起来机器的随机数生成器的熵用完了。 是的,我正在尝试设置 -Djava.security.egd=file:/dev/./urandom 【参考方案1】:

$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 取决于配置。

    如果 java.security.egd 或 securerandom.source 指向“file:/dev/random”或“file:/dev/urandom”,我们将使用 NativeSeedGenerator,它调用 super() 它调用 SeedGenerator.URLSeedGenerator(/dev/random)。 (内的嵌套类 SeedGenerator。)在这个错误中唯一改变的是 urandom 也会触发此代码路径的使用。

    如果这些属性指向另一个存在的 URL,我们将初始化 SeedGenerator.URLSeedGenerator(url)。这就是为什么 “file:///dev/urandom”、“file:/./dev/random”等都可以。

来自Wikipedia on /dev/random:

在这个实现中,生成器保持对数量的估计 熵池中的噪音。从这个熵池中随机 数字被创建。读取时,/dev/random 设备只会 在估计的噪声位数内返回随机字节 熵池。 /dev/random 应该适合需要的用途 非常高质量的随机性,例如一次性填充或密钥生成。

当熵池为空时,从 /dev/random 读取 会阻塞 直到收集到额外的环境噪音。 目的是 用作密码安全的伪随机数生成器, 以尽可能大的熵提供输出。这是建议的 用于生成高价值或长期的加密密钥 保护。

环境噪音?

随机数生成器从设备收集环境噪声 驱动程序和其他来源进入熵池。发电机也 保持对熵池中噪声位数的估计。 从这个熵池中创建随机数。

这意味着在实践中,可能会阻止 Tomcat 一段未知的时间。

【讨论】:

首先谢谢,这花了我 8 个小时的工作时间。我以为是我。其次,如果你通过apt-get 安装了tomcat,$JAVA_HOME 就在这里/usr/lib/jvm/default-java 谢谢。我正在使用 JDK8 而不是 .../urandom 我有 .../random。我也确实将 random 更改为 urandom。 帮助很大;谢谢。 7 分钟的启动太让人误解了......通过yum install java-1.8.0-devel 安装了java 的CentOS 7 的java.security 位于/usr/lib/jvm/jre-1.8.0/lib/security 我有一个后续问题。 ***.com/questions/40383430/…。在生产中可以这样做吗?这会对安全性产生任何影响(例如 Session ID 变得可预测)? 非常感谢。就像其他人所说的那样,我花了一天的大部分时间来试图解决这个令人发指的问题。【参考方案2】:

这也有效:

其实,通过在/etc/default/tomcat7中设置如下,我就没事了:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC"

评论来自:

https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-ubuntu-14-04-via-apt-get

【讨论】:

***.com/questions/26431922/… 有什么适用于 Windows 的吗?在 Windows NT 6.2 环境之一中,TomEE 启动时间较长的问题仍然存在。【参考方案3】:

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

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

实际上,这也是使用/dev/urandom 不起作用但/dev/./urandom 起作用的原因之一。 SHA1PRNG 严重依赖于好的种子。如果种子不好,随机数是可预测的。因此,开发人员确保为此目的使用/dev/random 作为熵源,即使JVM 配置为使用/dev/urandom。有两个关于此的错误报告(bug 1、bug 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 似乎熵池又满了。

以上是关于Tomcat7 在 Ubuntu 14.04 x64 [Digitalocean] 上启动太晚了的主要内容,如果未能解决你的问题,请参考以下文章

tomcat7 在ubuntu14.04中默认安装目录

Ubuntu安装TomCat

Laptop Ubuntu16.04/14.04 安装Nvidia显卡驱动

为啥 Ubuntu 14.04 上的 mod_jk 无法连接到 tomcat

无法登录到部署在 Tomcat7 上的 Apache Usergrid

Tomcat7 使用 spring 在 ubuntu 中循环请求。怎么修?