docker+tomcat 啓動時很是慢,通常正常啓動幾十秒的,發現docker+tomcat啓動竟須要幾分鐘,難以想象java
根本緣由是 SecureRandom 這個 jre 的工具類的問題。那爲何 SecureRandom generateSeed 這麼慢,甚至掛在 Linux 操做系統呢?docker
Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 類產生安全隨機類 SecureRandom 的實例做爲會話 ID。apache
SecureRandom generateSeed 使用 /dev/random 生成種子。可是 /dev/random 是一個阻塞數字生成器,若是它沒有足夠的隨機數據提供,它就一直等,這迫使 JVM 等待。鍵盤和鼠標輸入以及磁盤活動能夠產生所需的隨機性或熵。但在一個服務器缺少這樣的活動,可能會出現問題。tomcat
有2種解決方案:安全
1. 在Tomcat環境中解決:服務器
能夠經過配置 JRE 使用非阻塞的 Entropy Source:dom
在 catalina.sh 中加入這麼一行:-Djava.security.egd=file:/dev/./urandom 便可。
2. 在 JVM 環境中解決(本人使用此方法):工具
打開jdk安裝路徑 $JAVA_PATH/jre/lib/security/java.security 這個文件,找到下面的內容:spa
securerandom.source=file:/dev/random
替換成:操作系統
securerandom.source=file:/dev/./urandom
問題完美解決
這裏值爲什麼要在 dev 和 random 之間加一個點呢?是由於一個 JDK 的 bug,有人反饋即便對 securerandom.source 設置爲 /dev/urandom 它也仍然使用的 /dev/random,有人提供了變通的解決方法,其中一個變通的作法是對 securerandom.source 設置爲 /dev/./urandom 才行。也有人評論說這個不是 bug,是有意爲之。