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 參數優化配置javascript

<!--<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部署發佈的網站

方法一php

比較簡單的辦法 先把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:壓縮的文件類型
相關文章
相關標籤/搜索