Tomcat
概述:
Tomcat在嚴格意思上並不是一個真正的應用服務器,只是一個可以支持servlet、JSP的web容器
它擴展了一些應用服務器的功能,如JNDI,數據庫連接池,用戶事務處理等,是Apache組織下的子項目。
目前Tomcat被非常廣泛的應用於中小規模的Javaweb應用中
優點:
1.容易得到,直接去官網下載
2.對於開發人員,特別是Java開發人員,Tomcat提供了全部的源代碼
包括servlet引擎,JSP引擎,http服務器,
3.TOMCAT使用率很高,基本和主流的服務器一起工作
由於Java的跨平臺特性,基於Java的Tomcat也具有跨平臺性
Tomcat目錄:
bin:存放啓動和關閉Tomcat腳本
conf:存放不同的配置文件(server.xml和web.xml)
doc:存放Tomcat文檔
logs:存放Tomcat執行時的log文件
src:存放Tomcat的源代碼
webapps:主要存放web發佈的目錄(應用程序的示例)
work:存放JSP編譯後產出的class文件
server.xml配置文件
server.xml是Tomcat的主配置文件,主要完成兩個目標:
1.提供Tomcat組件的初始配置,說明Tomcat的結構、含義,使得Tomcat通過實例化組件完成啓動及構建自身
2.觀察server.xml,可以發現裏面包含一些元素:
1.Server元素:
Server元素是server.xml文件最高級別的元素,描述一個Tomcat服務器,
一個Server元素一般會包含logger和ContextManage兩個元素
logger:
logger元素定義一個日誌對象
一個日誌對象包含哪些屬性:
1.name:表示這個日誌對象的名稱
2.path:表示這個日誌對象包含的日誌的內容要輸出哪一個日誌
3.verbositylevel:表示這個日誌文件記錄的日誌的級別
logger對象是對Java servlet,jsp,tomcat運行期事件的記錄
contextManage:
contextManage定義了一組contextInterceptors(contextManage事件監聽器),requestInterceptors(事件監聽器),contexts(web應用程序的上下文目錄)和連接器(connectors)的結構和配置
1.debug:
表示記錄日誌記錄調試信息的等級
2.home:
webapps/conf/logs和context的根目錄信息,這個屬性的作用是從一個不同的TOMCAT_HOME的目錄啓動Tomcat
3.workDir:表示Tomcat的工作目錄
注意:
contextInterceptors和requestInterceptors兩者都是監聽contextManage的特定事件的攔截器
contextInterceptors:監聽Tomcat的啓動和結束事件的信息
requestInterceptors:監聽用戶對服務器發出的請求
2.Connector元素:
Connector(連接器)元素描述了一個到用戶的連接,或者直接由Tomcat到用戶的瀏覽器還是通過web服務器
Tomcat的工作進程和由不同的用戶建立的連接來傳遞讀寫信息和請求、響應等都是由連接器對象管理
對連接器對象的配置中應該包含管理類,TCP IP 端口等內容
3.Context元素:
每一個Context元素都描述一個Tomcat的web應用程序的目錄
包含的屬性:
1.docBase:
Context目錄
2.path:
表示Context在web服務器時的虛擬目錄位置和目錄名
3.debug:
日誌記錄的調試信息的記錄等級
4.reloadable:
這個屬性可以方便servlet的開發,如果該屬性處於打開的狀態,tomcat將檢查servlet是否被更新而決定自動重新載入
配置實例:
打開Tomcat/conf/server.xml
1.改變Tomcat服務器的端口號:
需要使用connector元素,connector表示一個到用戶的連接,不管是通過web服務器或者直接到用戶瀏覽器(在一個獨立的配置中)
connect偶爾負責管理Tomcat的工作線程和讀寫連接到不同用戶的端口的請求/響應。
connector的配置包含的信息:
句柄類,句柄監聽的TCP/IP端口、句柄服務器端口的TCP/IP 的backlog
注意:
修改後必須重啓Tomcat服務器
可以將端口號改成80,需要保證80端口號沒有被其他程序佔用,另外,也可以同時配置兩個端口號,只要產生兩個connector的配置信息
server.xml配置
配置文件中的額基本配置信息:
server:
一個服務器元素代表整個cantalina的servlet容器
1.port:指定一個端口,該端口負責監聽關閉Tomcat的請求
2.shutdown:指定向端口發送命令字符串
service:
它由一個或多個連接器(connector)組成,以及Engine,負責處理所有的connector所獲得的客戶請求
1.name:指定service名稱
Connector(表示客戶端和service之間的連接):
一個Connector將在某個指定端口上監聽客戶的請求,並將獲得的請求交給Engine來處理,從Engine獲得相應的結果並返回給客戶
Tomcat有兩個典型的Connector
1.直接監聽來自browser的http請求
2.監聽來自其他的webService的請求
注意:
coyote http/1.1 Connector在端口8080處監聽客戶來自browser的http請求
coyote jk1.3 Connector在端口8009處監聽來自其他的webServer(Apache)的servlet/jsp的代理請求
1.port:指定服務器端需要創建的端口號,並可以在這個端口監聽來自客戶端的請求
2.minProcessors:爲服務器啓動時創建處理請求的線程數(最小)
3.MaxProcessors:最大可以創建處理請求的線程數
4.enableLookUps:
如果爲true
則可以通過調用request.getRemoteHost();進行DNS查詢來得到遠程客戶端的實際的主機名
如果爲false:
則不進行DNS查找,返回IP地址
5.redirectport:
指定服務器正在處理http請求時收到一SSL傳輸請求後重定向的端口號
6.acceptCount:
指定當所有可以使用的處理請求的線程數,如果線程數都被使用,可以放到處理隊列中的請求數,超過了這個請求數,就不予以處理
7.connectionTimeOut:
表示超時的時間數(一般以毫秒爲單位)
Engine
概述:
Engine下可以配置多個虛擬機主機,每一個虛擬主機都有一個域名,當Engine獲得一個請求時,它把該請求匹配到某個host上,然後交由host來處理
Engine有一個默認的虛擬主機:
當請求無法匹配到任何一個host上的時候,將交給默認的host來處理(表示指定service中 的請求處理機,接受和處理來自connector的請求):
1.defaultHost:指定缺省的處理請求的主機名,它至少和其中一個host元素的name屬性值相同
Context(表示一個web 應用程序):
1.docBase:表示程序的路徑或者是WAR文件存放的路徑
2.path:表示web應用程序的前綴,如:請求URL:http://localhost:8080/path/...
3.reloadable:
如果爲true:
則Tomcat會自動檢測應用程序的/WEB—_INF/lib和/WEB—_INF/classes目錄的變化,自動加載新的應用程序,不需要重啓Tomcat
host
定義:host表示一個虛擬主機:每個虛擬主機好某個網絡域名(Domain name)相匹配
每一個虛擬主機下都可以部署一個或多個web app ,每一個webapp對應一個Context,Context path,
當host獲得一個請求時,將把該請求匹配到某個context上,然後交由context處理,
匹配的方法:最長匹配
注意:
path=""的context將成爲該host的默認的context。所有無法和其他Context的路徑名匹配的請求,都將最終和該默認的Context進行匹配。
1.name :表示指定的主機名
2.aooBase:表示應用程序的基本目錄,即存放該應用程序的目錄
3.unpackWARs:
如果爲true:
則Tomcat會自動將WAR文件解壓,反之不解壓,直接從WAR文件中運行應用程序
Logger
logger :表示日誌,調試和錯誤信息
1、className:指定logger使用的類名,此類必須實現org.apache.catalina.logger接口
2.prefix:指定logger文件的前綴
3.suffix:指定logger文件的後綴
4.timeStamp:
如果爲true:表示在log文件名中加入時間(系統時間)
如:localhost_log.2017-07-12.txt
valve(功能和logger差不多)
其中prefix和suffix屬性解釋和logger一樣
不同:
1.classname:表示指定valve的使用類名,
如:
org.apche.catalina.valve.accessLogValne類可以記錄應用程序的訪問信息
directory:表示log文件存放的位置
pattern:common方式記錄遠程主機名,IP地址、用戶名、日期、http響應代碼、發送的字節數。
Realm
Realm:表示存放用戶名、密碼、role的數據庫
1.className:表示realm的使用類名,此類必須實現 org.apche.catalina.realm接口
Tomcat管理
1.用戶管理:
在進行具體的Tomcat管理之前,可以先給Tomcat添加用戶,使這個用戶有權限進行管理
<user name="user" password="user" roles="standard,manager"/>,重啓Tomcat
在瀏覽器裏輸入http://localhost:8080/manager,會彈出一個對話框,輸入上面定義的用戶名和密碼
2.應用程序管理:
http://localhost:8080/manager/list,
瀏覽器會顯示基本信息:應用程序的路徑,當前的餓狀態,連接程序的session數
3.重新加載應用程序
在瀏覽器輸入http://localhost:8080/manager/reload?path=/exmples,
瀏覽器會顯示該exmples是否加載成功
或者:
將server.xml的context元素的reloadable屬性設置爲true,則會自動加載
4.顯示session的信息
http://localhost:8080/manager/session?path=/exmples,
5.啓動和關閉應用程序
http://localhost:8080/manager/start?path=/exmples,//啓動
http://localhost:8080/manager/stop?path=/exmples,//關閉
假設來自客戶端的請求:http://localhost:8080/abc/abc_index.jsp
1.請求被髮送到本機端口8080,被在那裏監聽的coyote HTTP/1.1 Connector獲得
2.Connector把該請求交給它所在的service的Engine來處理,並等待來自Engine的迴應
3.Engine獲得localhost:8080/abc/abc_index.jsp,匹配它所有的虛擬主機host
4.如果Engine匹配帶名字爲localhost的host(即使匹配不到也可以交給host處理,被Engine的默認主機處理)
5.localhost的host獲得請求/abc/abc_index.jsp,匹配它所有的Context
6.host匹配到路徑爲/abc的Context
7.path=“/abc”的Context獲得請求/abc_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對象返回給客戶瀏覽器