Tomcat目錄解析和應用部署
Tomcat8以前是BIO,以後是NIO,NIO並不是一定能提高效能,如果請求資料量較大,NIO效能比BIO效能還要差。
servlet3.0規範支援tomcat7,servlet3.1規範支援tomcat8.
一.目錄
下圖是Tomcat的webapps目錄:
在Tomcat的webapps目錄下的每個目錄都是一個應用上下文,一般通過路徑來進行劃分,例如localhost:8080/root就可以訪問到root目錄下的內容。
所以在Tomcat架構圖中,context會有多層,意味著context可以有多個。
Conf目錄
catalina.policy:tomcat安全策略檔案,java(一次編寫到處執行,安全:java security),此檔案中編寫了各種許可權(java.security.Permission)用來控制JVM相關許可權。
catalina.properties:控制配置檔案 ,如common classloader
logging.properties:日誌配置檔案,JDK Logging
server.xml:主要server配置檔案
Context.xml:全域性context配置檔案
tomcat-users.xml:角色配置檔案(Realm檔案實現方式)
web.xml:servlet標準的web.xml部署檔案,tomcat預設實現了部分配置
不使用Tomcat處理靜態檔案不是效能不好,而是因為它要佔用埠,而埠是有限的。Jsp效能很好,也可以用html的形式去寫,但它最大的缺點是要依賴於servlet容器。
Context主要關心應用相關的東西(web app),manager,loader,realm是安全相關的,內層的servlet是通過web app控制安全的,外層的Tomcat有自己的一套安全體系。Host有自己的例項,還會帶有虛擬主機。Engine(引擎)帶有Catalina。
Lib目錄
Tomcat存放公用類庫的檔案
jasper.jar :jsp的編譯器
ecj-4.6.3.jar :eclipse java 編譯器
Logs目錄
Localhost. {date}.log : 控制檯輸出,system.out可以外接,程式碼中有個方法setOut()
Webapps目錄
簡化web應用部署的方式,在實際生產中,應用不應該部署在webapps目錄中,應該外接,比如docker映象,war包要是作為其中一部分的話,會產生很多麻煩。
二.部署web應用
方法一:放置在webapps目錄下
直接拖過去
方法二:修改conf/server.xml檔案
在host中配置context,一個host可以配置多個context,docBase和path都是可配置的,source可忽略。若是配置了path,就覆蓋了webapps目錄中的root,此時root根目錄可忽略。在connector裡面設定字符集URIEncoding=”UTF-8”。
該方式不支援動態部署,建議在生產環境中使用。
方法三:獨立的context.xml配置檔案
在Tomcat容器啟動的時候,會有一個檔案,conf/Catalina/localhost產生,在此檔案下配置獨立的context.xml檔案,路徑為:
{ContextPath}.xml,設定path屬性是無效的。根獨立context.xml配置檔案路徑:
{Engine.name}/${host.name}/ROOT.xml
要注意XML檔案的格式。
該方式可以實現熱部署,建議在開發環境使用,生產環境會影響效能。
實現熱部署,調整元素的屬性reloadable=”true”。
三.Web技術棧有兩種:
1.基於servlet的傳統技術棧
Servlet容器啟動了spring,servlet容器必須實現servlet規範。
將webapps部署到servlet容器中,而嵌入式容器web應用,可以靈活部署到任意指定位置或者通過複雜的條件判斷。
Jar啟動方式
Java -jar,參考JDK api : java.util.jar.Manifest
Jar包可以自我驅動,war包不可以,但主要看包裡面的內容,不是看字尾名,jar,war都是zip檔案,這點可以從JDK API中看出:JarFile extends ZipFile{}
可以通過設定server.xml配置檔案或者通過tomcat API在程式碼中設定host,context,port等達到控制host,context,port等的目的。當然一個host中可以有多個context,一個tomcat中可以有多個connector。
2.基於web Flux(基於netty)的非servlet技術棧。