優質博文:IT_BLOG_CN
一、Tomcat 頂層架構
Tomcat
中最頂層的容器是Server
,代表著整個服務器,從上圖中可以看出,一個Server
可以包含至少一個Service
,用于具體提供服務。Service
主要包含兩個部分:Connector
和Container
。從上圖中可以看出Tomcat
的心臟就是這兩個組件,他們的作用如下:
【1】Connector
用于處理連接相關的事情,并提供Socket
與Request
和 Response
相關的轉化;
【2】Container
用于封裝和管理Servlet
,以及具體處理Request
請求;
一個Tomcat
中只有一個Server
,一個Server
可以包含多個Service
,一個 Service
只有一個Container
,但是可以有多個Connectors
,這是因為一個服務可以有多個連接,如同時提供Http
和Https
鏈接,也可以提供向相同協議不同端口的連接,示意圖如下(Engine
、Host
、Context
下邊會說到):
多個Connector
和一個Container
就形成了一個Service
,有了Service
就可以對外提供服務了,但是Service
還要一個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非Server
莫屬了!所以整個Tomcat
的生命周期由 Server
控制。另外,上述的包含關系或者說是父子關系,都可以在tomcat
的 conf
目錄下的 server.xml
配置文件中看出。
二、簡要解釋下 server.xml 配置文件的信息
server.xml
是Tomcat
中最重要的配置文件,server.xml
的每個元素都對應了 Tomcat
中的一個組件;通過對xml
文件中元素的配置,可以實現對Tomcat
中各個組件的控制。
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener"/><Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/><Listener className="org.apache.catalina.core.JasperListener"/><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/><GlobalNamingResources><Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/></GlobalNamingResources><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeOut="20000" redirectPort="8443"/><Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/><Engine defaultHost="localhost" name="Catalina"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/></Realm><Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/><Context docBase="cas-server-webapp" path="/cas" reloadable="true" source="org.eclipse.jst.j2ee.server:cas-server-webapp"/><Context docBase="portal" path="/portal" reloadable="true" source="org.eclipse.jst.jee.server:portal"/></Host></Engine></Service>
</Server>
server.xml
的整體架構(簡潔版):
<Server><Service><Connector /><Connector /><Engine><Host><Context /><!-- 現在常常使用自動部署,不推薦配置Context元素,Context小節有詳細說明 --></Host></Engine></Service>
</Server>
【1】**頂層元素:**元素是整個配置文件的根元素,元素代表一個Engine
元素以及一組與之相連的Connector
元素。
【2】連接器: 代表了外部客戶端發送請求到特定Service
的接口;同時也是外部客戶端從特定Service
接收響應的接口。
【3】**容器:**容器的功能是處理Connector
接收進來的請求,并產生對應的響應。Engine
包含Host
,Host
包含Context
。一個 Engine
組件可以處理Service
中的所有請求,一個Host
組件可以處理發向一個特定虛擬主機的所有請求,一個Context
組件可以處理一個特定Web
應用的所有請求。
三、Tomcat 都有哪些核心組件
【1】Server
:Server
元素在最頂層,代表整個 Tomcat
容器,因此他必須是server.xml
中唯一一個最外層的元素。一個Server
元素可以有一個或多個Service
元素。
<Server port="8005" shutdown="SHUTDOWN">
</Server>
可以看到,最外層有一個 元素,shutdown
屬性表示關閉Server
的指令;port
屬性表示Server
接收shutdown
指令的端口號,設置為-1
可以禁掉該端口。Server 的主要任務,就是提供一個接口讓客戶端能夠訪問到這個 Service集合,同時維護它所包含的所有的 Service的生命周期,包含如何初始化,如何結束服務,如何找到客戶端要訪問的 Service。
【2】**Service
:**在Connector
和Engine
外面包一層,把它們組合在一起,對外提供服務。一個Service
可以包含多個Connector
,但是只能包含一個Engine
;其中Connector
的作用是從客戶端接收請求,Engine
的作用是處理接收進來的請求。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"></Service>
</Server>
如上圖,Server
中包含一個名稱為Catalina
的Service
。實際上,Tomcat
可以提供多個Service
,不同的Service
監聽不同的端口。
【3】**Connector
:**接收連接請求,創建Request
和 Response
對象用于和請求端交換數據;然后分配線程讓Engine
來處理這個請求,并把產生的Request
和Response
對象傳給Engine
。通過配置 Connector
,可以控制請求 Service的協議及端口號。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /></Service>
</Server>
通過配置第一個Connector
,客戶端可以通過8080
端口號協議訪問Tomcat
。其中,protocol
屬性規定了請求的協議,port
規定了請求的端口號,redirectPort
表示當強制要求https
而請求是 http時,重定向至端口號為8443
的Connector
,connectionTimeout
表示連接的超時時間。
在這個例子中,Tomcat
監聽Http
請求,使用的是8080
端口,而不是正式的 80
端口;實際上,在正式的生產環境中,Tomcat
也常常監聽8080
端口。而不是80
端口。這是因為在生產環境中,很少講Tomcat
直接對外開放接收請求,而是在Tomcat
和客戶端之間加一層代理服務器(如Nginx
),用于請求的轉發、負載均衡、處理靜態文件等;通過代理服務器訪問Tomcat
時,是在局域網中,因為一般仍使用8080
端口。
第二個配置Connector
,客戶端可以通過8009
端口使用AJP
協議訪問 Tomcat
。AJP
協議負責和其他的Http
服務器(如Apache
)建立連接;在把 Tomcat
與其他服務器集成時,就需要用到這個連接器,之所以使用 Tomcat
和其他服務器集成,是因為Tomcat
可以用作Servlet/JSP
容器,但是對靜態資源處理速度較慢,不如Apache
和IIS
等HTTP
服務器;因此常常將 Tomcat
和Apache
等集成,前者做Servlet
容器,后者處理靜態資源,而AJP
協議便負責Tomcat
與Apache
的連接。Tomcat
和Apache
等集成的原理如下圖:
【4】**Engine
:**Engine 組件在Service
組件有且只有一個;Engine
是Service
組件中的請求處理組件。Engine
組件從一個或多個Connector
中接收并處理,并將完成的響應返回給Connector
,最終傳遞給客戶端。前面說到,Engine
、Host
和Context
都是容器,但是它們不是平行關系,而是父子關系:Engine
包含Host
,Host
包含Context
。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"></Engine></Service>
</Server>
其中name
屬性用于日志和錯誤信息,在整個Server
中應該是唯一的。defalutHost
屬性指定了默認的host
名稱,當發往本機的請求指定的host
名稱不存在時,一律使用defaultHost
指定的host
進行處理;因此defaulthost
的值,必須與Engine
中的一個Host
組件的name
屬性值匹配。
【5】Engine
和Host
:Host
是Engine
的子容器。Engine
組件中可以內嵌1
個或者多個Host
組件,每個Host
組件代表Engine
中的一個虛擬主機。Host
組件至少有一個,且其中一個的name
必須與 Engine
組件中的defaultHost
屬性相匹配。
【6】Host
的作用:Host
虛擬主機的作用,是運行多個Web
應用(一個Context
代表一個Web
應用),并負責安裝、展開、啟動、結束每個Web
應用。Host
組件代表的虛擬主機,對應服務器中一個網絡名實體(如www.test.com](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.test.com)"或IP地址"116.25.25.25
);為了使用戶可以通過網絡名連接Tomcat
服務器,這個名字應該在DNS
服務器上注冊。
客戶端通常使用主機名來標識它們希望連接的服務器,該主機名也會包含在 HTTP
請求頭中,Tomcat
從HTTP
頭中提取出主機名,尋找名字匹配的主機。如果沒有匹配,請求會發送至默認的主機。因此默認主機不需要再DNS
服務器中注冊網絡名,因為任何與所有Host
名稱不匹配的請求,都會路由至默認主機。
【7】Host
的配置:name
屬性指定虛擬主機的主機名,一個Engine
有且只有一個Host
組件的name
屬性和Engine
組件的 defaultHost
屬性相匹配;一般情況下,主機名需要是在DNS
服務器中注冊網絡名,但是Engine
指定的defaultHost
不需要。
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host></Engine></Service>
</Server>
unpackWARs
指定了是否將代表Web
應用的WAR
文件解壓;如果是true
,通過解壓后的文件結構運行該Web
應用,如果是false
,直接使用WAR
文件運行Web
應用。
【8】Context
:Context
元素代表在虛擬主機上運行的一個Web
應用。在后文中,提到Context
、應用或Web
應用,他們都代指Web
應用,每個Web
應用基于WAR
文件,或WAR
文件解壓后對應的目錄(這里稱為應用目錄)Context
是Host
的子容器,每個Host
都可以定義任意多的Context
元素。元素的配置:Context
元素最重要的屬性是 docBase
和path
,此外reloadable
屬性也比較常用。
docBase
指定了該Web
應用使用war
包路徑,或應用目錄。需要注意的是:在自動部署場景下(配置文件位于xmlBase
中),docBase
不在appBase
目錄中,才需要指定;如果docBase
指定的war
包或應用目錄就在appBase
中,則不需要指定。因為Tomcat
會自動掃描appBase
中的war
包和應用目錄,制定了反而造成問題。
path
指定了訪問該Web
應用上下文路徑,當請求到來時,Tomcat
根據Web
應用的path
屬性與 URL匹配程度來選擇Web
應用處理相應請求。例如:Web
應用app1
的path
屬性是/app1
,Web
應用app2
的path
屬性是"/app2",那么請求/app1/index.html
會交由app1
來處理;而請求/app2/index.html
會交由 app2
來處理。如果一個Context
元素的path
屬性為"",那么這個Context
是虛擬主機的默認的Web
應用;當請求的uri
與所有的path
都不匹配時,使用該默認Web
應用來處理。
但是,需要注意的是,在自動部署場景(配置文件位于xmlBase
中),不能指定path屬性,path
屬性由配置的文件的文件名,WAR
文件的文件名或應用目錄的名稱自動推導出來。如掃描Web
應該時,發現xmlBase
目錄下的app1.xml
,或appBase
目錄下的app1.WAR
或app1
應用目錄,則該Web用于的path
屬性是app1
。如果名稱不是app1
而是ROOT
,則該Web應用時虛擬主機默認的Web
應用,此時path
屬性推導為""。
reloadable
屬性指示tomcat
是否在運行時監控在WEB-INF/classes
和WEB-INF/lib
目錄下class
文件的改動。如果值為true
,那么當class
文件改動時,會重新web
應用的重新加載。在開發環境下,reloadable
設置為ture
便于調試;但是在生產環境中設置為true
會給服務器帶來性能壓力,因此reloadable
參數的默認值為false
。在該例子中,docBase
位于Host
的appBase
目錄之外;path
屬性沒有指定,而是根據app1.xml
自動推導為app1
。
<Context docBase="D:Program Filesapp1.war" reloadable="true"></Context>
若是自動部署(即autoDeploy="true"
),那么server.xml
配置文件中沒有Context
元素的配置。這是因為Tomcat
開啟了自動部署,Web
應用沒有在 server.xml
中配置靜態部署,而是由Tomcat
通過特定的規則自動部署。
四、Web 的自動部署
要開啟Web
應用的自動部署,需要配置所在的虛擬主機;配置的方式就是在配置Host
元素的 deployOnStartup
和autoDeploy
屬性。如果deployOnStartup
和autoDeploy
設置為true
,則tomcat
啟動自動部署:當檢測到新的Web
應用或Web
應用更新時,會觸發應用的部署(或重新部署)。
二者的主要區別在于
【1】deployeOnStartup
為true
時,Tomcat
在啟動時檢查Web
應用,且檢測到所有的Web
應用都試做新應用;
【2】autoDeploy
為true
時,Tomcat
在運行時定期檢查新的Web
應用或Web
應用的更新;
通過配置
deployOnStartup
和autoDeploy
可以開啟虛擬主機自動部署Web
應用;實際上,自動部署依賴于檢查是否有新的或更改過的Web
應用,而Host
元素中的appBase
和xml
配置設置了檢查Web
應用更新的目錄。
其中,appBase
屬性指定Web
應用所在的目錄,默認值是webapps
,這是一個相對路徑,代表 Tomcat
根目錄下的webapps
文件夾。xmlBase
屬性指定Web
應用的XML
配置文件所在的目錄,默認值為conf/<engine_name><engine_name>
,例如上面例子中,主機localhost
的xmlBase
的默認值是$TOMCAT_HOME/conf/Catalina/localhost
。
五、appBase 和 docBase的區別
【1】**appBase
:這個目錄下面的子目錄將自動被部署為應用,且war
文件將被自動解壓縮并部署為應用,默認為tomcat
下webapps
目錄。
【2】docBase
:**指定需要關聯的項目自動解壓并部署到appBase
目錄下。項目的名稱由path
屬性決定。
先部署 需要注意,docBase
所在的文件或者war
包必須存在。否則項目啟動找不到對應的目錄。此時文件解壓到appBase
目錄下,根據path
屬性,決定解壓后的文件名。
若采用了<Host name="localhost" appBase="webapp" autoDeploy="true">
配置,那么appBase
目錄下的應用目錄將會再次部署。此時項目是部署了兩遍。解決辦法,設置autoDeploy="false"
。
六、Tomcat 頂層架構小結
【1】Tomcat
中只有一個Server
,一個Server
可以有多個Service
,一個Service
可以有多個 Connector
和一個Container
;
【2】Server
掌管著整個Tomcat
的生死大權;
【3】Service
是對外提供服務的;
【4】Connector
用于接受請求并將請求封裝成Request
和Response
來具體處理;
【5】Container
用于封裝和管理Servlet
,以及具體處理Request
請求;
知道了整個Tomcat
頂層的分層架構和各個組件之間的關系以及作用,對于絕大多數的開發人員來說 Server
和Service
對我們來說確實很遠,而我們開發中絕大部分進行配置的內容是屬于Connector
和 Container
的,所以接下來介紹一下Connector
和Container
。
七、Connector 和 Container的微妙關系
由上述內容我們大致可以知道一個請求發送到Tomcat
之后,首先經過Service
然后會交給我們的 Connector
,Connector
用于接收請求并將接收的請求封裝為Request
和Response
來具體處理,Request
和Response
封裝完之后再交由Container
進行處理,Container
處理完請求之后再返回給 Connector
,最后在由Connector
通過Socket
將處理的結果返回給客戶端,這樣整個請求的就處理完了!
Connector
最底層使用的是Socket
來進行連接的,Request
和Response
是按照HTTP
協議來封裝的,所以Connector
同時需要實現TCP/IP
協議和HTTP
協議。Tomcat
既然處理請求,那么肯定需要先接收到這個請求,接收請求這個東西我們首先就需要看一下Connector
。
八、Container 架構分析
Container
用于封裝和管理Servlet
,以及具體處理Request
請求,在Connector
內部包含了4
個子容器,結構圖如下:
4個子容器的作用分別是:
【1】Engine
:引擎,用來管理多個站點,一個Service
最多只能有一個Engine
;
【2】Host
:代表一個站點,也可以叫虛擬主機,通過配置Host
就可以添加站點;
【3】Context
:代表一個應用程序,對應著平時開發的一套程序,或者一個WEB-INF
目錄以及下面的web.xml
文件;
【4】Wrapper
:每一Wrapper
封裝著一個Servlet
;
下面找一個Tomcat
的文件目錄對照一下,如下圖所示:
Context
和Host
的區別是Context
表示一個應用,我們的Tomcat
中默認的配置下webapps
下的每一個文件夾目錄都是一個Context
,其中ROOT
目錄中存放著主應用,其他目錄存放著子應用,而整個 webapps就是一個 Host站點。我們訪問應用Context
的時候,如果是ROOT
下的則直接使用域名就可以訪問,例如:www.ledouit.com,如果是Host(webapps)
下的其他應用,則可以使用 www.ledouit.com/docs 進行訪問,當然默認指定的根應用ROOT
是可以進行設定的,只不過Host
站點下默認的主營用是ROOT
目錄下的。
看到這里我們知道Container
是什么,但是還是不知道Container
是如何進行處理的以及處理完之后是如何將處理完的結果返回給Connector
的。
十、Container 如何處理請求的
Container
處理請求是使用Pipeline-Valve
管道來處理的!(Valve
是閥門之意)Pipeline-Valve
是責任鏈模式,責任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責做自己相應的處理,處理完之后將處理后的請求返回,再讓下一個處理著繼續處理。
但是!Pipeline-Valve
使用的責任鏈模式和普通的責任鏈模式有些不同!區別主要有以下兩點:
【1】每個Pipeline
都有特定的Valve
,而且是在管道的最后一個執行,這個Valve
叫做BaseValve
,BaseValve
是不可刪除的;
【2】在上層容器的管道的BaseValve
中會調用下層容器的管道。
我們知道Container
包含四個子容器,而這四個子容器對應的BaseValve
分別在:StandardEngineValve
、StandardHostValve
、StandardContextValve
、StandardWrapperValve
。Pipeline
的處理流程圖如下:
【1】Connector
在接收到請求后會首先調用最頂層容器的Pipeline
來處理,這里的最頂層容器的 Pipeline
就是EnginePipeline
(Engine
的管道);
【2】在Engine
的管道中依次會執行EngineValve1
、EngineValve2
等等,最后會執行 StandardEngineValve
,在StandardEngineValve
中會調用Host
管道,然后再依次執行Host
的 HostValve1
、HostValve2
等,最后在執行StandardHostValve
,然后再依次調用Context
的管道和 Wrapper
的管道,最后執行到StandardWrapperValve
。
【3】當執行到StandardWrapperValve
的時候,會在StandardWrapperValve
中創建FilterChain
,并調用其 doFilter
方法來處理請求,這個FilterChain
包含著我們配置的與請求相匹配的Filter
和Servlet
,其 doFilter
方法會依次調用所有的Filter
的doFilter
方法和Servlet
的service
方法,這樣請求就得到了處理!
【4】當所有的Pipeline-Valve
都執行完之后,并且處理完了具體的請求,這個時候就可以將返回的結果交給Connector
了,Connector
在通過Socket
的方式將結果返回給客戶端。
十一、tomcat 容器是如何創建 servlet類實例?用到了什么原理?
當容器啟動時,會讀取在webapps
目錄下所有的web
應用中的web.xml
文件,然后對xml
文件進行解析,并讀取servlet
注冊信息。然后,將每個應用中注冊的servlet
類都進行加載,并通過反射的方式實例化。(有時候也是在第一次請求時實例化)在servlet
注冊時加上如果為正數,則在一開始就實例化,如果不寫或為負數,則第一次請求實例化。
十二、共享 session處理
目前的處理方式有如下幾種:
【1】使用Tomcat
本身的Session
復制功能。參考http://ajita.iteye.com/blog/1715312
(Session
復制的配置)方案的有點是配置簡單,缺點是當集群數量較多時,Session
復制的時間會比較長,影響響應的效率;
【2】使用第三方來存放共享Session
:目前用的較多的是使用memcached
來管理共享Session
,借助于memcached-sesson-manager
來進行Tomcat
的Session
管理。參考http://ajita.iteye.com/blog/1716320
(使用MSM
管理Tomcat
集群session
)
【3】使用黏性session
的策略:對于會話要求不太強(不涉及到計費,失敗了允許重新請求下等)的場合,同一個用戶的session
可以由nginx
或者apache
交給同一個Tomcat
來處理,這就是所謂的 session sticky
策略,目前應用也比較多。參考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)Nginx
默認不包含session sticky
模塊,需要重新編譯才行(windows
下我也不知道怎么重新編譯)優點是處理效率高多了,缺點是強會話要求的場合不合適。
十三、關于 Tomcat 的 session數目
這個可以直接從Tomcat
的web
管理界面去查看即可,或者借助于第三方工具Lambda Probe
來查看,它相對于Tomcat
自帶的管理稍微多了點功能,但也不多 ;
十四、Tomcat 一個請求的完整過程
首先DNS
解析機器,一般是ng
服務器ip
地址,然后ng
根據server
的配置,尋找路徑為yy/
的機器列表,ip
和端口。最后 選擇其中一臺機器進行訪問。下面為詳細過程:
【1】請求被發送到本機端口8080
,被在那里偵聽的Coyote HTTP/1.1 Connector
獲得;
【2】Connector
把該請求交給它所在的Service
的Engine
來處理,并等待來自Engine
的回應;
【3】Engine
獲得請求localhost/yy/index.jsp
,匹配它所擁有的所有虛擬主機Host
;
【4】Engine
匹配到名為 localhost 的 Host(即使匹配不到也把請求交給該 Host處理,因為該Host被定義為該 Engine的默認主機);
【5】localhost Host
獲得請求/yy/index.jsp
,匹配它所擁有的所有Context
;
【6】Host
匹配到路徑為/yy
的Context
(如果匹配不到就把該請求交給路徑名為”“的Context
去處理);
【7】path=”/yy”
的Context
獲得請求/index.jsp
,在它的mapping table
中尋找對應的servlet
;
【8】Context
匹配到URL PATTERN
為*.jsp
的servlet
,對應于JspServlet
類;
【9】構造HttpServletRequest
對象和HttpServletResponse
對象,作為參數調用JspServlet
的doGet
或 doPost
方法;
【10】Context
把執行完了之后的HttpServletResponse
對象返回給Host
;
【11】Host
把HttpServletResponse
對象返回給Engine
;
【12】Engine
把HttpServletResponse
對象返回給Connector
;
【13】Connector
把HttpServletResponse
對象返回給客戶browser
;
十五、Tomcat 工作模式
Tomcat
是一個JSP/Servlet
容器。其作為Servlet
容器,有三種工作模式:獨立的Servlet
容器、進程內的Servlet
容器和進程外的Servlet
容器。進入Tomcat
的請求可以根據Tomcat
的工作模式分為如下兩類:
【1】Tomcat
作為應用程序服務器:請求來自于前端的web
服務器,這可能是Apache
, IIS
, Nginx
等;
【2】Tomcat
作為獨立服務器:請求來自于web
瀏覽器;
Tomcat
的工作一般分為三種:
【1】bio
: 傳統的Java I/O
操作,同步且阻塞I/O
,一個線程處理一個請求,并發量高時,線程數較多,浪費資源;(已經很少有人在使用)
【2】nio
: JDK1.4
開始支持,同步阻塞或同步非阻塞IO
,可以通過少量的線程來處理大量的請求;(從Tomcat 8
版本開始默認就是這種模式)
【3】apr
: 以JNI
的形式調用Apache HTTP
服務器的核心動態鏈接庫來處理文件讀取或網絡傳輸操作,從而大大地提高Tomcat
對靜態文件的處理性能;(企業中使用較多)
十六、如何對 Tomcat 進行優化
【1】關閉Manager
管理頁面;(默認已經關閉)
【2】關閉host-mangent
管理頁面;(默認已經關閉)
【3】對Tomcat
日志進行分割;
【4】定義Tomcat 404
錯誤返回的頁面;
【5】對JVM
進行優化;
【6】對Tomcat
線程池進行優化;
十七、如何對 Tomcat 進行優化
【1】關閉Manager
管理頁面;(默認已經關閉)
【2】關閉host-mangent
管理頁面;(默認已經關閉)
【3】對Tomcat
日志進行分割;
【4】定義Tomcat 404
錯誤返回的頁面;
【5】對JVM
進行優化;
【6】對Tomcat
線程池進行優化;
【7】更改Tomcat
的工作的模式;