設置 Tomcat 相關變量:
vim bin/catalina.sh
在配置文件的可編輯內容最上面(98 行開始),加上如下內容(具體參數根據你服務器情況自行修改):
JAVA_HOME=/usr/program/jdk1.8.0_72 CATALINA_HOME=/usr/program/tomcat8 CATALINA_OPTS="-server -Xms528m -Xmx528m -XX:PermSize=256m -XX:MaxPermSize=358m" CATALINA_PID=$CATALINA_HOME/catalina.pid
如果使用 shutdown.sh 還無法停止 tomcat,可以修改其配置:
vim bin/shutdown.sh 把最尾巴這一行:
exec "$PRGDIR"/"$EXECUTABLE" stop "$@" 改為:
exec "$PRGDIR"/"$EXECUTABLE" stop 10 -force
JVM 優化
模型資料來源:
http://xmuzyq.iteye.com/blog/599750
Java 的內存模型分為:
Young,年輕代(易被 GC)。Young 區被划分為三部分,Eden 區和兩個大小嚴格相同的 Survivor 區,其中 Survivor 區間中,某一時刻只有其中一個是被使用的,另外一個留做垃圾收集時復制對象用,
在 Young 區間變滿的時候,minor GC 就會將存活的對象移到空閑的Survivor 區間中,根據 JVM 的策略,在經過幾次垃圾收集后,任然存活於 Survivor 的對象將被移動到 Tenured 區間。
Tenured,終身代。Tenured 區主要保存生命周期長的對象,一般是一些老的對象,當一些對象在 Young 復制轉移一定的次數以后,對象就會被轉移到 Tenured 區,一般如果系統中用了 application 級別的緩存,緩存中的對象往往會被轉移到這一區間。
Perm,永久代。主要保存 class,method,filed 對象,這部門的空間一般不會溢出,除非一次性加載了很多的類,不過在涉及到熱部署的應用服務器的時候,有時候會遇到 java.lang.OutOfMemoryError : PermGen space 的錯誤,
造成這個錯誤的很大原因就有可能是每次都重新部署,但是重新部署后,類的 class 沒有被卸載掉,這樣就造成了大量的 class 對象保存在了 perm 中,這種情況下,一般重新啟動應用服務器可以解決問題。
Linux 修改 bin/catalina.sh 文件,把下面信息添加到文件第一行。Windows 和 Linux 有點不一樣的地方在於,在 Linux 下,下面的的參數值是被引號包圍的,而 Windows 不需要引號包圍。
如果服務器只運行一個 Tomcat
機子內存如果是 8G,一般 PermSize 配置是主要保證系統能穩定起來就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
機子內存如果是 16G,一般 PermSize 配置是主要保證系統能穩定起來就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
機子內存如果是 32G,一般 PermSize 配置是主要保證系統能穩定起來就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
如果是開發機
-Xms550m -Xmx1250m -XX:PermSize=550m -XX:MaxPermSize=1250m
參數說明:
-Dfile.encoding:默認文件編碼 -server:表示這是應用於服務器的配置,JVM 內部會有特殊處理的 -Xmx1024m:設置JVM最大可用內存為1024MB -Xms1024m:設置JVM最小內存為1024m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。 -XX:NewSize:設置年輕代大小 -XX:MaxNewSize:設置最大的年輕代大小 -XX:PermSize:設置永久代大小 -XX:MaxPermSize:設置最大永久代大小 -XX:NewRatio=4:設置年輕代(包括 Eden 和兩個 Survivor 區)與終身代的比值(除去永久代)。設置為 4,則年輕代與終身代所占比值為 1:4,年輕代占整個堆棧的 1/5 -XX:MaxTenuringThreshold=10:設置垃圾最大年齡,默認為:15。如果設置為 0 的話,則年輕代對象不經過 Survivor 區,直接進入年老代。對於年老代比較多的應用,可以提高效率。
如果將此值設置為一個較大值,則年輕代對象會在 Survivor 區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。 -XX:+DisableExplicitGC:這個將會忽略手動調用 GC 的代碼使得 System.gc() 的調用就會變成一個空調用,完全不會觸發任何 GC
編輯修改配置文件
vim conf/server.xml
禁用8005端口
telnet localhost 8005 然后輸入 SHUTDOWN 就可以關閉 Tomcat,為了安全我們要禁用該功能 默認值: <Server port="8005" shutdown="SHUTDOWN"> 修改為: <Server port="-1" shutdown="SHUTDOWN">
應用程序安全&關閉自動部署
默認值: <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> 修改為: 在tomcat8.5.30版本中配置 reloadable="false" 選項啟動時會包如下警告: 警告 [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin [SetPropertiesRule]Server/Service/Engine/Host} Setting property 'reloadable' to 'false' did not find a matching property. <Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" reloadable="false"> <Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">
maxThreads 連接數限制修改配置
默認值: <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> 修改為: <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" maxIdleTime="60000" prestartminSpareThreads = "true" maxQueueSize = "100" />
參數解釋:
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" /> 修改為: 用此項配置 protocol="org.apache.coyote.http11.Http11Nio2Protocol"啟動時會有警告, 警告 [main] org.apache.tomcat.util.net.Nio2Endpoint.bind The NIO2 connector requires an exclusive executor to operate properly on shutdown <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="40000" maxConnections="10000" redirectPort="8443" enableLookups="false" acceptCount="100" maxPostSize="10485760" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" maxHttpHeaderSize="8192" processorCache="20000" tcpNoDelay="true" connectionLinger="5" server="Server Version 11.0" URIEncoding="utf-8" />
重點參數解釋:
protocol,Tomcat 8 設置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol(如果這個用不了,就用下面那個) protocol,Tomcat 6、7 設置 nio 更好:org.apache.coyote.http11.Http11NioProtocol enableLookups,禁用DNS查詢 acceptCount,指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 maxPostSize,以 FORM URL 參數方式的 POST 提交方式,限制提交最大的大小,默認是 2097152(2兆),它使用的單位是字節。10485760 為 10M。如果要禁用限制,則可以設置為 -1。 maxPostSize:設置由容器解析的URL參數的最大長度,-1(小於0)為禁用這個屬性,默認為2097152(2M) 請注意, FailedRequestFilter 過濾器可以用來拒絕達到了極限值的請求。 acceptorThreadCount,用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因為該服務器是一個多核CPU,如果是多核 CPU 一般配置為 2. acceptorThreadCount:用於接受連接的線程數量。增加這個值在多CPU的機器上,盡管你永遠不會真正需要超過2。 也有很多非維持連接,您可能希望增加這個值。默認值是1。 connectionTimeout:Connector接受一個連接后等待的時間(milliseconds),默認值是60000。 maxConnections:這個值表示最多可以有多少個socket連接到tomcat上 maxHttpHeaderSize:http請求頭信息的最大程度,超過此長度的部分不予處理。一般8K。 compression:是否啟用GZIP壓縮 on為啟用(文本數據壓縮) off為不啟用, force 壓縮所有數據 disableUploadTimeout:這個標志允許servlet容器使用一個不同的,通常長在數據上傳連接超時。 如果不指定,這個屬性被設置為true,表示禁用該時間超時。 compressionMinSize:當超過最小數據大小才進行壓縮 compressableMimeType:配置想壓縮的數據類型 URIEncoding:網站一般采用UTF-8作為默認編碼。 processorCache:協議處理器緩存的處理器對象來提高性能。 該設置決定多少這些對象的緩存。-1意味着無限的,默認是200。 如果不使用Servlet 3.0異步處理,默認是使用一樣的maxThreads設置。
如果使用Servlet 3.0異步處理,默認是使用大maxThreads和預期的並發請求的最大數量(同步和異步)。 tcpNoDelay:如果設置為true,TCP_NO_DELAY選項將被設置在服務器套接字,而在大多數情況下提高性能。這是默認設置為true。 connectionLinger:秒數在這個連接器將持續使用的套接字時關閉。默認值是 -1,禁用socket 延遲時間。 server:隱藏Tomcat版本信息,首先隱藏HTTP頭中的版本信息
禁用 AJP(如果你服務器沒有使用 Apache)
把下面這一行注釋掉,默認 Tomcat 是開啟的。 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
隱藏或修改 Tomcat 版本號
# cd /usr/local/tomcat/lib/ # unzip catalina.jar # cd org/apache/catalina/util # vim ServerInfo.properties server.info=Apache Tomcat/8.5.16 server.number=8.5.16.0 server.built=Jun 21 2017 17:01:09 UTC
將以上去掉或修改版本號即可。
刪除禁用默認管理頁面以及相關配置文件
# rm -rf /usr/local/apache-tomcat-8.5.16/webapps/* # rm -rf /usr/local/apache-tomcat-8.5.16/conf/tomcat-users.xml