1. 程式人生 > >關於阿里雲伺服器中使用Docker啟動Tomcat過程很慢的解決方案

關於阿里雲伺服器中使用Docker啟動Tomcat過程很慢的解決方案

最近在阿里雲伺服器使用Docker啟動Tomcat,發現tomcat伺服器啟動過程很慢。但是在本地啟動很快,一直找不到問題所在,檢視Tomcat伺服器啟動日誌發現打印出這麼一段日誌:

二月 12, 2018 9:20:02 上午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
資訊: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [215214 milliseconds]

於是查看了相關資料發現,在apache-tomcat官方文件:

如何讓tomcat啟動更快裡面提到了一些啟動時的優化項,其中一項是關於隨機數生成時,採用的“熵源”(entropy source)的策略。

他提到tomcat7的session id的生成主要通過java.security.SecureRandom生成隨機數來實現,隨機數演算法使用的是”SHA1PRNG”

private String secureRandomAlgorithm = "SHA1PRNG";

在sun/oracle的jdk裡,這個演算法的提供者在底層依賴到作業系統提供的隨機資料,在linux上,與之相關的是/dev/random和/dev/urandom,對於這兩個裝置塊的描述以前也見過討論隨機數的文章,wiki中有比較詳細的描述,摘抄過來,先看/dev/random :

在讀取時,/dev/random裝置會返回小於熵池噪聲總數的隨機位元組。/dev/random可生成高隨機性的公鑰或一次性密碼本。若熵池空了,對/dev/random的讀操作將會被阻塞,直到收集到了足夠的環境噪聲為止
而 /dev/urandom 則是一個非阻塞的發生器:
dev/random的一個副本是/dev/urandom (”unlocked”,非阻塞的隨機數發生器),它會重複使用熵池中的資料以產生偽隨機資料。這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。它可以作為生成較低強度密碼的偽隨機數生成器,不建議用於生成高強度長期密碼。 
另外wiki裡也提到了為什麼linux核心裡的隨機數生成器採用SHA1雜湊演算法而非加密演算法,是為了避開法律風險(密碼出口限制)。
回到tomcat文件裡的建議,採用非阻塞的熵源(entropy source),通過java系統屬性來設定:
-Djava.security.egd=file:/dev/./urandom

於是,我在自己的Dockerfile中添加了如下程式碼:

ENV JAVA_OPTS "-Djava.security.egd=file:/dev/./urandom"
然後Tomcat重新啟動後,發現伺服器啟動變得很快了。