Tomcat 9 在宝塔面板下启动慢,主要因 SecureRandom 初始化时卡在 /dev/random 熵池不足导致阻塞;解决方法是将 java.security 中 securerandom.source 改为 file:/dev/urandom 或在 catalina.sh 中添加 -Djava.security.egd=file:/dev/urandom 参数。

Tomcat 9 在宝塔面板下启动慢,大概率卡在 SecureRandom 初始化阶段——系统熵池不足,/dev/random 阻塞等待随机数,导致整个启动流程挂起几十秒甚至更久。
为什么宝塔环境特别容易触发这个阻塞?
宝塔默认部署的 CentOS/Ubuntu 系统(尤其是低配云服务器或虚拟机)通常缺乏硬件随机数生成器,/dev/random 的熵值长期偏低。而 Tomcat 9 启动时会调用 java.security.SecureRandom 生成 Session ID,JDK 默认使用 NativePRNG(底层绑定 /dev/random),一旦熵不够就死等。
你可能看到的现象:catalina.out 日志停在 “Starting ProtocolHandler” 之前,无报错、无超时、CPU 占用极低,持续 30–120 秒后才继续。
- 宝塔面板本身不干预 JVM 启动参数,也不会自动替换随机数源
- 面板里“重启 Tomcat” 实际执行的是
systemctl restart tomcat或脚本调用,仍走默认 JDK 行为 - 即使你改了
server.xml或catalina.properties,不碰随机数机制,问题照旧
直接改 java.security 文件最稳妥
这是 JDK 层面的全局配置,一劳永逸,且对宝塔托管的多个 Tomcat 实例都生效(只要共用同一 JDK)。
操作路径(以 JDK 8 为例,宝塔常用路径):
vi $JAVA_HOME/jre/lib/security/java.security
找到这一行:
securerandom.source=file:/dev/random
把它改成:
securerandom.source=file:/dev/urandom
保存退出。注意:$JAVA_HOME 通常是 /www/server/java(宝塔 JDK 安装路径),请先确认:
echo $JAVA_HOME
或者查实际 JDK 路径:
ps aux | grep java | grep -v grep
再定位到对应 jre/lib/security/java.security。
备选:在宝塔启动脚本里加 JVM 参数(适合不想动 JDK 全局配置时)
宝塔管理 Tomcat 一般通过 /www/server/tomcat/bin/catalina.sh 或 systemd service 文件。推荐改 catalina.sh —— 它优先级高,且宝塔界面操作(如重启)都会调用它。
在 catalina.sh 开头附近(比如 #!/bin/sh 下一行),插入:
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
注意两点:
- 必须写成
file:/dev/urandom(带file:前缀),不能只写/dev/urandom - 不要覆盖已有的
JAVA_OPTS,要用$JAVA_OPTS追加 - 如果宝塔用了 systemd(如
/etc/systemd/system/tomcat.service),则需在Environment=或ExecStart=中补上该参数,但优先级低于catalina.sh
验证是否生效 & 容易忽略的点
改完后,务必执行完整重启(不是重载):
bash /www/server/tomcat/bin/shutdown.sh && sleep 3 && bash /www/server/tomcat/bin/startup.sh
然后立刻检查日志:
tail -f /www/server/tomcat/logs/catalina.out
正常情况:从执行 startup.sh 到出现 “Server startup in XXX ms” 应在 5–15 秒内完成(视应用大小而定);若仍卡住,说明没改对位置或没生效。
容易忽略的点:
- 改了
java.security但没重启 Tomcat(或没杀干净残留 Java 进程) - 宝塔后台“重启”按钮有时只 reload,不 stop+start,建议命令行操作确保干净
- 多个 JDK 共存时,改错了
$JAVA_HOME指向的版本(比如宝塔用的是自带 JDK,但你改了系统默认 JDK) -
/dev/urandom在极老内核(
这个问题的本质不是 Tomcat 慢,而是它启动时对密码学安全的过度依赖——生产环境用 /dev/urandom 是标准实践,别被“urandom 不够安全”的过时说法误导。


















