zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    程序员这生必须掌握的两种图形
    用一张组织架构图说清楚类和对象
    简单工厂、工厂方法、抽象工厂的比较与分析
    rabbitmq系列(一)初识rabbitmq
    【最新】经典面试100问,附答案
    使用wordPress搭建个人博客
    调试接口你还在用postman吗
    Token ,Cookie、Session傻傻分不清楚?
    你不可不知的自定义注解
    使用aop加解密http接口
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/9284838.html
Copyright © 2011-2022 走看看