引言:
今天在linux使用tomcat+war包方式部署項(xiàng)目的時(shí)候,發(fā)現(xiàn)tomcat啟動(dòng)時(shí),會(huì)卡住一段時(shí)間,接近4分鐘左右。這對(duì)擁有小暴脾氣的我肯定沒法接受,網(wǎng)上也有很多的解決方案,一一嘗試沒一個(gè)有用,經(jīng)過各種翻墻查閱資料,終于找到解決方案,特此記錄下
現(xiàn)象:
- 觀察啟動(dòng)日志可看到如下警告日志:
TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time
- 這段日志的原因是:
1:Tomcat啟動(dòng)時(shí)會(huì)掃描大量jar包君珠,如果含有不符合TLD規(guī)范的就會(huì)出現(xiàn)這個(gè)問題
2:以后基本上不會(huì)使用JSP作為視圖層薪缆,所以我們可能根本不需要TLD這個(gè)東西,就算不要TLD也沒有什么關(guān)系
解決辦法:
1:查找tomcat/conf/catalina.properties 修改tomcat.util.scan.StandardJarScanFilter.jarsToSkip=的值為*.jar
這段配置代表tomcat在啟動(dòng)時(shí),跳過所有的jar掃描准脂。但是本人親測(cè)并沒有作用
2:修改jre隨機(jī)種子的生成規(guī)則。
- 原因:Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產(chǎn)生安全隨機(jī)類SecureRandom的實(shí)例作為會(huì)話ID,我這兒花了300多S
- 產(chǎn)生器會(huì)評(píng)估熵池(entropy pool)中的噪聲數(shù)量。隨機(jī)數(shù)是從熵池中進(jìn)行創(chuàng)建的幻工。當(dāng)讀操作時(shí),/dev/random設(shè)備會(huì)只返回熵池中噪聲的隨機(jī)字節(jié)黎茎。/dev/random非常適合那些需要非常高質(zhì)量隨機(jī)性的場(chǎng)景囊颅,比如一次性的支付或生成密鑰的場(chǎng)景。
當(dāng)熵池為空時(shí)工三,來自/dev/random的讀操作將被阻塞迁酸,直到熵池收集到足夠的環(huán)境噪聲數(shù)據(jù)。這么做的目的是成為一個(gè)密碼安全的偽隨機(jī)數(shù)發(fā)生器俭正,熵池要有盡可能大的輸出奸鬓。對(duì)于生成高質(zhì)量的加密密鑰或者是需要長期保護(hù)的場(chǎng)景,一定要這么做掸读。
最終解決辦法
- 在Tomcat環(huán)境中解決 可以通過配置JRE使用非阻塞的Entropy Source串远。
在$TOMCAT_HOME/conf/catalina.sh中加入:-Djava.security.egd=file:/dev/./urandom 即可。
- 在JVM環(huán)境中解決
打開$JAVA_HOME/jre/lib/security/java.security這個(gè)文件,將securerandom.source的值修改為file:/dev/./urandom
END:
使用這種方案后,啟動(dòng)速度從300多S下降至10S