zoukankan      html  css  js  c++  java
  • tomcat 安全规划及性能优化

    jvm运行时数据结构:

    jvm堆数据机构:

    -xms 初始化堆大小 默认物理内存的1/64(<1GB)
    -xmx 最大堆大小 默认物理内存的1/4(<1GB),实际中建议不大于4GB
    一般建议设置 -xms = -xmx 好处是避免每次在gc后,调整堆的大小,减少系统内存分配开销

    整个堆大小=年轻代大小+年老代大小+持久代大小

    新生代=1个eden区+2个suivivor区 使用-xmn来设置其大小,默认值大小为整个堆的3/8,用来存放JVM刚分配的java对象

    老年代中经过垃圾回收没有被回收掉的对象被复制到老年代,老年代大小无配置参数

    -xx:permsize :设置持久代大小 一般和-xx:maxpermsize最大持久代大小一致,为了避免gc后内存的开销
    持久代存放class、method元信息,其大小与项目的规模、类、方法的数量有关。一般设置为128M就足够了,设置原则是预留30%的空间

    tomcat安装部署

    首先到tomcat和jdk官方下载源码包

    [root@linux-node1 ~]$ cd  /usr/local/
    [root@linux-node1 local]$ ll
    -rw-r--r-- 1 root root   9532698 Mar  5 21:50 apache-tomcat-8.5.29.tar.gz
    -rw-r--r-- 1 root root 354635831 Mar 19 13:29 jdk-9.0.4_linux-x64_bin.tar.gz

    安装jdk和tomcat

    [root@linux-node1 local]$ tar  xf jdk-9.0.4_linux-x64_bin.tar.gz
    [root@linux-node1 local]$ tar  xf apache-tomcat-8.5.29.tar.gz
    [root@linux-node1 local]$ ln -s   /usr/local/jdk-9.0.4  /usr/local/jdk
    [root@linux-node1 local]$ ln -s   /usr/local/apache-tomcat-8.5.29  /usr/local/tomcat  

    创建管理jdk和tomcat的用户,并对此用户授予所有者权限

    [root@linux-node1 local]# useradd  -u  601  tomcat
    [root@linux-node1 local]# chown  tomcat.tomcat  /usr/local/jdk  -R
    [root@linux-node1 local]# chown  tomcat.tomcat  /usr/local/tomcat -R

    创建jdk和tomcat的系统环境变量

    [root@linux-node1 local]# vim  /etc/profile.d/tomcat.sh 
    export  JAVA_HOME=/usr/local/jdk
    export  TOMCAT_HOME=/usr/local/tomcat
    export  PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
    export  CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/to
    ols.jar 

    加载这个脚本,使tomcat和jdk的环境变量生效  [root@linux-node1 ~]# source /etc/profile.d/tomcat.sh 

    为了安全起见,切换到tomcat用户环境,使用tomcat用户来启动tomcat

    [root@linux-node1 local]# su  - tomcat
    [tomcat@linux-node1 ~]$ catalina.sh   start
    [tomcat@linux-node1 ~]$ ps  -ef|grep java |grep tomcat
    tomcat    16777      1 70 16:19 pts/1    00:00:04 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomca -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
    #当然也可以取tomcat进程的pid号,这样就可以创建一个管理tomcat的脚本
    [tomcat@linux-node1 ~]$ ps  -ef|grep java |grep tomcat|grep -v  grep |awk  '{print $2}'
    16777
    [tomcat@linux-node1 ~]$ netstat -lntup
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      16777/java          
    tcp6       0      0 :::8009                 :::*                    LISTEN      16777/java          
    tcp6       0      0 :::8080                 :::*                    LISTEN      16777/java 

    能够正常启动tomcat后,就可以创建一个脚本来管理tomcat了,实现通过脚本来启动tomcat或关闭tomcat再或重启tomcat等。

    通过设置catalina.sh来配置远程监控jvm

    vim  /usr/local/tomcat/bin/catalina.sh
    CATALINA_OPTS="$CATALINA_OPTS
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.port=22222
    -Djava.rmi.server.hostname=192.168.182.170"

    tomcat 在生产环境下安全规范

    1、telnet端口的修改<Server port="8005" shutdown="SHUTDOWN"> 将8005端口修改或shutdown指令字符创做修改比如shutdown="dangji"

      如果这个端口没有修改,可以通过这个端口telnet上来关闭tomcat服务:telnet  192.168.182.170  8005   进入后输入SHUTDOWN即可关闭tomcat服务。

    2、ajp连接端口的保护:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    修改默认端口8009为不易冲突的大于1024端口

    3、禁用管理端
    删除默认安装目录下的conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件
    删除默认安装目录下的/webapps下默认所有的目录和文件
    将tomcat应用根目录配置为tomcat安装目录以外的目录。例如:在Host标签下添加
    <Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="/usr/local/tomcat/webroot" debug="
    0" reloadable="false" crossContext="true">
    </Context>

    4、文件列表的访问控制
    conf/web.xml文件中的default部分listings的配置必须为false,默认是false。表示禁止将文件展示出来

    5、版本信息隐藏
    修改web.xml重定向403、404以及500等错误指定的错误页面,因为这些错误页面上会显示版本信息,所以要修改错误页面的重定向

    6、server header重写
    在HTTP Connector配置中加入server的配置

    7、访问限制
    通过配置,限定访问的ip来源

    8、起停脚本的权限收回
    去除其他用户对tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限
    chmod -R 744 tomcat/bin/*

    9、访问日志格式的规范
    开启tomcat默认访问日志中的Referer和User-Agent记录

    tomcat性能优化:

    tomcat线程优化:

    <Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"
    connectionTimeout="20000" redirectPort="8443" />
    

    maxThreads="600"       ///最大线程数
    minSpareThreads="100"///初始化时创建的线程数
    maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
    acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

    可以通过命令:java -xx:+PrintFlagsFinal 显示java所支持的所有的参数及参数对应的默认值

    jvm内存调优:

    vim  /usr/local/tomcat/bin/catalina.sh 
    
    JSSE_OPTS="-Xmx4000M -Xms4000M -Xmn600M -XX:PermSize=128M -XX:MaxPermSize=128M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log "
    

    配置说明:

    • Tomcat 默认是以 java -client 的方式运行,server 意味着是已真正的生产环境来运行,这样可以获得更高的并发、更高效的垃圾回收能力;
    • Xms、Xmx表示JVM 最小内存初始值和最大内存初始值,建议设置为相同参数,以减少CPU对内存资源的调度,避免CPU高速运转进行的垃圾回收;
    • Xmn设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8;
    • -Xss是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory;
    • -XX:+AggressiveOpts作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术;
    • -XX:+UseBiasedLocking启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配;
    • -XX:PermSize=128M -XX:MaxPermSize=256M JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;四分之一是1024MB,这就是MaxPermSize默认大小;
    • -XX:+DisableExplicitGC在程序代码中不允许有显示的调用”System.gc()”。调用System.gc()付出的代价就是系统响应时间严重降低,就和我在关于Xms,Xmx里的解释的原理一样;
    • -XX:+UseParNewGC 对年轻代采用多线程并行回收。
    • -XX:+UseConcMarkSweepGC 即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒;
    • -XX:+CMSParallelRemarkEnabled在使用UseParNewGC 的情况下, 尽量减少mark的时间;
    • -XX:+UseCMSCompactAtFullCollection在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少;
    • -XX:LargePageSizeInBytes指定 Java heap的分页页面大小;
    • -XX:CMSInitiatingOccupancyFraction=70CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不会出现promotion failed。在我的应用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5488*10%=548兆,所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed,因此这个参数的设置必须与Xmn关联在一起;

    参考文章:http://www.open-open.com/lib/view/open1324736648468.html

         http://blog.chinaunix.net/uid-743704-id-2681326.html

  • 相关阅读:
    不常用的cmd命令
    js获取宽度
    Marshaling Data with Platform Invoke 概览
    Calling a DLL Function 之三 How to: Implement Callback Functions
    Marshaling Data with Platform Invoke 之四 Marshaling Arrays of Types
    Marshaling Data with Platform Invoke 之一 Platform Invoke Data Types
    Marshaling Data with Platform Invoke 之三 Marshaling Classes, Structures, and Unions(用时查阅)
    Calling a DLL Function 之二 Callback Functions
    WCF 引论
    Marshaling Data with Platform Invoke 之二 Marshaling Strings (用时查阅)
  • 原文地址:https://www.cnblogs.com/goser/p/8505514.html
Copyright © 2011-2022 走看看