版本說明javascript
本文使用 Tomcat 版本爲 Tomcat 8.5.24。css
Tomcat 8.5 要求 JDK 版本爲 1.7 以上。html
Tomcat 是由 Apache 開發的一個 Servlet 容器,實現了對 Servlet 和 JSP 的支持,並提供了做爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。java
因爲 Tomcat 自己也內含了一個 HTTP 服務器,它也能夠被視做一個單獨的 Web 服務器。可是,不能將 Tomcat 和 Apache HTTP 服務器混淆,Apache HTTP 服務器是一個用 C 語言實現的 HTTP Web 服務器;這兩個 HTTP web server 不是捆綁在一塊兒的。Tomcat 包含了一個配置管理工具,也能夠經過編輯XML格式的配置文件來進行配置。python
*.sh
文件用於 Unix 系統; *.bat
文件用於 Windows 系統。通常 web 項目路徑結構linux
|-- webapp # 站點根目錄 |-- META-INF # META-INF 目錄 | `-- MANIFEST.MF # 配置清單文件 |-- WEB-INF # WEB-INF 目錄 | |-- classes # class文件目錄 | | |-- *.class # 程序須要的 class 文件 | | `-- *.xml # 程序須要的 xml 文件 | |-- lib # 庫文件夾 | | `-- *.jar # 程序須要的 jar 包 | `-- web.xml # Web應用程序的部署描述文件 |-- <userdir> # 自定義的目錄 |-- <userfiles> # 自定義的資源文件
webapp
:工程發佈文件夾。其實每一個 war 包均可以視爲 webapp 的壓縮包。nginx
META-INF
:META-INF 目錄用於存放工程自身相關的一些信息,元文件信息,一般由開發工具,環境自動生成。web
WEB-INF
:Java web應用的安全目錄。所謂安全就是客戶端沒法訪問,只有服務端能夠訪問的目錄。apache
/WEB-INF/classes
:存放程序所須要的全部 Java class 文件。vim
/WEB-INF/lib
:存放程序所須要的全部 jar 文件。
/WEB-INF/web.xml
:web 應用的部署配置文件。它是工程中最重要的配置文件,它描述了 servlet 和組成應用的其它組件,以及應用初始化參數、安全管理約束等。
tomcat安裝過程
上傳 apache-tomcat-8.0.52.tar.gz 和JDK-1.8.0
tar -xvf jdk-1.8.0 -C /application/ ln -s /application/jdk1.7.0_79/ /application/jdk sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile source /etc/profile java -version 至此JDK安裝完成 tar -xvf apache-tomcat-8.0.52.tar.gz -C /application/ ln -s /application/apache-tomcat-8.0.52 /application/tomcat echo 'export TOMCAT_HOME=/application/tomcat' >> /etc/profile source /etc/profile chown -R root.root /application/jdk /application/tomcat/
至此tomcat 安裝完成
若是啓動
# /application/tomcat/bin/startup.sh #若是想弄/etc/init.d/寫個腳本調用這個就行
關閉程序
# /application/tomcat/bin/shutdown.sh #############
TOMCAT 日誌文件
catalina.out ###若是有問題看這個文件日誌
# vim tomcat-users.xml 開啓網頁的管理功能,可是不安全,生產環境不建議使用,測試可使用
<role rolename="manager-gui"/> <role rolename="admin-gui/> <user username="tomcat" password="tomcat" roles="manager-gui.admin-gui"/>
mv docs/ examples/ host-manager/ manager/ /tmp/ 都移走,就不會有安全隱患了
mv ROOT/* /tmp/
##########tomcat主配置文件 server.xml
war包放在webapps下面就能夠被訪問了
若是想修改默認路徑能夠填寫如下信息
125 <Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
######tomcat多實例
# cp -a apache-tomcat-8.0.52 tomcat1 ###cp整個目錄
vim /application/tomcat1/conf/server.xml
22 8005---8011####這是關閉程序的端口
69 8080---8081 ####這是程序的端口號
123 <Host name="localhost" appBase="/data/www/www"
124 unpackWARs="true" autoDeploy="true">
mkdir /data/www/www/ROOT -p tomcat多站點統一用的目錄
vim index.jsp
<html> <body> <center>Now time is: <%=new java.util.Date()%></center> </body> </html>
10.240.17.17:8081 訪問
###tomcat集羣
vim nginx.conf
server {
listen 80;
server_name tomcat.abc.com;
location / {
proxy_pass http://tomcatpoll;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
定義個upstream tomcatpoll{
10.0.0.1:8080 weight=1 max_fails=3 fail_timeout20s;
10.0.0.2:8081 weight=1 max_fails=3 fail_timeout20s;
}
################以上集羣就能夠了。
Tomcat 的缺省配置是不能穩定長期運行的,也就是不適合生產環境,它會死機,讓你不斷從新啓動,甚至在午夜時分喚醒你。對於操做系統優化來講,是儘量的增大可以使用的內存容量、提升CPU 的頻率,保證文件系統的讀寫速率等。通過壓力測試驗證,在併發鏈接不少的狀況下,CPU 的處理能力越強,系統運行速度越快。
Tomcat 的優化不像其它軟件那樣,簡簡單單的修改幾個參數就能夠了,它的優化主要有三方面,分爲系統優化,Tomcat 自己的優化,Java 虛擬機(JVM)調優。系統優化就不在介紹了,接下來就詳細的介紹一下 Tomcat 自己與 JVM 優化,以 Tomcat 7 爲例。
Tomcat 自己優化
Tomcat 的自身參數的優化,這塊很像 ApacheHttp Server。修改一下 xml 配置文件中的參數,調整最大鏈接數,超時等。此外,咱們安裝 Tomcat 是,優化就已經開始了。
一、工做方式選擇
爲了提高性能,首先就要對代碼進行動靜分離,讓 Tomcat 只負責 jsp 文件的解析工做。如採用 Apache 和 Tomcat 的整合方式,他們之間的鏈接方案有三種選擇,JK、http_proxy 和 ajp_proxy。相對於 JK 的鏈接方式,後兩種在配置上比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言不像JK 這樣久經考驗,因此建議採用 JK 的鏈接方式。
二、Connector 鏈接器的配置
以前文件介紹過的 Tomcat 鏈接器的三種方式: bio、nio 和 apr,三種方式性能差異很大,apr 的性能最優, bio 的性能最差。而 Tomcat 7 使用的 Connector 默認就啓用的 Apr 協議,但須要系統安裝 Apr 庫,不然就會使用 bio 方式。
三、配置文件優化
配置文件優化其實就是對 server.xml 優化,能夠提大大提升 Tomcat 的處理請求的能力,下面咱們來看 Tomcat 容器內的優化。
默認配置下,Tomcat 會爲每一個鏈接器建立一個綁定的線程池(最大線程數 200),服務啓動時,默認建立了 5 個空閒線程隨時等待用戶請求。
首先,打開 ${TOMCAT_HOME}/conf/server.xml,搜索【<Executor name="tomcatThreadPool"】,開啓並調整爲
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="20" maxSpareThreads="50" maxIdleTime="60000"/>
注意, Tomcat 7 在開啓線程池前,必定要安裝好 Apr 庫,並能夠啓用,不然會有錯誤報出,shutdown.sh 腳本沒法關閉進程。
而後,修改<Connector …>節點,增長 executor 屬性,搜索【port="8080"】,調整爲
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="30000" enableLookups="false" disableUploadTimeout="false" connectionUploadTimeout="150000" acceptCount="300" keepAliveTimeout="120000" maxKeepAliveRequests="1" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" redirectPort="8443" />
maxThreads :Tomcat 使用線程來處理接收的每一個請求,這個值表示 Tomcat 可建立的最大的線程數,默認值是 200
minSpareThreads:最小空閒線程數,Tomcat 啓動時的初始化的線程數,表示即便沒有人使用也開這麼多空線程等待,默認值是 10。
maxSpareThreads:最大備用線程數,一旦建立的線程超過這個值,Tomcat 就會關閉再也不須要的 socket 線程。
上邊配置的參數,最大線程 500(通常服務器足以),要根據本身的實際狀況合理設置,設置越大會耗費內存和 CPU,由於 CPU 疲於線程上下文切換,沒有精力提供請求服務了,最小空閒線程數 20,線程最大空閒時間 60 秒,固然容許的最大線程鏈接數還受制於操做系統的內核參數設置,設置多大要根據本身的需求與環境。固然線程能夠配置在「tomcatThreadPool」中,也能夠直接配置在「Connector」中,但不能夠重複配置。
URIEncoding:指定 Tomcat 容器的 URL 編碼格式,語言編碼格式這塊倒不如其它 WEB 服務器軟件配置方便,須要分別指定。
connnectionTimeout: 網絡鏈接超時,單位:毫秒,設置爲 0 表示永不超時,這樣設置有隱患的。一般可設置爲 30000 毫秒,可根據檢測實際狀況,適當修改。
enableLookups: 是否反查域名,以返回遠程主機的主機名,取值爲:true 或 false,若是設置爲false,則直接返回IP地址,爲了提升處理能力,應設置爲 false。
disableUploadTimeout:上傳時是否使用超時機制。
connectionUploadTimeout:上傳超時時間,畢竟文件上傳可能須要消耗更多的時間,這個根據你本身的業務須要本身調,以使Servlet有較長的時間來完成它的執行,須要與上一個參數一塊兒配合使用纔會生效。
acceptCount:指定當全部可使用的處理請求的線程數都被使用時,可傳入鏈接請求的最大隊列長度,超過這個數的請求將不予處理,默認爲100個。
keepAliveTimeout:長鏈接最大保持時間(毫秒),表示在下次請求過來以前,Tomcat 保持該鏈接多久,默認是使用 connectionTimeout 時間,-1 爲不限制超時。
maxKeepAliveRequests:表示在服務器關閉以前,該鏈接最大支持的請求數。超過該請求數的鏈接也將被關閉,1表示禁用,-1表示不限制個數,默認100個,通常設置在100~200之間。
compression:是否對響應的數據進行 GZIP 壓縮,off:表示禁止壓縮;on:表示容許壓縮(文本將被壓縮)、force:表示全部狀況下都進行壓縮,默認值爲off,壓縮數據後能夠有效的減小頁面的大小,通常能夠減少1/3左右,節省帶寬。
compressionMinSize:表示壓縮響應的最小值,只有當響應報文大小大於這個值的時候纔會對報文進行壓縮,若是開啓了壓縮功能,默認值就是2048。
compressableMimeType:壓縮類型,指定對哪些類型的文件進行數據壓縮。
noCompressionUserAgents="gozilla, traviata": 對於如下的瀏覽器,不啓用壓縮。
若是已經對代碼進行了動靜分離,靜態頁面和圖片等數據就不須要 Tomcat 處理了,那麼也就不須要配置在 Tomcat 中配置壓縮了。
以上是一些經常使用的配置參數屬性,固然還有好多其它的參數設置,還能夠繼續深刻的優化,HTTP Connector 與 AJP Connector 的參數屬性值,能夠參考官方文檔的詳細說明:
https://tomcat.apache.org/tomcat-7.0-doc/config/http.html
https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html
2、JVM 優化
Tomcat 啓動命令行中的優化參數,就是 JVM 的優化 。Tomcat 首先跑在 JVM 之上的,由於它的啓動其實也只是一個 java 命令行,首先咱們須要對這個 JAVA 的啓動命令行進行調優。不論是 YGC 仍是 Full GC,GC 過程當中都會對致使程序運行中中斷,正確的選擇不一樣的 GC 策略,調整 JVM、GC 的參數,能夠極大的減小因爲 GC 工做,而致使的程序運行中斷方面的問題,進而適當的提升 Java 程序的工做效率。可是調整 GC 是以個極爲複雜的過程,因爲各個程序具有不一樣的特色,如:web 和 GUI 程序就有很大區別(Web能夠適當的停頓,但GUI停頓是客戶沒法接受的),並且因爲跑在各個機器上的配置不一樣(主要 cup 個數,內存不一樣),因此使用的 GC 種類也會不一樣。
一、JVM 參數配置方法
Tomcat 的啓動參數位於安裝目錄 ${JAVA_HOME}/bin目錄下,Linux 操做系統就是 catalina.sh 文件。JAVA_OPTS,就是用來設置 JVM 相關運行參數的變量,還能夠在 CATALINA_OPTS 變量中設置。關於這 2 個變量,仍是多少有些區別的:
JAVA_OPTS:用於當 Java 運行時選項「start」、「stop」或「run」命令執行。
CATALINA_OPTS:用於當 Java 運行時選項「start」或「run」命令執行。
爲何有兩個不一樣的變量?它們之間都有什麼區別呢?
首先,在啓動 Tomcat 時,任何指定變量的傳遞方式都是相同的,能夠傳遞到執行「start」或「run」命令中,但只有設定在 JAVA_OPTS 變量裏的參數被傳遞到「stop」命令中。對於 Tomcat 運行過程,可能沒什麼區別,影響的是結束程序,而不是啓動程序。
第二個區別是更微妙,其餘應用程序也可使用 JAVA_OPTS 變量,但只有在 Tomcat 中使用 CATALINA_OPTS 變量。若是你設置環境變量爲只使用 Tomcat,最好你會建議使用 CATALINA_OPTS 變量,而若是你設置環境變量使用其它的 Java 應用程序,例如 JBoss,你應該把你的設置放在JAVA_OPTS 變量中。
二、JVM 參數屬性
32 位系統下 JVM 對內存的限制:不能突破 2GB ,那麼這時你的 Tomcat 要優化,就要講究點技巧了,而在 64 位操做系統上不管是系統內存仍是 JVM 都沒有受到 2GB 這樣的限制。
針對於 JMX 遠程監控也是在這裏設置,如下爲 64 位系統環境下的配置,內存加入的參數以下:(如下內容若是報錯,建議放一行,把雙引號去掉可解決)
set CATALINA_OPTS=" -server -Xms6000M -Xmx6000M -Xss512k -XX:NewSize=2250M -XX:MaxNewSize=2250M -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=31 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Duser.timezone=Asia/Shanghai -Djava.awt.headless=true"