Tomcat相關知識整理

初識Servlet

  • SUN公司制定了一系列Web應用與Web服務器進行協作的標準Java接口,統稱為Java Servlet API,還對Web服務器發布及運行Web應用的一些細節做了規約。SUN公司把這一系列標準Java接口和規約統稱為Servlet規范。Servlet就是Web服務器與Web應用進行協作的標準接口。

  • Servlet規范把能夠發布和運行JavaWeb應用的Web服務器稱為Servlet容器,它的最主要的特征就是動態執行JavaWeb應用中的Servlet實現類中的程序代碼。

  • Servlet是一種運行在服務器上的小插件,其最常見的用途是擴展Web服務器的功能,可作為非常安全的、可移植的、易于使用的CGI替代品。具有以下特點:

    • 提供了可被服務器動態加載并執行的程序代碼,為來自客戶端的請求提供相應的服務;

    • Servlet完全用Java語言編寫,因此要求運行Servlet的服務器必須支持Java語言;

    • Servlet完全在服務器端運行,因此它的運行不依賴于瀏覽器。不管瀏覽器是否支持Java語言,都能請求訪問服務器端的Servlet。


Tomcat

Tomcat作為運行Servlet的容器,其基本功能是負責接收和解析來自客戶端的請求,同時把客戶端的請求傳送給相應的Servlet,并把Servlet的響應結果返回給客戶端。

Tomcat組件,分為4類:

  • 頂層類元素:包括<Server>元素和<Service>元素,它們位于整個配置文件的頂層;

  • 連接器類元素:為<Connector>元素,代表介于客戶端與服務器端之間的通信接口,負責將客戶端的請求發送給服務器端,并將服務器的響應結果返回給客戶端;

  • 容器類元素:代表處理客戶端請求并生成響應結果的組件,共有四類,分別為<Engine>、<Host><Context><Cluster>元素。Engine組件為特定的Service組件處理所有客戶端請求,Host組件為特定的虛擬主機處理所有的客戶端請求,Context組件為特定的Web應用處理所有的客戶端請求。Cluster組件負責為Tomcat集群系統進行會話復制、Context組件的屬性的復制,以及集群范圍內WAR文件的發布。

  • 嵌套類元素:代表可以被嵌入到容器中的組件,如<Valve>元素和<Realm>元素等。

Tomcat元素:

  • <Server>元素:代表整個Servlet容器組件,是Tomcat的頂級元素。在<Server>元素中可包含一個或多個<Service>元素;

  • <Service>元素:包含一個<Engine>元素,以及一個或多個<Connector>元素,這些<Connector>元素共享同一個<Engine>元素;

  • <Connector>元素:代表和客戶端實際交互的組件,負責接收客戶端請求,以及向客戶端返回響應結果;

  • <Engine>元素:每個<Service>元素只能包含一個<Engine>元素。<Engine>元素處理在同一個<Service>中所有<Connector>元素接收到的客戶端請求;

  • <Host>元素:在一個<Engine>元素中可以包含多個<Host>元素。每個<Host>元素定義了一個虛擬主機,它可以包含一個或多個Web應用;

  • <Context>元素:每個<Context>元素代表了運行在虛擬主機上的單個Web應用。在一個<Host>元素中可以包含多個<Context>元素。

Tomcat的工作模式:

(1)獨立的Servlet容器

Tomcat作為獨立的web服務器來單獨運行,Servlet容器組件作為web服務器中的一部分存在,這是Tomcat的默認工作模式。 在這種模式下,Tomcat是一個獨立進行的Java程序。和運行其他Java程序一樣,運行Tomcat需要啟動一個Java虛擬機進程,由該進程來運行Tomcat。

stand alone.png

(2)其他web服務器進程內的Servlet容器

在這種模式下,Tomcat分為web服務器插件和Servlet容器插件兩部分。web服務器插件在其他web服務器進程的內部地址空間啟動一個JVM,Servlet在此JVM中運行。如有客戶端發出調用Servlet的請求,web服務器插件獲得對此請求的控制并將它轉發(JNI通信機制)給Servlet容器組件。

進程內的servlet.png

(3)其他web服務器進程外的Servlet容器

在這種模式下,Tomcat分為web服務器插件和Servlet容器組件兩部分。web服務器插件在其他web服務器的外部地址空間啟動一個JVM進程,Servlet容器組件再次JVM中運行。如有客戶端發出調用Servlet的請求,web服務器插件獲得對此請求的控制并將它轉發(IPC通信機制)給Servlet容器組件。

當Tomcat作為獨立的Servlet容器來運行時,可看做是能運行Java Servlet的獨立web服務器。此外,Tomcat還可作為其他web服務器進程內或進程外的Servlet容器,從而與其他web服務器集成,集成的意義在于:對于不支持運行Java Servlet的其web服務器,可通過集成Tomcat來提供運行Servlet的功能。

進程外的servlet.png

Tomcat的目錄結構

  • bin:存放啟動和關閉Tomcat的腳本文件及所用到的類;

  • conf:存放Tomcat的各種配置文件,其中最重要的配置文件是server.xml;

  • logs:存放Tomcat的日志文件;

  • lib:存放Tomcat服務器及所有Web應用都可以訪問的jar文件;

  • webapps:Web應用的默認部署目錄;

  • work:Tomcat的工作目錄,Tomcat在運行時把生成的一些工作文件放于此目錄下。在默認情況下,Tomcat把編譯JSP而生成的Servlet類文件放于此目錄下;

  • tmp:臨時文件目錄。

NOTE:

  • Tomcat的lib子目錄:存放的jar文件不僅能被Tomcat訪問,還能被所有在Tomcat中發布的JavaWeb應用訪問;

  • JavaWeb應用的lib子目錄:存放的jar文件只能被當前JavaWeb應用訪問。

NOTE:

Tomcat在加載Web應用時,會把相應的web.xml文件中的數據讀入到內存中。

Context元素

主要屬性:

  • path:指定訪問該Web應用的URL入口,什么都不寫表示根路徑;

  • docBase:指定Web應用的文件路徑,可以給定絕對路徑,也可以給定相對于<Host>的appBase屬性的相對路徑。如果Web應用采用開放目錄結構,則指定Web應用的根路徑;如果Web應用是個war文件,則是定war文件的路徑;

  • className:指定實現Context組件的Java類的名字,這個類必須實現org.apache.catalina.Context接口;

  • reloadable:如果這個屬性設為true,Tomcat服務器在運行狀態下會監視在WEB-INF/classesWEB-INF/lib目錄下的class文件的改動,以監視Web應用的WEB-INF/web.xml文件的改動。如果檢測到有class文件或web.xml文件被更新,服務器會自動重新加載Web應用。

專有屬性:

  • cachingAllowed:如果為true,表示允許啟用靜態資源的緩存,默認值為true;

  • cacheMaxSize:設定靜態資源緩存的最大容量,默認為10m;

  • workDir:指定Web應用的工作目錄,Tomcat在運行時會把與這個web應用相關的臨時文件放在這個目錄下;

  • uppackWar:如果設為true,表示將把Web應用的WAR文件展開為開放目錄結構后再運行。如果設為false,則直接運行war文件。默認為true。

Host元素

主要屬性

  • name:指定虛擬主機的名字

  • className:指定實現虛擬主機的Java類的名字,這個Java類必須實現org.apache.catalina.Host接口;

  • appBase:指定虛擬主機的目錄,可以指定絕對目錄,也可以指定相對于<CATALINA_HOME>的相對路徑;

  • autoDeploy:如果設定為true,表示當Tomcat服務器處于運行狀態時,能夠檢測appBase下的文件,如果有新的Web應用加進來,則會自動發布這個Web應用;

  • deployOnStart:如果此項設置為true,則表示當Tomcat啟動時會自動發布appBase目錄下的所有Web應用。如果web應用沒有相應的context元素,那么Tomcat會提供一個默認的context組件。默認值為true。

專有屬性:

  • unpackWARS:如果設置為true,表示將把appBase屬性指定的目錄下的web應用的war文件先展開為開放的目錄結構后再運行,如果設置為false,則直接運行war文件;

  • workDir:指定虛擬主機的工作目錄,Tomcat在運行時會把與這個虛擬主機的所有web應用相關的臨時文件放在此目錄下,默認值為<CATALINA_HOME>/work。如果<Host>元素下的一個<Context>元素也設置了workDIR屬性,那么<Context>的workDir屬性會覆蓋<Host>元素的workDir屬性;

  • deployXML:如果設置為false,那么Tomcat不會解析web應用中的用于設置context元素的META-INF/context.xml文件。默認值為true。


JavaWeb

SUN的Servlet規范對JavaWeb應用的定義:JavaWeb應用由一組Servlet/JSP、HTML文件、相關Java類,以及其他可以綁定的資源構成,它可以在由各種供應商提供的符合Servlet規范的Servlet容器中運行。

JavaWeb應用包含的內容:

  • Srvlet組件:標準Servlet接口的實現類,運行在服務器端,包含了被Servlet容器動態調用的程序代碼。

  • JSP組件:包含Java程序代碼的HTML文檔,運行在服務器端。當客戶端請求JSP文件時,Servlet容器先把它翻譯成Servlet類,然后動態調用它的程序代碼。

  • 相關的Java類:開發人員自定義的與Web應用相關的Java類。

  • 靜態文檔:存放在存放在服務器端的文件系統中,如HTML文件、圖片文件等。當客戶端請求訪問這些文件時,Servlet容器先從本地文件系統中讀取這些文件的數據,再把它發送到客戶端。

  • web.xml文件:JavaWeb應用的配置文件,采用XML格式。該文件必須位于Web應用的WEB-INF目錄下。

Servlet規范規定:JavaWeb應用必須采用固定的目錄結構,即每種類型的組件在web應用中都有固定的存放目錄。

JavaWeb應用的目錄結構,以helloapp為例

  • /helloapp:此Web應用的根目錄,所有的JSP和HTML文件都存放于此目錄或用戶自定義的子目錄下(WEB-INF子目錄除外);

  • /helloapp/WEB-INF:存放此Web應用的配置文件web.xml

  • /helloapp/WEB-INF/classes:存放各種.class文件,Servlet類的.class文件也存放于此目錄下;

  • /helloapp/WEB-INF/lib:存放此Web應用所需的各種jar文件;

  • /helloapp/META-INF:當前Webapp的私有資源目錄,通常存放自用的context.xml

  • /helloapp/classes:此Webapp的私有類;

  • /helloapp/lib:此Webapp的私有類,被打包為jar格式;

  • /helloapp/index.jsp:此Webapp的主頁。

NOTE:在WEB-INF目錄的classes及lib子目錄下都可以存放類文件。在運行時,Servlet容器的類加載器先加載classes目錄下的類,再加載lib目錄下的jar文件中的類。


Tomcat閥(Valve)

Tomcat閥能夠對Catalina容器接收到的http請求進行預處理。Tomcat閥可以可以加入到3種Catalina容器中,它們是Engine、Host和Context。

Tomcat閥主要包括以下幾種:

  • 客戶訪問日志閥(Access Log Valve)

  • 遠程地址過濾器(Remote Address Filter)

  • 遠程主機過濾器(Remote Host Filter)

  • 客戶請求記錄器(Request Dumper)

1.客戶訪問日志閥

能夠將客戶端的請求信息寫到日志文件中,這些日志文件可以記錄網頁的訪問次數、訪問時間、用戶的會話活動和用戶的安全驗證信息等??蛻粼L問日志閥可以加入到Engine、Host或Context容器。

屬性:

  • className:指定閥的實現類,此處為org.apache.catalina.valves.AccessLogValve

  • directory:設定存放日志文件的絕對或相對于<CATALINA_HOME>的目錄,默認為<CATALINA_HOME>/logs;

  • pattern:設定日志的格式和內容;

  • prefix:設定日志文件名前綴,默認為access_log;

  • resolveHosts:如果設為true,表示把遠程IP地址解析為主機名;如果設為false,表示直接記錄遠程IP地址,默認為false;

  • suffix:設定日志文件的擴展名,默認為"";

pattern屬性的可選值:

%a:遠程IP地址;
%A:本地IP地址;
%b:發送的字節數,不包括HTTP頭部,符號“-”表示發送字節為零;
%B:發送的字節數,不包括HTTP頭部;
%h:遠程主機名;
%H:客戶端請求所用的協議;
%l:遠程邏輯用戶名(目前總是返回符號“-”);
%m:客戶端的請方式;
%p:接收到客戶端請求的本地服務器端口;
%q:客戶端請求中的查詢字符串(Query String),即HTTP請求的第一行的URI部分的“?”后面的內容;
%r:客戶端請求的第一行內容(包括請求方式、請求URI及HTTP協議版本);
%s:服務器響應結果中的HTTP狀態代碼;
%S:用戶的額Session ID;
%t:時間和日期;
%u:通過安全認證的遠程用戶名,符號“-”表示不存在遠程用戶名;
%U:客戶端請求的URL路徑;
%v:本地服務器名;

2.遠程地址過濾器

可以根據遠程客戶端的IP地址來決定是否接受客戶端的請求。在遠程地址過濾器中,事先保存了一份被拒絕的IP地址清單和允許訪問的IP地址清單。

屬性

  • className:指定閥實現類,此處為org.apache.catalina.valves.AccessLogValve;

  • allow:指定允許訪問的客戶端IP地址,如果沒有設定,則表示只要客戶端IP地址不在deny清單中,就允許訪問,多個IP地址用逗號隔開;

  • deny:指定不允許訪問的IP地址;

3.遠程主機過濾器

與遠程地址多濾器基本上相同,只是一個是基于ip,一個是基于主機名。

4.客戶請求記錄器

用于把客戶端請求的詳細信息記錄到日志文件,是一個有效的跟蹤工具,尤其是當HTTP請求中的Header或Cookie有錯誤時,它可以跟蹤客戶請求的詳細信息。

原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/62239

(1)
JeasonJeason
上一篇 2016-12-05
下一篇 2016-12-05

相關推薦

  • 關于大型網站技術演進的思考(九)–網站靜態化處理–總述(1)

    原文出處: 夏天的森林    在存儲瓶頸的開篇我提到像hao123這樣的導航網站只要它部署的web服務器數量足夠,它可以承載超大規模的并發訪問量,如果是一個動態的網站,特別是使用到了數據庫的網站是很難做到通過增加web服務器數量的方式來有效的增加網站并發訪問能力的。但是現實情況是像淘寶、京東這樣的大型動態網站在承擔高并發的情況下…

    Linux干貨 2015-03-11
  • ansible實戰示例

    要求:     使用ansible部署以下任務:     (1) 在VS部署主/備模型的keepalived + nginx的負載均衡;     (2) 在RS主機上部署httpd + php + php-mysql;     (3) 在第五臺主機上部署mariadb-serve…

    Linux干貨 2016-11-11
  • Linux進程管理和計劃任務

    進程管理篇 進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 Process: 運行中的程序的一個副本,是被載入內存的一個指令集合     進程ID(Process ID,PID)號碼被用來標記各個進程     UID、GID、和SELinux語…

    Linux干貨 2016-09-17
  • Linux中高級文件系統管理

    一、磁盤配額管理             定義:限制普通用戶對某個目錄寫空間大小的限制     1、此策略是針對文件系統,并非硬盤     2、可以根據不同組和不同用戶進行不同的策…

    Linux干貨 2016-08-29
  • TCP 的那些事兒(下)

    這篇文章是下篇,所以如果你對TCP不熟悉的話,還請你先看看上篇《TCP的那些事兒(上)》 上篇中,我們介紹了TCP的協議頭、狀態機、數據重傳中的東西。但是TCP要解決一個很大的事,那就是要在一個網絡根據不同的情況來動態調整自己的發包的速度,小則讓自己的連接更穩定,大則讓整個網絡更穩定。在你閱讀下篇之前,你需要做好準備,本篇文章有好些算法和策略,可能會引發你的…

    Linux干貨 2016-08-15
  • ?LVS

    LVS 概述 LVS工作類型 LVS NAT LVS DR(默認) Direct Routing帶來的問題 限制響應模型的內核參數 LVS TUN LVS FULLNAT scheduling-method 靜態調度算法 動態調度算法 CentOS 7 中的ipvs組件 安裝ipvsadm程序 主要文件 ipvsadm命令 配置集群服務 NAT方法示例 DR…

    Linux干貨 2016-10-26
欧美性久久久久