会造成 Tomcat 启动卡住的坑

Apache Tomcat 是常见的用来 JavaServer Pages (JSP) 的服务器软件。然而我在运行它的时候,时不时会遇到一些奇怪的问题,在这里记录一下。

问题描述

测试环境的 JDK 版本为 1.8.0 以上,Apache Tomcat 版本为 8.5 以上,使用的是从官网下载的打包版。运行 bin/startup.sh 之后,会发现有较大概率出现 localhost:8080 加载不出来;或是执行 bin/shutdown.sh 关不掉 Tomcat 的情况。若执行 bin/catalina.sh run 查看输出的日志,会发现启动时卡在部署第一个网页那里,输出类似 INFO: Deploying web application directory /opt/apache-tomcat/webapps/host-manager

原因及解决方案

在排除了防火墙、端口占用等问题后,通过搜索终于在这里得到了一些启发。这很有可能是由于 SecureRandom 运行时,得到的随机结果熵不够,于是一直等待造成卡住。原问题的回答中提到了两种解决方案:

  • 让 JRE 使用 non-blocking 的熵生成源,通过添加如下运行参数:

    1
    -Djava.security.egd=file:/dev/./urandom
  • 安装 haveged 包:

    1
    $ sudo apt install haveged

总结

  1. 搜索时也要尽可能遵循“提问的艺术”,通过查日志等方式把问题细化或缩小范围
  2. 并不是所有问题都是能用 root 权限执行来解决的,有时候可能会使问题变得更糟
  3. 困扰好久的问题终于解决了,让我叉会腰