• Tomcat8性能优化


    Tomcat配置相关说明

    /usr/local/tomcat 
    主目录(安装目录)
    bin 
    存放windows或linux平台上启动或关闭的Tomcat的脚本文件
    conf 
    存放Tomcat的各种全局配置文件,其中最主要的是server.xml和web.xml
    lib 
    存放Tomcat运行需要的库文件(JARS)
    logs 
    存放Tomcat执行时的LOG文件
    webapps 
    Tomcat的主要Web发布目录(包括应用程序事例)htdocs(html php)
    work 
    存放jsp编译后产生的class文件
    [root@tomcat1 ~]# ls /usr/local/tomcat/conf/
    catalina.policy 
    权限控制配置文件
    catalina.properties 
    Tomcat属性配置文件
    context.xml 
    上下文配置文件(selinux)
    logging.properties 
    日志log相关配置文件
    server.xml 
    主配置文件
    tomcat-users.xml 
    manager-gui管理用户配置文件(Tomcat安装后生成的管理界面,该文件可开启访问)
    web.xml 
    Tomcat的servlet,servlet-mapping,filter,MIME等相关配置
    server.xml 
    主要配置文件,可修改启动端口,设置网站根目录,虚拟主机,开启https等功能。
    conf 
    存放Tomcat的各种全局配置文件,其中最主要的是server.xml和web.xml
     

    1.开启Tomcat APR运行模式,优化并发性能

    yum install -y apr-devel openssl-devel gcc gcc-c++
    cd $TOMCAT_HOME/bin
    tar -zxvf tomcat-native.tar.gz 
    cd tomcat-native-1.2.16-src/native
    ./configure --with-apr=/usr/bin/apr-1-config --with-ssl=/usr --with-java-home=/usr/local/jdk
    make
    make install
    ln -s /usr/local/apr/lib/libtcnative* /usr/lib64/
    修改server.xml
    vim /home/tomcat8/conf/server.xml
    把protocol改成下面找个
    <Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" />
     
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    然后重启tomcat,观察日志tailf /home/tomcat8/logs/catalina.out
    2017-10-12 15:31:19,032 - Initializing ProtocolHandler ["http-apr-8080"]
    2017-10-12 15:31:19,051 - Starting ProtocolHandler ["ajp-apr-8009"]
    这样就成功了

    2.优化配置JVM

    vim /home/tomcat8/bin/catalina.sh
    编辑catalina.sh配置文件
    [root@tomcat1 ~]# vim /home/tomcat/apache-tomcat-9.0.10/bin/catalina.sh
    # OS specific support. $var _must_ be set to either true or false.下面添加
     
    JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 -XX:CMSInitiatingOccupancyFraction=80 -XX:
    +UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"
    参数描述
    -Xms
    堆内存初始大小,单位m、g
    -Xmx
    堆内存最大允许大小,一般不要大于物理内存的80%
    -XX:PermSize
    非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
    -XX:MaxPermSize
    非堆内存最大允许大小
    -XX:+UseParallelGCThreads=8
    并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等
    -XX:+UseParallelOldGC
    指定老年代为并行收集
    -XX:+UseConcMarkSweepGC
    CMS收集器(并发收集器)
    -XX:+UseCMSCompactAtFullCollection
    开启内存空间压缩和整理,防止过多内存碎片
     
    查看网上说都是内存的1/2
    #还有很多的参数,我也不甚了解,就不写了

    3.配置共享线程池

    vim /home/tomcat8/conf/server.xml
     
     <!--The connectors can use a shared executor, you can define one or more named thread pools-->
        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="1000" minSpareThreads="100"/>
    把这坨代码的注释去掉,这里启用tomcatThreadPool
    参数解释:
    • maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
    • minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
    • maxIdleTime:如果当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。
    • prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
    • maxQueueSize:最大的等待队列数,超过则拒绝请求
     

    Connector 参数优化配置

    <!--<Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />-->
        <!-- A "Connector" using the shared thread pool-->
    然后把默认这坨代码给注释掉,把下面的代码取消注释
        <Connector
             executor="tomcatThreadPool"
             port="8088"
             protocol="org.apache.coyote.http11.Http11Nio2Protocol"
             connectionTimeout="8000"
             maxConnections="10000"
             redirectPort="8443"
             enableLookups="false"
             acceptCount="100"
             maxPostSize="10485760"
             maxHttpHeaderSize="8192"
             compression="on"
             disableUploadTimeout="true"
             compressionMinSize="2048"
             acceptorThreadCount="2"
             compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
             URIEncoding="utf-8"
             processorCache="20000"
             tcpNoDelay="true"
             server="Server Version 1.0"/>
    参数解释:
    • protocol:Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
    • protocol:Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
    • protocol:Tomcat 8 设置 APR 性能飞快:org.apache.coyote.http11.Http11AprProtocol 更多详情:《Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化》
    • connectionTimeout:Connector接受一个连接后等待的时间(milliseconds),默认值是20000。
    • maxConnections:这个值表示最多可以有多少个socket连接到tomcat上
    • enableLookups:禁用DNS查询
    • acceptCount:当tomcat启动的线程数达到最大时,接受排队的请求个数,默认值为100。
    • maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求。
    • maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
    • compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
    • disableUploadTimeout:这个标志允许servlet容器使用一个不同的,通常长在数据上传连接超时。如果不指定,这个属性被设置为true,表示禁用该时间超时。
    • compressionMinSize:当超过最小数据大小才进行压缩
    • acceptorThreadCount:用于接受连接的线程数量。增加这个值在多CPU的机器上,尽管你永远不会真正需要超过2。也有很多非维持连接,您可能希望增加这个值。默认值是1。
    • compressableMimeType:配置想压缩的数据类型
    • URIEncoding:网站一般采用UTF-8作为默认编码。
    • processorCache:协议处理器缓存的处理器对象来提高性能。该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。如果不使用Servlet 3.0异步处理,默认是使用一样的maxThreads设置。如果使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。
    • tcpNoDelay:如果设置为true,TCPNODELAY选项将被设置在服务器套接字,而在大多数情况下提高性能。这是默认设置为true。
    • server:隐藏Tomcat版本信息,首先隐藏HTTP头中的版本信息
    如果你配置了APR,记得把协议改成APR,然后保存,重启tomcat 这样一来 就优化了并发性能和使用了共享线程池
    (据我线上的情况是日志里是200个线程 循环使用1-200,然后又从1开始)
     

    4.访问日志配置接口请求处理时间

    这个好处在于分析代码中接口请求处理时间,比如反映网站打开慢,那么我们可以通过查看访问日志的接口请求处理时间,观察哪个接口的时间长,把锅甩给开发
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t "%r" %s %b %D" />
    %D显示为毫秒
    %T显示为秒
    一般配置为%D毫秒
     
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>
     

    5.tomcat日志切割

    就是切割catalina.out 默认这个是不切割的,这样问题是日志越来越大,不好管理,所以我们要切割一下,我的例子是一天一个日志
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log" suffix=".txt"
                   pattern="%h %l %u %t "%r" %s %b %D" />
    %D显示为毫秒
    %T显示为秒
    一般配置为%D毫秒
     
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i %T" resolveHosts="false"/>
     
    vim catalina.sh
    第一步:
    将
    if [ -z "$CATALINA_OUT" ] ; then
      CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
    fi
    修改为
    if [ -z "$CATALINA_OUT" ] ; then
      CATALINA_OUT="$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out
    fi
     
    第二步:
    将
    touch "$CATALINA_OUT"
    修改为
    #touch "$CATALINA_OUT"
     
    第三步:
    将
    org.apache.catalina.startup.Bootstrap "$@" start 
    >> "$CATALINA_OUT" 2>&1 "&"
    删掉 增加以下
    org.apache.catalina.startup.Bootstrap "$@" start 2>&1 
    | /usr/sbin/cronolog "$CATALINA_OUT" >> /dev/null &  改上下两处
    修改后的文件
    重启tomcat,这就齐了
     

    6.配置tomcat隐藏版本号

    为了避免木马病毒针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息。针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 catalina.jar
    cd /home/apache-tomcat-8.5.27/lib
    unzip catalina.jar
    进入org/apache/catalina/util 编辑配置文件ServerInfo.properties字段来实现来更改我们tomcat的版本信息
    cd org/apache/catalina/util
     
    vim ServerInfo.properties
    server.info=Apache Tomcat
    server.number=
    server.built=
     
    将修改后的信息压缩回jar包
     
    cd /home/apache-tomcat-8.5.27/lib
    jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
    重启tomcat
     

    7.配置tomcat开机自启动

    注:需要catalina.sh里配置JAVA_HOME,CATALINA_HOME 不然会报错
    vim /home/tomcat8/bin/catalina.sh
     
    CATALINA_HOME=/home/apache-tomcat-8.5.27
    JAVA_HOME=/home/jdk1.8.0_181
    直接在最前边添加即可
    #测试的时候没有添加修改JAVA_HOME 和 CATALINA_HOME用systemctl 也可以用暂时没发现问题
     
    vim /usr/lib/systemd/system/tomcat.service
     
    [Unit]
    Description=Tomcat
    After=syslog.target network.target remote-fs.target nss-lookup.target  
     
    [Service]
    Type=forking  
     
    ExecStart=/home/tomcat/bin/startup.sh
    ExecReload=/home/tomcat/bin/startup.sh
    ExecStop=/home/tomcat/bin/shutdown.sh
     
    [Install]
    WantedBy=multi-user.target
     
    然后你就可以用下面的命令了
    systemctl start tomcat
    systemctl enable tomcat
     

    8.配置tomcat禁用(修改)8005端口

    telnet localhost 8005 然后输入 SHUTDOWN 就可以关闭 Tomcat,为了安全我们要修改(修改下8005端口)该功能
    默认值:
    <Server port="8005" shutdown="SHUTDOWN">
    修改为:
    <Server port="port" shutdown="SHUTDOWN">
    #注意,网上写的是改成-1 问题是这样会导致无法关闭到tomcat,所有我觉得还是改个端口吧。这一条还是谨慎使用
    <Server port="-1" command="SHUTDOWN">

    9.Tomcat 设置 X-Frame-Options

    Tomcat 设置 X-Frame-Options 属性防止 Cross-Site Request Forgery (CSRF) 攻击
    编辑 /tomcat/conf/web.xml 添加如下配置:
    <filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
            <init-param>
                <param-name>antiClickJackingOption</param-name>
                <param-value>SAMEORIGIN</param-value>
            </init-param>
            <async-supported>true</async-supported>
        </filter>
     
        <filter-mapping>
            <filter-name>httpHeaderSecurity</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    10.修改tomcat项目目录和支持热部署

    tomcat默认发布项目是http://ip:port/你的项目名称。
    但是有的时候开发需要直接访问到项目,不要后边加上项目名称,比如直接用java开发,直接用tomcat部署发布的网站

    方法一

    比较简单的办法 先把tomcat给启动起来,然后删除webapps下的ROOT这个目录,把你的项目(可能是个war包)改名为ROOT
    再把war包给删除,然后重启下tomcat
    rm -rf webapps/ROOT
    mv project ROOT
    rm -rf project.war
    sh bin/shutdown.sh
    sh bin/startup.sh
    这样就行了
     
    方法二
    修改server.xml,直接指定项目目录,就行了。这里还有一个问题,开发在项目开发过程中,经常要改动JAVA/JSP 文件,但是又不想从新启动服务器(服务器从新启动花时间),想直接获得(debug)结果
    所有需要运维给他开启热部署,热加载
     
    那么需要这样配置
    vim /home/tomcat8/conf/server.xml
    找下这块儿配置
    <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <Context debug="0" docBase="/home/tomcat/webapps/ROOT" path="" privileged="true" reloadable="true"/>
    热加载:		在server.xml -> context 属性中 设置 reloadable="true"
    热部署:		在server.xml -> context 属性中 设置 autoDeploy="true"
    项目发布目录:	在server.xml docBase="/home/tomcat/webapps/ROOT"
     
    #注意 这样就可以指定项目的发布目录,我这个项目是把ROOT里的东西给删除了,然后把项目包的东西塞进ROOT目录里边。通过一个脚本实现的。
     
    脚本如下
    #脚本的意思是就是从腾讯云COS上,把war包给下载下来,然后解压,然后给塞进webapps/ROOT/里面去,你可以再配合ansible scripts模块实现批量发布,我之前用ansible一下发布9台tomcat
    vim autoDeploy.sh
    ####################JUST AS YOU NEED###########################
    outdir=ROOT
    tomcat_home=/home/tomcat
     
    #################### DO NOT MODIFY ##################################
    webapp_dir=${tomcat_home}/webapps
     
    if [ -z $1 ]; then
      echo 'enter the url: '
      read url
    else
      url=$1
    fi
    fname=`basename $url`
    echo $fname
    wget $url -P /tmp
    rm -rf $webapp_dir/$outdir/*
    unzip -q /tmp/$fname -d $webapp_dir/$outdir
    rm -f /tmp/$fname
     
    jid=`ps -ef | grep java | grep -v grep | awk '{print $2}'`
    kill -9 $jid
    #nohup $tomcat_home/bin/startup.sh >> /dev/null
    $tomcat_home/bin/startup.sh
    day=`date +%Y-%m-%d`
    catalinaLog="catalina."$day".log"
    /home/apps_deploy/tomcat_action.log
     
    tail -f ${tomcat_home}/logs/${catalinaLog}
    这货运行就是 sh autoDeploy.sh 后边指向COS下的war包的URL
     

    生产实例配至说明

    #server.xml配置文件下:
    [root@tomcat1 ~]# vim /usr/local/tomcat8/conf/server.xml
    # <Connector executor="tomcatThreadPool"下面添加:
    port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="1000"
    minSpareThreads="100"
    maxSpareThreads="200"
    acceptCount="1000"
    disableUploadTimeout="true"
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    enableLookups="false"
    compression="on"
    compressionMinSize="2048"
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
    redirectPort="8443" />
    #参数说明:
    org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio
    maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
    minSpareThreads:最小空闲线程数。
    maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。
    acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
    disableUploadTimeout:禁用上传超时时间
    connectionTimeout:连接超时,单位毫秒,0代表不限制
    URIEncoding:URI地址编码使用UTF-8
    enableLookups:关闭dns解析,提高响应时间
    compression:启用压缩功能
    compressionMinSize:最小压缩大小,单位Byte
    compressableMimeType:压缩的文件类型
     
  • 相关阅读:
    ExtAspNet应用技巧(二)
    JavaScript继承详解(六)
    ExtAspNet新版本发布,集成Extjs3.0,兼容IE浏览器
    ExtAspNet发展规划
    把Doc文档转换成rtf格式 (转载)
    提高Sql Server性能的10个技巧
    winform中树和数据库关联操作的例子(C#)
    为什么C#没有提供“缺省参数”
    让UML消失一段时间
    把RichTextBox中的文本保存到Sql Server中
  • 原文地址:https://www.cnblogs.com/xuewenlong/p/12857480.html
Copyright © 2020-2023  润新知