Debian的Linux Tomcat 8新鲜安装没有响应端口8080

我最近两次遇到这个问题,在Debian 9以及Ubuntu 16.04 LTS。

在刚刚安装了Tomcat 8和openjdk 8的操作系统后(没有更改默认configuration),重新启动后,Tomcat服务器将停止响应8080端口。

服务器仍在监听端口,但即使是一个简单的GET /只是永远挂起:

 # netstat -an|grep 8080 tcp6 0 0 :::8080 :::* LISTEN # wget http://127.0.0.1:8080/ --2017-11-03 13:19:52-- http://127.0.0.1:8080/ Connecting to 127.0.0.1:8080... connected. HTTP request sent, awaiting response... 

根据线程转储Tomcat似乎在启动时挂起:

 "localhost-startStop-1" #14 daemon prio=5 os_prio=0 tid=0x00000000018a1000 nid=0x68d8 runnable [0x00007f2badacd000] java.lang.Thread.State: RUNNABLE at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(FileInputStream.java:255) at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539) at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144) at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:203) at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:221) - locked <0x00000000f99155c0> (a sun.security.provider.SecureRandom) at java.security.SecureRandom.nextBytes(SecureRandom.java:468) at java.security.SecureRandom.next(SecureRandom.java:491) at java.util.Random.nextInt(Random.java:329) at org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:237) at org.apache.catalina.util.SessionIdGeneratorBase.getRandomBytes(SessionIdGeneratorBase.java:174) at org.apache.catalina.util.StandardSessionIdGenerator.generateSessionId(StandardSessionIdGenerator.java:34) at org.apache.catalina.util.SessionIdGeneratorBase.generateSessionId(SessionIdGeneratorBase.java:167) at org.apache.catalina.util.SessionIdGeneratorBase.startInternal(SessionIdGeneratorBase.java:256) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) - locked <0x00000000f9905808> (a org.apache.catalina.util.StandardSessionIdGenerator) 

为什么会发生这种情况,以及如何解决?

基于Debian的发行版中的OpenJDK 8带有/dev/random预配置为熵源。

当没有足够的熵时, /dev/random将被阻塞。

更改/usr/lib/jvm/default-java/jre/lib/security/java.security以使用/dev/urandom来代替:

 #securerandom.source=file:/dev/random securerandom.source=file:/dev/./urandom 

这将全局适用于所有的Java进程。

或者,在/etc/default/tomcat8中将-Djava.security.egd=file:/dev/./urandomJAVA_OPTS (仅适用于Tomcat进程)。