作者:破解孤獨
來源:
https://www.cnblogs.com/L-Test/p/10611126.html
一、下載地址
https://Tomcat.Apache.org/download-80.cgi
二、安裝步驟
將安裝包
apache-tomcat-8.5.39.tar.gz 上傳至服務器 /usr/local 目錄下,再執行如下步驟:
[root@admin local]# cd /usr/local
[root@admin local]# tar -zxvf apache-tomcat-8.5.39.tar.gz // 解壓壓縮包
[root@admin local]# mv apache-tomcat-8.5.39 tomcat-8.5.39 // 重命名tomcat目錄
啟動tomcat(JDK已經安裝好并配置了環境變量):
[root@admin local]# cd ./tomcat-8.5.39/bin
[root@admin bin]# ./startup.sh // 啟動tomcat
啟動成功,如下圖:
三、監控
通過以下網址打開tomcat管理頁面,默認端口為8080(如果不能打開則關閉服務器防火墻或者開放8080端口)
右側的 Server Status Manager App 和 Host Manager代表tomcat的管理頁面,想要進入這三個頁面首先需要配置服務器上tomcat安裝目錄下的conf/tomcat-users.xml文件,如果不做配置則會返回403頁面,如下:
在conf/tomcat-users.xml添加如下配置,再重啟tomcat
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="admin,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status"/>
Tomcat8如果在上面配置的基礎上,訪問時會報403錯誤,所以需要修改
conf/Catalina/localhost/manager.xml 文件(如果沒有的話新建)。配置內容如下:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
再次重啟tomcat后,就能進入Server Status Manager APP 和 Host Manager這三個頁面了。
Server Status
Status-JVM
- Free memory:剩余內存;
- Total menory:總內存;
- Max menory:最大內存;
Status-HTTP
- Max threads:最大線程數;
- Current thread count:當前線程數;
- Current thread busy:當前忙碌線程數;
- Max processing time:最大處理時間;
- ms Processing time:最短處理時間;
- Request count:請求數;
- Error count:錯誤數;
- Bytes received:接受字節;
- Bytes sent:發送字節;
Manager APP
該頁面用來管理Web項目,部署在Tomcat下的項目可以通過該頁面來管理,如下:
Host Manager
該頁面用于管理主機
四、調優
1、Tomcat的運行模式有三種:
BIO
性能比較低下,沒有經過任何優化處理和支持。一個線程處理一個請求。缺點:并發量高時,線程數較多,浪費資源。Tomcat7或以下,在linux系統中默認使用這種方式。
NIO
nio(new I/O),是JAVA SE 1.4及后續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基于緩沖區、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的并發運行性能。
利用Java的異步IO處理,可以通過少量的線程處理大量的請求。
Tomcat8在Linux系統中默認使用這種方式。
Tomcat7必須修改Connector配置來啟動:
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443"/>
APR
安裝起來最困難,但是從操作系統級別來解決異步的IO問題,能夠大幅度的提高性能。即Apache PortableRuntime,從操作系統層面解決IO阻塞問題。
Tomcat7或Tomcat8在Win7或以上的系統中啟動默認使用這種方式。
Linux如果安裝了apr和native,Tomcat直接啟動就支持apr。
具體安裝辦法 參見這個地址:
https://my.oschina.net/lsw90/blog/181161
Tomcat啟動的時候,可以通過log看到Connector使用的是哪一種運行模式:
StartingProtocolHandler ["http-bio-8080"]
StartingProtocolHandler ["http-nio-8080"]
StartingProtocolHandler ["http-apr-8080"]
Tomcat7及以下版本啟動啟動NIO模式:
修改server.xml里的Connector節點,修改protocol為:
org.apache.coyote.http11.Http11NioProtocol,如下:
修改前:
修改后:
為什么它不直接改成NIO的形式呢?
這個方式是利用了jdk 1.4及后續版本提供的一種新的I/O操作方式(即java.nio包及其子包)為橋梁實現的,不改成這種優化方式就是為了兼容1.4之前的JAVA項目也能跑起來。
2、線程池(執行器)
Connector節點:
官方文檔:
https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
默認的tomcat沒有啟用線程池,在tomcat中每一個用戶請求都是一個線程,所以可以使用線程池提高性能。這里前臺其實有一個調度線程,然后調度線程會放入線程池內,然后到到一定的時候線程池的任務變成工作線程。
開啟線程池:
maxThreads配置為500,但顯示為-1,查詢官方文檔發現:
意思是該屬性配置處理并發請求的最大線程數,如果不配置默認值是200。如果配置了executor屬性,這個屬性會被忽略。注意斜體部分提到:如果executor設置了值,使用JMX查看的時候這個值會是-1,這是正常的。
詳細參數解釋如下:
將原有的Executor標簽內容替換成如下內容
<Executor name="tomcatThreadPool" --線程池名
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="30"
maxIdleTime="60000"
prestartminSpareThreads = "true"
maxQueueSize = "100"/>
- maxThreads:最大并發數,默認設置 200,一般建議在 500 ~ 800,根據硬件設施和業務來判斷
- minSpareThreads:Tomcat 初始化時創建的線程數,默認設置 25
- maxIdleTime:如果當前線程大于初始化線程,那空閑線程存活的時間,單位毫秒,默認60000=60秒=1分鐘。
- prestartminSpareThreads:在 Tomcat 初始化的時候就初始化 minSpareThreads 的參數值,如果不等于 true,minSpareThreads 的值就沒啥效果了
- maxQueueSize:最大的等待隊列數,超過則拒絕請求
將原有的Connector標簽內容替換成如下內容
替換后訪問速度肯定會比以前快
- 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
- connectionTimeout:Connector接受一個連接后等待的時間(milliseconds),默認值是60000。
- 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,TCP_NO_DELAY選項將被設置在服務器套接字,而在大多數情況下提高性能。這是默認設置為true。
- connectionLinger:秒數在這個連接器將持續使用的套接字時關閉。默認值是 -1,禁用socket 延遲時間。
- server:隱藏Tomcat版本信息,首先隱藏HTTP頭中的版本信息
Executor節點:
官方文檔:
https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html
五、AJP協議
Tomcat最主要的功能是提供Servlet/JSP容器,盡管它也可以作為獨立的Java Web服務器,但它對靜態資源(如HTML文件或圖像文件)的處理速度,以及提供的Web服務器管理功能方面都不如其他專業的HTTP服務器,如IIS和Apache服務器。因此在實際應用中,常常把Tomcat與其他HTTP服務器集成。對于不支持Servlet/JSP的HTTP服務器,可以通過Tomcat服務器來運行Servlet/JSP組件。
Tomcat服務器通過Connector連接器組件與客戶程序建立連接,Connector組件負責接收客戶的請求,以及把Tomcat服務器的響應結果發送給客戶。默認情況下,Tomcat在server.xml中配置了兩種連接器:
- 第一個連接器監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。
- 第二個連接器監聽8009端口,負責和其他的HTTP服務器建立連接。在把Tomcat與其他HTTP服務器集成時,就需要用到這個連接器。
在實際應用中,如果網站的訪問量非常大,為了提高訪問速度,可以將多個Tomcat服務器與Apache集成,讓它們共同分擔運行Servlet/JSP組件的任務。JK插件的loadbalancer(負載平衡器)負責根據在workers.properties文件中預先配置的lbfactor(負載平衡因數)為這些Tomcat服務器分配工作負荷,實現負載平衡。那么,Apache和Tomcat結合的時候,會有如下現象:
- Apache會攔截所有請求,將servlet和JSP(.jsp結尾)請求通過AJP交給Tomcat處理,然后再把結果拿到Apache然后返回;
- Apache將靜態資源的訪問,(類似html/css/jpg等類型的文件)自己直接處理不交給Tomcat,直接返回;
- Apache和Tomcat結合之后,Tomcat的HTTP Connector永遠不會被用到了,而是用AJP Connector;