zoukankan      html  css  js  c++  java
  • 转载 tomcat linux 下, tomcat假死的解决办法,另:manager开启,在centos7巨慢问题,war部署在根目录

    服务器配置:linux+tomcat

    现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常。

    原因:tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。

    解决方案1:及时断开socket

    解决方案2:修改tomcat配置文件,修改最大连接数(增大)

    修改server.xml配置文件,Connector节点中增加acceptCount和maxThreads这两个属性的值,并且使acceptCount大于等于maxThreads:

    <Connector port="8080" protocol="HTTP/1.1"

                connectionTimeout="20000"  

               redirectPort="8443" acceptCount="500" maxThreads="400" />

    解决方案3:修改linux的TCP超时时间(socket生命周期)限制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vi /etc/sysctl.conf
    # Decrease the time default value for tcp_fin_timeout connection
    net.ipv4.tcp_fin_timeout = 30
    # Decrease the time default value for tcp_keepalive_time connection
    net.ipv4.tcp_keepalive_time = 1800
    # 探测次数
    net.ipv4.tcp_keepalive_probes=2
    # 探测间隔秒数
    net.ipv4.tcp_keepalive_intvl=2
     
    编辑完 /etc/sysctl.conf,要重启network 才会生效
    [root@temp /]# /etc/rc.d/init.d/network restart

    参考:

    http://zhidao.baidu.com/link?url=XEFvQIHJ6Udt1UZi_3AAULeMamp73igRN3bLX6u2bbHkZvbvOzbxA-WMRRAXF8CcUw_VbT3-H0eHFNTuAPwcTp2kRA_Q7gqoS29h3MybMti

    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4091262

    http://www.xuebuyuan.com/1584364.html

    http://blog.163.com/kel_scott66/blog/static/11505396320097245547700/   

    --------------------------------------------------------------------------------------------------------

    tomcat 开启远程manger的办法

    首先需要修改tomcat/conf/tomcat-users.xml的用户权限修改为:

    <role rolename="admin-gui"/>
    <role rolename="manager-gui"/>
    <user username="admin" password="1234" roles="admin-gui,manager-gui"/>

    其次修改tomcat/webapps/host-manager/META-INF/context.xml和tomcat/webapps/manager/META-INF/context.xml,原始代码为:

    <Context antiResourceLocking="false" privileged="true" >
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
    <Manager sessionAttributeValueClassNameFilter="java.lang.(?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
    </Context>

    修改为:

    <Context antiResourceLocking="false" privileged="true" >
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="^.*$" />
    <Manager sessionAttributeValueClassNameFilter="java.lang.(?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
    </Context>

    修改完成后不用重启tomcat,再进行远程访问,即可。

    ====================================================

    最佳实践调优,用执行器。

    ====================================================

    另外调优tomcat的方法,

    tomcat的读写io的方式,有3种

    bio,nio,apr,

    其中bio是最元始的,效果最差。

    apr是最新的,配置太过于繁琐,但是从操作系统级别来解决异步的IO问题,能大幅度提交性能。

    这里介绍nio,并且带executor,执行器。

    如下:

    执行器优化(线程池)

    在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

    开启并且使用


     在Connector中指定使用共享线程池

    查看Tomcat控制台

    Executor重要参数说明:

    name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;

    namePrefix:在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;

    maxThreads:该线程池可以容纳的最大线程数。默认值:200;

    maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。

    minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:25。

    threadPriority:线程的等级。默认是Thread.NORM_PRIORITY

    Connector重要参数说明:

    executor:表示使用该参数值对应的线程池;

    minProcessors:服务器启动时创建的处理请求的线程数;

    maxProcessors:最大可以创建的处理请求的线程数;

    acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。

    参数最佳实践

    禁用AJP连接器

    AJP(Apache JServer Protocol)
    AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
    我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。

    在管理界面中看不到ajp了:

    完成上面几步对Tomcat的优化配置,你的Tomcat服务器并发量肯定会有大幅度的提升。这只是简单的配置,后续还会有针对JVM的专项介绍。JVM参数也是影响Tomcat性能的一个重要因素。

    ==========================================

    tomcat 8 在阿里云centos部署巨慢的问题

    是因为随机数生成器

    cat /proc/sys/kernel/random/entropy_avail     

    用上面此命令查看当前随机数熵池,

    没有优化时,随机数值大约20多。安装rngd后,值为3000多,安装java优化参数后,值为300-400多.

    --------------------------------------------

    以下是安装rng服务器的步骤:

    yum install rng-tools   安装rngd服务。

    systemctl start rngd

    如果cpu是不支持rng特性或是使用虚拟机,可以使用/dev/urandom来模拟 

    cp /usr/lib/systemd/system/rngd.service   /etc/systemd/system

    或者 systemctl enable rngd 若删除 disable

    编辑/etc/systemd/system/rngd.service

    ExecStart=/sbin/rngd -f -r /dev/urandom

    systemctl daemon-reload 重载服务
    systemctl restart rngd 重启


    另外一个方法:

    在tomcat/bin/catalina.sh中添加如下语句:

    JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom" ,加入到原有的JAVA_OPTS的后面。这种方法安装后,cat /proc/sys/kernel/random/entropy_avail   的值为300多

    ===============================================

    部署war在根目录

    修改server.xml文件

     <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
    
            <!-- SingleSignOn valve, share authentication between web applications
                 Documentation at: /docs/config/valve.html -->
            <!--
            <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
            -->
    
            <!-- Access log processes all example.
                 Documentation at: /docs/config/valve.html
                 Note: The pattern used is equivalent to using pattern="common" -->
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
         <!-- deployed at root dir  --  // 以下这段是部署在根目录 -->
    <Context path="" docBase="/www/webapps/zhouyi2/" />
    </Host>
  • 相关阅读:
    SQL 开窗函数
    使用 git 管理源代码
    mybatis常见问题
    es-删除记录
    Jmeter使用
    websocket在服务端获取客户端IP
    单点登录
    java中的HTTP客户端
    SpringBoot利用Redis管理分布式Session
    springboot中的统一异常处理
  • 原文地址:https://www.cnblogs.com/sdgtxuyong/p/12206832.html
Copyright © 2011-2022 走看看