• tomcat(不仅仅是tomcat)通过熵池解决在linux启动应用慢


    tomcat启动过程中报错

    20-Jul-2017 02:54:56.797 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /application/apache-tomcat-8.0.27/webapps/manager
    20-Jul-2017 02:54:56.848 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /application/apache-tomcat-8.0.27/webapps/manager has finished in 51 ms
    20-Jul-2017 02:54:56.864 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
    20-Jul-2017 02:54:56.873 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
    20-Jul-2017 02:54:56.874 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 34487 ms

    熵池

    熵池本质上是若干字节。/proc/sys/kernel/random/entropy_avail中存储了熵池现在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。如果entropy_avail的值小于要产生的随机数bit数,那么/dev/random就会堵塞。
    那么,为什么熵池不够用呢?
    google了一下资料,熵池实际上是从各种noice source中获取数据,noice source可能是键盘事件、鼠标事件、设备时钟中等。linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减少了,熵池补给的速度当然也变慢,进而不够用。
    其实,通过消耗熵池,可以构造DOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。

    补充熵池

    有一些程序可以自动补充熵池,例如rngd或rng-tools。
    我在Linode VPS上尝试了一下rngd,效果非常明显。
    先观察rngd启动前的熵池大小: watch cat /proc/sys/kernel/random/entropy_avail ,在100~200之间。
    然后启动rngd:sudo rngd -r /dev/urandom -o /dev/random -f -t 1
    熵池立刻飙升到3712,接近4096的上限。

    是否有足够的熵来用于产生随机数,可以通过如下命令来查看
     cat /proc/sys/kernel/random/entropy_avail

    方案一:
    可以通过安装rng-tools解决

    yum -y install rng-tools
    echo 'EXTRAOPTIONS="--rng-device /dev/urandom"' >/etc/sysconfig/rngd
    service rngd restart
    chkconfig rngd on

    方案二:

    在tomcat环境中解决

    可以通过配置JRE使用非阻塞的Entropy Source。
    在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
    vim $TOMCAT_HOME/bin/catalina.sh
    if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
        JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
    fi

    方案三:

    在JVM环境中解决

    打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
    securerandom.source=file:/dev/urandom 
    替换成
    securerandom.source=file:/dev/./urandom 
    或者
    vim $JAVA_HOME/jre/lib/security/java.security
    securerandom.source=file:/dev/random
    改为
    securerandom.source=file:/dev/urandom
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    【2020-MOOC-浙江大学-陈越、何钦铭-数据结构】图(第七周的笔记和编程作业)
    PTA刷题笔记(C语言) | 7-6 厘米换算英尺英寸 (15分)
    数据包设置了不允许分片Don't fragment: Set
    今晚直播:Oracle Nologging 全面总结
    DM online-远大见未来 大咖讲堂丨大数据+,信息化应用与技术落地
    PTA刷题笔记(C语言) | 7-2 I Love GPLT (5分)
    用 C 语言开发一门编程语言 — 抽象语法树
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/9284838.html
Copyright © 2020-2023  润新知