tomcat 安全規劃及性能優化

jvm運行時數據結構:html

 

jvm堆數據機構:java

 

-xms 初始化堆大小 默認物理內存的1/64(<1GB)
-xmx 最大堆大小 默認物理內存的1/4(<1GB),實際中建議不大於4GB
通常建議設置 -xms = -xmx 好處是避免每次在gc後,調整堆的大小,減小系統內存分配開銷node

整個堆大小=年輕代大小+年老代大小+持久代大小python

新生代=1個eden區+2個suivivor區 使用-xmn來設置其大小,默認值大小爲整個堆的3/8,用來存放JVM剛分配的java對象linux

老年代中通過垃圾回收沒有被回收掉的對象被複制到老年代,老年代大小無配置參數web

-xx:permsize :設置持久代大小 通常和-xx:maxpermsize最大持久代大小一致,爲了不gc後內存的開銷
持久代存放class、method元信息,其大小與項目的規模、類、方法的數量有關。通常設置爲128M就足夠了,設置原則是預留30%的空間apache

tomcat安裝部署bootstrap

首先到tomcat和jdk官方下載源碼包vim

[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和tomcattomcat

[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 在生產環境下安全規範

一、telnet端口的修改<Server port="8005" shutdown="SHUTDOWN"> 將8005端口修改或shutdown指令字符創作修改好比shutdown="dangji"

  若是這個端口沒有修改,能夠經過這個端口telnet上來關閉tomcat服務:telnet  192.168.182.170  8005   進入後輸入SHUTDOWN便可關閉tomcat服務。

二、ajp鏈接端口的保護:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改默認端口8009爲不易衝突的大於1024端口

三、禁用管理端
刪除默認安裝目錄下的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>

四、文件列表的訪問控制
conf/web.xml文件中的default部分listings的配置必須爲false,默認是false。表示禁止將文件展現出來

五、版本信息隱藏
修改web.xml重定向40三、404以及500等錯誤指定的錯誤頁面,由於這些錯誤頁面上會顯示版本信息,因此要修改錯誤頁面的重定向

六、server header重寫
在HTTP Connector配置中加入server的配置

七、訪問限制
經過配置,限定訪問的ip來源

八、起停腳本的權限收回
去除其餘用戶對tomcat的bin目錄下shutdown.sh、startup.sh、catalina.sh的可執行權限
chmod -R 744 tomcat/bin/*

九、訪問日誌格式的規範
開啓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

相關文章
相關標籤/搜索