1. 程式人生 > >Tomcat詳解

Tomcat詳解

PHP:
    開發語言:指令碼語言
    執行環境:解釋執行
        Zend Engine:Opcode
            Xcache,APC,eAccelerator
        MVC:
            data:資料
            bussiness:業務  
            presentation:展示
C/C++:CPU,OS
  移植困難
  維護成本高
  高速
  驅動

oak:橡樹,智慧,
java:
    包含四個獨立卻又彼此相關的技術:
        Java程式設計語言
        Java API
        Java Class檔案格式
        JVM:Java Virtual Machine
JVM的實現方式:
  1.一次直譯器,解釋位元組碼並執行
  2.即時編譯器(just-in-time complier)  依賴於更多記憶體快取解釋後的結果
  3.自適應編譯器 快取20%左右程式碼,提高80%左右的速度
Java設計語言:Sun
Java API:
JVM:Hotspot JVM
  JRE:java執行時環境 執行
  JDK:java開發環境 開發(編譯)+執行
JVM:OpenJDK
  開發+執行 開源實現
Java API類庫 第三方類庫
JDK=Java+API+JVM,是用於實現Java程式開發的最小環境
JRE=JVM+java SE API
Java應用領域的不同,Java可分為三類:
  JAVA SE:Standard Edtion
  JAVA EE:Enterprise Edition,J2EE
  JAVA ME:Mobile Edtion,J2ME
1995年,JAVA 1.0面世, James Gosling, Green Project
  applet:小程式 動態網站
  CGI:Common Gateway Interface 協議
      HTML
         <html>
            <title></title>
            <body></body>
         </html>
  Servlet:CGI
  JSP:Java Server Page
    <%language="java">
    SSH:struts,Spring,Hebernate
  JSP-->Servlet(Jasper編譯器)

applet, servlet, jsp
JSP: 
	.jsp --> .java -->(JVM) .class
JDK: javac, .java --> .class
CGI, Servlet, .java 
Web
	Servlet Container: Servlet容器
	Web Container: Web容器
執行緒私有記憶體區:
	程式計數器
	java虛擬機器棧
執行緒共享記憶體區:
	方法區
	堆:java自動記憶體回收,GC(Garbage Collector)
垃圾回收演算法:
	1、標記-清除
	2、複製
		二分之一
	3、標記-整理

垃圾回收器:
	Serial
	ParNew
	Parallel Scavenge
	Serial Old
	Parallel Old

	CMS: Concurrent Mark Sweep
		特點:併發收集、低停頓
		缺點:無法浮動垃圾、由於基於標記-清除會產生碎片
	G1
安裝:
rpm
通用二進位制格式, .bin
原始碼
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.6.0_21
export PATH=$PATH:$JAVA_HOME/bin
. /etc/profile.d/java.sh
java配置引數:
	-XX:+<option>: 開啟此引數指定的功能;
	-XX:-<option>:關閉功能
	-XX:<option>=<value>:給option指定的選項賦值;
java -XX:+PrintFlagsFinal
-D<name>=<value>: set a system property

類的生命週期:
Loading:載入
Verification:驗證
Preparation:準備
Resolutin:解析
Initilization:初始化
Using:使用
Unloading:解除安裝
Sun JDK監控和故障處理工具:
	jps, JVM Process Status Tool: 顯示指定系統內所有的HotSpot虛擬機器程序的列表資訊
	jstat, JVM Statistics Monitoring Tool:收集並顯示HotSpot虛擬機器各方面的執行資料
	jinfo:顯示正在執行的某HotSpot虛擬機器配置資訊
	jmap: 生成某HotSpot虛擬機器的記憶體轉儲快照;
視覺化工具:
	jconsole: Java的監控與管理控制檯
	jvisualvm: 

Tomcat系列之元件詳解及服務安裝配置

Servlet: CGI, java
	硬編碼, html
JSP: <% %>, html
	Jasper, .jsp --> .java
	JSP --> Servlet
容器類元件:
	Engine, Host, Context
頂級元件:
	Server, Service
Realm(領域): 使用者帳號資料庫
Valve(閥門): 
	記錄訪問日誌
	基於IP認證
Logger: 日誌記錄器

常見的web容器有:

商業版:
◇ Sun GlassFish Enterprise Server 
◇ Sun Java System Web Server
◇ JBoss Enterprise Application Platform
◇ WebLogic Application Server
◇ Caucho's Resin Server
◇ WebSphere Application Server
◇ NetWeaver

非商業版:
◇ Apache Tomcat 
◇ Apache Geronimo
◇ GlassFish 
◇ JBoss Application Server 
◇ Jetty
◇ Tiny Java Web Server 
◇ Eclipse Virgo
server.xml:
Tomcat各元件間的關係:
<Server>
	<Service>
		<Connector />
		<Engine>
			<Host>
				<Context> </Context>
			</Host>
		</Engine>
	</Service>
</Server>
預設的, 應用程式部署描述符
部署:將一個web應用程式所依賴到的類裝載進JVM

Tomcat系列之apache使用mod_jk和mod_proxy反向代理

新增一個新的Host:
編輯server.xml:
     <Host name="www.magedu.com" appBase="webapps" unpackWARs="true" autoDeploy="true" 
       xmlValidation="false" xmlNamespaceAware="false">
          <Context docBase="my-webapp" path="" />
     </Host>
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA </font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("abc","abc"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

192.168.10.8:8080/

Java體系結構包括四個獨立但相關的技術:
Java程式設計語言
Java class檔案格式
Java API
Java VM
用Java語言編譯原始碼,把它編譯成Java Class檔案,然後在Java VM中執行class檔案;當編寫程式時,通過呼叫類(Java API)中的方法來訪問系統資源,而當程式執行時,它通過呼叫class檔案中實現了Java API的方法也滿足程式的Java API呼叫。Java VM和Java API一起組成了一個“平臺”,所有Java程式都在其上編譯和執行,因此,它們有時也被稱作Java執行時環境。

Java VM的主要任務是裝載class檔案並且執行其中的位元組碼。Java VM包含一個類裝載器(class loader),它可以從程式和API裝載class檔案;而Java API的類只在程式執行中需要時才會被裝載。

Java位元組碼由執行引擎來執行。而不同的Java VM中,其執行引擎的實現可能各不相同。最簡單的執行引擎不是一次性解釋位元組碼,而另一種稱為“即時編譯器(just-in-time compiler)”的執行引擎執行速度更快,但要消耗更多的記憶體資源。即時編譯模式下,第一次被執行的位元組碼會被編譯成本地機器程式碼並快取下來以實現“複用”。第三種執行引擎是所謂的自適應優化器,此種方法中,虛擬機器始的時候解釋位元組碼,介是會監視執行中程式的活動,並且記錄下使用最頻繁的程式碼。程式執行時,虛擬機器只把那些活動最頻繁的程式碼編譯成原生代碼,而不頻繁的程式碼則仍然保留為位元組碼由虛擬機器解釋執行。自適應優化器可以使得Java VM在80%-90%的時間裡執行被優化過的原生代碼,而只需要編譯10%-20%對效能有影響的程式碼。最後一種虛擬機器由硬體晶片構成,它用本地方法執行Java位元組碼,其執行引擎內嵌於晶片中。

Sun公司建立了第一個Servlet容器,即Java Web Server, 但JWS只是為了演示Servlet的相應功能,所以其很不穩定。與此同時,ASF建立了JServ專案,一個能夠與apache整合起來的servlet容器。1999年,Sun把JWS捐給了ASF,於是兩個專案合二為一,即今天Tomcat的前身。第一個tomcat版本是Tomcat 3.x系列,而釋出於2001年Tomcat4.0則是在此前基礎上進行了重新設計和實現,其程式碼專案被命名為Catalina。目前最新的版本則是7.x系列。

Java SE則包含了Java二進位制程式(如JVM和Java位元組碼編譯器)和Java的核心程式碼庫,而Jave EE標準則包含了一組適用於建立企業級Web應用程式的API。Jave EE建立在Java SE的基礎上,並依賴於Java SE才能正常工作。當然,任何級別的應用程式均能從Java EE中獲益,但Jave EE卻更適合解決大型軟體系統設計中的問題。

JAVA EE包含多個獨立的API,Servlet和JSP就是其中的兩個,而JAVA EE中著名的API中還包含如下的幾個:

JAVA EE APIs:
EJB(Enterprise JavaBeans):JAVA相關的諸多高階功能的實現,如RMI(Remote Method Invocation), 物件/關係對映,跨越多個數據源的分散式事務等;

JMS(Java Message Service):高效能非同步訊息服務,實現JAVA EE應用程式與非JAVA程式的“透明”通訊;

JMX(Java Management Extensions):在程式執行時對其進行互動式監控和管理的機制;

JTA(Java Transaction API):允許應用程式在自身的一個或多個元件中平滑地處理錯誤的機制;

JavaMail:通過工業標準的POP/SMTP/IMAP協議傳送和接收郵件的機制;

Java SE APIs:
JNDI(Java Naming and Directory Interface):用於與LDAP服務互動的API;
JAXP(Java API for XML Processing):用於分析及轉換XML(基於XSLT實現);

Java SE API + JDK

JAVA EE Application Servers:
Websphere
Weblogic
oc4j
JBoss
JOnAS
Geronimo
Glassfish

risen

Sun --> TWS
  RI: Reference Implimentation
    參考實現

ASF:Apache Software Foundation
  Jserv

Sun --> ASF
  catalina
  O'Reilly: Tomcat
    男貓

類,.jar
JVM,

Tomcat: Servlet and JSP APIs,  JNDI and JMX APIs.

Tomcat不是一個完整意義上的Jave EE伺服器,它甚至都沒有提供對哪怕是一個主要Java EE API的實現;但由於遵守apache開源協議,tomcat卻又為眾多的java應用程式伺服器嵌入自己的產品中構建商業的java應用程式伺服器,如JBoss和JOnAS。

儘管Tomcat對Jave EE API的實現並不完整,然而很企業也在漸漸拋棄使用傳統的Java EE技術(如EJB)轉而採用一些開源元件來構建複雜的應用。這些開源元件如Structs、Spring和Hibernate,而Tomcat能夠對這些元件實現完美的支援。

HTTP是一種無狀態的協議,在使用者的一次連線請求響應完成後,伺服器端將無法識別在後續的連線請求中再次識別此使用者,交將其所有請求關聯起來。為了解決這個問題,java container通過一個臨時的cookie來為此使用者儲存一個標識,此標識即所謂的使用者session。
在第一次呼叫之後,JSP會被編譯成一個servlet類,在後續的操作中則可以直接使用此類,從而避免了對每一次呼叫的都要重新分析和編譯。因此,類似servlet,JSP的執行需要在container中完成。JSP的container跟servlet的container基本相同,但在JSP執行之前,需要一些額外的步驟如與servlet程式碼建立會話等。Tomcat包含了一個叫做Catalina的Servlet container(執行servlet和編譯過的JSP)和一個JSP編譯器(Jasper編譯器)。事實上,一個包含了JSP編譯器和Servlet容器的應用程式組合通過被稱作Web容器。

JSP和Servlet的最大區別在於,Servlet通常需要事先編譯好,而JSP則並非必須事先編譯。這意味著Servlet通常放置於私有資源區域,而JSP則通常以嵌入程式碼的方式包含於HTML頁面檔案中,這些HTML檔案通常放置在公開資源區域。

MVC架構:
Controller,Model和View各自獨立,一個流行的開源實現是Apache Structs框架;目今,設計優良的Web應用程式通常用相就的技術實現相應的功能,比如:
1、Servlet用於實現應用邏輯;
2、JSP用於內容展示;
3、標籤庫和JSP擴充套件語言用於替換在JSP內部嵌入Java程式碼,進而降低了HTML維護的複雜度;
4、MVC框架用於實現展示和應用邏輯的分離;

對於一個Web應用程式而言,其通常由Servlets、JSP和其它檔案等共同組成。這些檔案通常被打包成WAR(Web Application Archive)格式,並以.war作為打包後的副檔名。而Servlet規範則定義了在WAR內部組織這些檔案的標準目錄結構。其目錄和功用如下:
/  Web應用程式的根目錄,所有可被公開訪問的檔案均放置於此處,如HTML、JSP和圖片檔案等;
/WEB-INF  此目錄為私有資源目錄,其內部的所有檔案和子目錄均不能被公開訪問;包含著此Web應用程式的配置檔案web.xml(程式結構描述符檔案)通常放置於此目錄;
/WEB-INF/classes  當前Web應用程式的類檔案的存在目錄;
/WEB-INF/lib  可被打包為JAR格式的類檔案通常放置於此目錄;

安裝tomcat:
一、先安裝JVM
二、安裝配置tomcat

A Tomcat init script for Linux
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME=/usr/java/jdk1.7.0_05
CATALINA_HOME=/opt/apache-tomcat-7.0.29
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh $*

Tomcat的架構:
Tomcat 6支援Servlet 2.5和JSP 2.1的規範,它由一組巢狀的層次和元件組成,一般可分為以下四類:
頂級元件:位於配置層次的頂級,並且彼此間有著嚴格的對應關係;
聯結器:連線客戶端(可以是瀏覽器或Web伺服器)請求至Servlet容器,
容器:包含一組其它元件;
被巢狀的元件:位於一個容器當中,但不能包含其它元件;

各常見元件:
1、伺服器(server):Tomcat的一個例項,通常一個JVM只能包含一個Tomcat例項;因此,一臺物理伺服器上可以在啟動多個JVM的情況下在每一個JVM中啟動一個Tomcat例項,每個例項分屬於一個獨立的管理埠。這是一個頂級元件。
2、服務(service):一個服務元件通常包含一個引擎和與此引擎相關聯的一個或多個聯結器。給服務命名可以方便管理員在日誌檔案中識別不同服務產生的日誌。一個server可以包含多個service元件,但通常情下只為一個service指派一個server。

聯結器類元件:
3、聯結器(connectors):負責連線客戶端(可以是瀏覽器或Web伺服器)請求至Servlet容器內的Web應用程式,通常指的是接收客戶發來請求的位置及伺服器端分配的埠。預設埠通常是HTTP協議的8080,管理員也可以根據自己的需要改變此埠。一個引擎可以配置多個聯結器,但這些聯結器必須使用不同的埠。預設的聯結器是基於HTTP/1.1的Coyote。同時,Tomcat也支援AJP、JServ和JK2聯結器。

容器類元件:
4、引擎(Engine):引擎通是指處理請求的Servlet引擎元件,即Catalina Servlet引擎,它檢查每一個請求的HTTP首部資訊以辨別此請求應該發往哪個host或context,並將請求處理後的結果返回的相應的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現,它也可以是隻是一個容器。如果Tomcat被配置成為獨立伺服器,預設引擎就是已經定義好的引擎。而如果Tomcat被配置為Apache Web伺服器的提供Servlet功能的後端,預設引擎將被忽略,因為Web伺服器自身就能確定將使用者請求發往何處。一個引擎可以包含多個host元件。
5、主機(Host):主機元件類似於Apache中的虛擬主機,但在Tomcat中只支援基於FQDN的“虛擬主機”。一個引擎至少要包含一個主機元件。
6、上下文(Context):Context元件是最內層次的元件,它表示Web應用程式本身。配置一個Context最主要的是指定Web應用程式的根目錄,以便Servlet容器能夠將使用者請求發往正確的位置。Context元件也可包含自定義的錯誤頁,以實現在使用者訪問發生錯誤時提供友好的提示資訊。

被巢狀類(nested)元件:
這類元件通常包含於容器類元件中以提供具有管理功能的服務,它們不能包含其它元件,但有些卻可以由不同層次的容器各自配置。
7、閥門(Valve):用來攔截請求並在將其轉至目標之前進行某種處理操作,類似於Servlet規範中定義的過濾器。Valve可以定義在任何容器類的元件中。Valve常被用來記錄客戶端請求、客戶端IP地址和伺服器等資訊,這種處理技術通常被稱作請求轉儲(request dumping)。請求轉儲valve記錄請求客戶端請求資料包中的HTTP首部資訊和cookie資訊檔案中,響應轉儲valve則記錄響應資料包首部資訊和cookie資訊至檔案中。
8、日誌記錄器(Logger):用於記錄元件內部的狀態資訊,可被用於除Context之外的任何容器中。日誌記錄的功能可被繼承,因此,一個引擎級別的Logger將會記錄引擎內部所有元件相關的資訊,除非某內部元件定義了自己的Logger元件。
9、領域(Realm):用於使用者的認證和授權;在配置一個應用程式時,管理員可以為每個資源或資源組定義角色及許可權,而這些訪問控制功能的生效需要通過Realm來實現。Realm的認證可以基於文字檔案、資料庫表、LDAP服務等來實現。Realm的效用會遍及整個引擎或頂級容器,因此,一個容器內的所有應用程式將共享使用者資源。同時,Realm可以被其所在元件的子元件繼承,也可以被子元件中定義的Realm所覆蓋。

引擎(Engine):引擎是指處理請求的Servlet引擎元件,即Catalina Servlet引擎,它從HTTPconnector接收請求並響應請求。它檢查每一個請求的HTTP首部資訊以辨別此請求應該發往哪個host或context,並將請求處理後的結果返回的相應的客戶端。嚴格意義上來說,容器不必非得通過引擎來實現,它也可以是隻是一個容器。如果Tomcat被配置成為獨立伺服器,預設引擎就是已經定義好的引擎。而如果Tomcat被配置為Apache Web伺服器的提供Servlet功能的後端,預設引擎將被忽略,因為Web伺服器自身就能確定將使用者請求發往何處。一個引擎可以包含多個host元件。

Tomcat聯結器架構:
基於Apache做為Tomcat前端的架構來講,Apache通過mod_jk、mod_jk2或mod_proxy模組與後端的Tomcat進行資料交換。而對Tomcat來說,每個Web容器例項都有一個Java語言開發的聯結器模組元件,在Tomcat6中,這個聯結器是org.apache.catalina.Connector類。這個類的構造器可以構造兩種類別的聯結器:HTTP/1.1負責響應基於HTTP/HTTPS協議的請求,AJP/1.3負責響應基於AJP的請求。但可以簡單地通過在server.xml配置檔案中實現聯結器的建立,但建立時所使用的類根據系統是支援APR(Apache Portable Runtime)而有所不同。
APR是附加在提供了通用和標準API的作業系統之上一個通訊層的本地庫的集合,它能夠為使用了APR的應用程式在與Apache通訊時提供較好伸縮能力時帶去平衡效用。
同時,需要說明的是,mod_jk2模組目前已經不再被支援了,mod_jk模組目前還apache被支援,但其專案活躍度已經大大降低。因此,目前更常用 的方式是使用mod_proxy模組。

如果支援APR:
1、HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol
2、AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
如果不支援APR:
HTTP/1.1: org.apache.coyote.http11.Http11Protocol
AJP/1.3: org.apache.jk.server.JkCoyoteHandler

聯結器協議:

Tomcat的Web伺服器聯結器支援兩種協議:AJP和HTTP,它們均定義了以二進位制格式在Web伺服器和Tomcat之間進行資料傳輸,並提供相應的控制命令。

AJP(Apache JServ Protocol)協議:
目前正在使用的AJP協議的版本是通過JK和JK2聯結器提供支援的AJP13,它基於二進位制的格式在Web伺服器和Tomcat之間傳輸資料,而此前的版本AJP10和AJP11則使用文字格式傳輸資料。

HTTP協議:誠如其名稱所表示,其是使用HTTP或HTTPS協議在Web伺服器和Tomcat之間建立通訊,此時,Tomcat就是一個完全功能的HTTP伺服器,它需要監聽在某埠上以接收來自於商前伺服器的請求。

Tomcat的配置檔案:
Tomcat的配置檔案預設存放在$CATALINA_HOME/conf目錄中,主要有以下幾個:
server.xml: Tomcat的主配置檔案,包含Service, Connector, Engine, Realm, Valve, Hosts主元件的相關配置資訊;
web.xml:遵循Servlet規範標準的配置檔案,用於配置servlet,併為所有的Web應用程式提供包括MIME對映等預設配置資訊;
tomcat-user.xml:Realm認證時用到的相關角色、使用者和密碼等資訊;Tomcat自帶的manager預設情況下會用到此檔案;在Tomcat中新增/刪除使用者,為使用者指定角色等將通過編輯此檔案實現;
catalina.policy:Java相關的安全策略配置檔案,在系統資源級別上提供訪問控制的能力;
catalina.properties:Tomcat內部package的定義及訪問相關的控制,也包括對通過類裝載器裝載的內容的控制;Tomcat6在啟動時會事先讀取此檔案的相關設定;
logging.properties: Tomcat6通過自己內部實現的JAVA日誌記錄器來記錄操作相關的日誌,此檔案即為日誌記錄器相關的配置資訊,可以用來定義日誌記錄的元件級別以及日誌檔案的存在位置等;
context.xml:所有host的預設配置資訊;

一、server.xml
Tomcat以面向物件的方式執行,它可以在執行時動態載入配置檔案中定義的物件結構,這有點類似於apache的httpd模組的呼叫方式。server.xml中定義的每個主元素都會被建立為物件,並以某特定的層次結構將這些物件組織在一起。下面是個樣樣例配置:
<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml"/>
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
      maxThreads="150" connectionTimeout="20000"
      redirectPort="8443"/>

    <Engine name="Catalina" defaultHost="localhost">

      <Host name="localhost" appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
      </Host>
    </Engine>
  </Service>
</Server>


<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <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 name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </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 name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

server.xml檔案中可定義的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。

下面簡單介紹幾個常用元件:
1、Server元件

如上面示例檔案中定義的:
<Server port=”8005” shutdown=”SHUTDOWN”>

這會讓Tomcat6啟動一個server例項(即一個JVM),它監聽在8005埠以接收shutdown命令。各Server的定義不能使用同一個埠,這意味著如果在同一個物理機上啟動了多個Server例項,必須配置它們使用不同的埠。這個埠的定義用於為管理員提供一個關閉此例項的便捷途徑,因此,管理員可以直接telnet至此埠使用SHUTDOWN命令關閉此例項。不過,基於安全形度的考慮,這通常不允許遠端進行。

Server的相關屬性:
className: 用於實現此Server容器的完全限定類的名稱,預設為org.apache.catalina.core.StandardServer;
port: 接收shutdown指令的埠,預設僅允許通過本機訪問,預設為8005;
shutdown:發往此Server用於實現關閉tomcat例項的命令字串,預設為SHUTDOWN;

2、Service元件:
Service主要用於關聯一個引擎和與此引擎相關的聯結器,每個聯結器通過一個特定的埠和協議接收入站請求交將其轉發至關聯的引擎進行處理。困此,Service要包含一個引擎、一個或多個聯結器。

如上面示例中的定義:
<Service name=”Catalina”>

這定義了一個名為Catalina的Service,此名字也會在產生相關的日誌資訊時記錄在日誌檔案當中。

Service相關的屬性:
className: 用於實現service的類名,一般都是org.apache.catalina.core.StandardService。
name:此服務的名稱,預設為Catalina;

3、Connector元件:
進入Tomcat的請求可以根據Tomcat的工作模式分為如下兩類:
Tomcat作為應用程式伺服器:請求來自於前端的web伺服器,這可能是Apache, IIS, Nginx等;
Tomcat作為獨立伺服器:請求來自於web瀏覽器;

Tomcat應該考慮工作情形併為相應情形下的請求分別定義好需要的聯結器才能正確接收來自於客戶端的請求。一個引擎可以有一個或多個聯結器,以適應多種請求方式。

定義聯結器可以使用多種屬性,有些屬性也只適用於某特定的聯結器型別。一般說來,常見於server.xml中的聯結器型別通常有4種:
1) HTTP聯結器
2) SSL聯結器
3) AJP 1.3聯結器
4) proxy聯結器

如上面示例server.xml中定義的HTTP聯結器:
<Connector port="8080" protocol="HTTP/1.1"
      maxThreads="150" connectionTimeout="20000"
      redirectPort="8443"/>
      
定義聯結器時可以配置的屬性非常多,但通常定義HTTP聯結器時必須定義的屬性只有“port”,定義AJP聯結器時必須定義的屬性只有"protocol",因為預設的協議為HTTP。以下為常用屬性的說明:
1) address:指定聯結器監聽的地址,預設為所有地址,即0.0.0.0;
2) maxThreads:支援的最大併發連線數,預設為200;
3) port:監聽的埠,預設為0;
4) protocol:聯結器使用的協議,預設為HTTP/1.1,定義AJP協議時通常為AJP/1.3;
5) redirectPort:如果某聯結器支援的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的埠;
6) connectionTimeout:等待客戶端傳送請求的超時時間,單位為毫秒,預設為60000,即1分鐘;
7) enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;預設為true;
8) acceptCount:設定等待佇列的最大長度;通常在tomcat所有處理執行緒均處於繁忙狀態時,新發來的請求將被放置於等待佇列中;

下面是一個定義了多個屬性的SSL聯結器:
<Connector port="8443"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" />

4、Engine元件:
Engine是Servlet處理器的一個例項,即servlet引擎,預設為定義在server.xml中的Catalina。Engine需要defaultHost屬性來為其定義一個接收所有發往非明確定義虛擬主機的請求的host元件。如前面示例中定義的:
<Engine name="Catalina" defaultHost="localhost">

常用的屬性定義:
defaultHost:Tomcat支援基於FQDN的虛擬主機,這些虛擬主機可以通過在Engine容器中定義多個不同的Host元件來實現;但如果此引擎的聯結器收到一個發往非非明確定義虛擬主機的請求時則需要將此請求發往一個預設的虛擬主機進行處理,因此,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;
name:Engine元件的名稱,用於日誌和錯誤資訊記錄時區別不同的引擎;

Engine容器中可以包含Realm、Host、Listener和Valve子容器。

5、Host元件:
位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機,如前面示例中的定義:
      <Host name="localhost" appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
      </Host>

常用屬性說明:
1) appBase:此Host的webapps目錄,即存放非歸檔的web應用程式的目錄或歸檔後的WAR檔案的目錄路徑;可以使用基於$CATALINA_HOME的相對路徑;
2) autoDeploy:在Tomcat處於執行狀態時放置於appBase目錄中的應用程式檔案是否自動進行deploy;預設為true;
3) unpackWars:在啟用此webapps時是否對WAR格式的歸檔檔案先進行展開;預設為true;

虛擬主機定義示例:

<Engine name="Catalina" defaultHost="localhost">
  <Host name="localhost" appBase="webapps">
    <Context path="" docBase="ROOT"/>
    <Context path="/bbs" docBase="/web/bss"
      reloadable="true" crossContext="true"/>
  </Host>
  
  <Host name="mail.magedu.com" appBase="/web/mail">
    <Context path="" docBase="ROOT"/>
  </Host>
</Engine>

主機別名定義:
如果一個主機有兩個或兩個以上的主機名,額外的名稱均可以以別名的形式進行定義,如下:
<Host name="www.magedu.com" appBase="webapps" unpackWARs="true">
  <Alias>magedu.com</Alias>
</Host>

6、Context元件:
Context在某些意義上類似於apache中的路徑別名,一個Context定義用於標識tomcat例項中的一個Web應用程式;如下面的定義:
    <!-- Tomcat Root Context -->
    <Context path="" docBase="/web/webapps"/>
    
    <!-- buzzin webapp -->
    <Context path="/bbs"
      docBase="/web/threads/bbs"
      reloadable="true">
    </Context>
    
    <!-- chat server -->
      <Context path="/chat" docBase="/web/chat"/>
      
    <!-- darian web -->
    <Context path="/darian" docBase="darian"/>

在Tomcat6中,每一個context定義也可以使用一個單獨的XML檔案進行,其檔案的目錄為$CATALINA_HOME/conf/<engine name>/<host name>。可以用於Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

常用的屬性定義有:
1) docBase:相應的Web應用程式的存放位置;也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類的名字;
2) path:相對於Web伺服器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個單獨的xml檔案中,此屬性不需要定義;
3) reloadable:是否允許重新載入此context相關的Web應用程式的類;預設為false;

7、Realm元件:
一個Realm表示一個安全上下文,它是一個授權訪問某個給定Context的使用者列表和某使用者所允許切換的角色相關定義的列表。因此,Realm就像是一個使用者和組相關的資料庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現,用於表示此Realm認證的使用者及角色等認證資訊的存放位置。
JAASRealm:基於Java Authintication and Authorization Service實現使用者認證;
JDBCRealm:通過JDBC訪問某關係型資料庫表實現使用者認證;
JNDIRealm:基於JNDI使用目錄服務實現認證資訊的獲取;
MemoryRealm:查詢tomcat-user.xml檔案實現使用者資訊的獲取;
UserDatabaseRealm:基於UserDatabase檔案(通常是tomcat-user.xml)實現使用者認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm相容;它通過JNDI實現;

下面是一個常見的使用UserDatabase的配置:
  <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
    resourceName=”UserDatabase”/>

下面是一個使用JDBC方式獲取使用者認證資訊的配置:
  <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
    driverName="org.gjt.mm.mysql.Driver"
    connectionURL="jdbc:mysql://localhost/authority"
    connectionName="test" connectionPassword="test"
    userTable="users" userNameCol="user_name"
    userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name" />

8、Valve元件:
Valve類似於過濾器,它可以工作於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程式的某資源之間。一個容器內可以建立多個Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat6中實現了多種不同的Valve:
AccessLogValve:訪問日誌Valve
ExtendedAccessValve:擴充套件功能的訪問日誌Valve
JDBCAccessLogValve:通過JDBC將訪問日誌資訊傳送到資料庫中;
RequestDumperValve:請求轉儲Valve;
RemoteAddrValve:基於遠端地址的訪問控制;
RemoteHostValve:基於遠端主機名稱的訪問控制;
SemaphoreValve:用於控制Tomcat主機上任何容器上的併發訪問數量;
JvmRouteBinderValve:在配置多個Tomcat為以Apache通過mod_proxy或mod_jk作為前端的叢集架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;
ReplicationValve:專用於Tomcat叢集架構中,可以在某個請求的session資訊發生更改時觸發session資料在各節點間進行復制;
SingleSignOn:將兩個或多個需要對使用者進行認證webapp在認證使用者時連線在一起,即一次認證即可訪問所有連線在一起的webapp;
ClusterSingleSingOn:對SingleSignOn的擴充套件,專用於Tomcat叢集當中,需要結合ClusterSingleSignOnListener進行工作;

RemoteHostValve和RemoteAddrValve可以分別用來實現基於主機名稱和基於IP地址的訪問控制,控制本身可以通過allow或deny來進行定義,這有點類似於Apache的訪問控制功能;如下面的Valve則實現了僅允許本機訪問/probe:
  <Context path="/probe" docBase="probe">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="127\.0\.0\.1"/>
  </Context>

其中相關屬性定義有:
1) className:相關的java實現的類名,相應於分別應該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
2) allow:以逗號分開的允許訪問的IP地址列表,支援正則表示式,因此,點號“.”用於IP地址時需要轉義;僅定義allow項時,非明確allow的地址均被deny;
3) deny: 以逗號分開的禁止訪問的IP地址列表,支援正則表示式;使用方式同allow;

9、GlobalNamingResources
應用於整個伺服器的JNDI對映,此可以避免每個Web應用程式都需要在各自的web.xml建立,這在web應用程式以WAR的形式存在時尤為有用。它通常可以包含三個子元素:
1) Environment;
2) Resource;
3) ResourceEnvRef;

10、WatchedResource
WatchedResource可以用於Context中監視指定的webapp程式檔案的改變,並且能夠在監視到檔案內容發生改變時重新裝載此檔案。

11、Listener
Listener用於建立和配置LifecycleListener物件,而LifecycleListener通常被開發人員用來建立和刪除容器。

11、Loader
Java的動態裝載功能是其語言功能強大表現之一,Servlet容器使用此功能在執行時動態裝載servlet和它們所依賴的類。Loader可以用於Context中控制java類的載入。

12、Manager
Manger物件用於實現HTTP會話管理的功能,Tomcat6中有5種Manger的實現:
1) StandardManager
Tomcat6的預設會話管理器,用於非叢集環境中對單個處於執行狀態的Tomcat例項會話進行管理。當Tomcat關閉時,這些會話相關的資料會被寫入磁碟上的一個名叫SESSION.ser的檔案,並在Tomcat下次啟動時讀取此檔案。
2) PersistentManager
當一個會話長時間處於空閒狀態時會被寫入到swap會話物件,這對於記憶體資源比較吃緊的應用環境來說比較有用。
3)DeltaManager
用於Tomcat叢集的會話管理器,它通過將改變了會話資料同步給叢集中的其它節點實現會話複製。這種實現會將所有會話的改變同步給叢集中的每一個節點,也是在叢集環境中用得最多的一種實現方式。
4) BackupManager
用於Tomcat叢集的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給叢集中的另一個而非所有節點。
5)SimpleTcpReplicationManager
Tomcat4時用到的版本,過於老舊了。

13、Stores
PersistentManager必須包含一個Store元素以指定將會話資料儲存至何處。這通常有兩種實現方式:FileStore和JDBCStore。

14、Resources
經常用於實現在Context中指定需要裝載的但不在Tomcat本地磁碟上的應用資源,如Java類,HTML頁面,JSP檔案等。

15、Cluster
專用於配置Tomcat叢集的元素,可用於Engine和Host容器中。在用於Engine容器中時,Engine中的所有Host均支援叢集功能。在Cluster元素中,需要直接定義一個Manager元素,這個Manager元素有一個其值為org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性。同時,Cluster中還需要分別定義一個Channel和ClusterListener元素。

15.1、Channel
用於Cluster中給叢集中同一組中的節點定義通訊“通道”。Channel中需要至少定義Membership、Receiver和Sender三個元素,此外還有一個可選元素Interceptor。

15.2、Membership
用於Channel中配置同一通訊通道上節點叢集組中的成員情況,即監控加入當前叢集組中的節點並在各節點間傳遞心跳資訊,而且可以在接收不到某成員的心跳資訊時將其從叢集節點中移除。Tomcat6中Membership的實現是org.apache.catalina.tribes.membership.McastService。

15.3、Sender
用於Channel中配置“複製資訊”的傳送器,實現傳送需要同步給其它節點的資料至叢集中的其它節點。傳送器不需要屬性的定義,但可以在其內部定義一個Transport元素。

15.4 Transport
用於Sender內部,配置資料如何傳送至叢集中的其它節點。Tomcat6有兩種Transport的實現:
1) PooledMultiSender
基於Java阻塞式IO,可以將一次將多個資訊併發傳送至其它節點,但一次只能傳送給一個節點。
2)PooledParallelSener
基於Java非阻塞式IO,即NIO,可以一次傳送多個資訊至一個或多個節點。

15.5 Receiver
用於Channel定義某節點如何從其它節點的Sender接收復制資料,Tomcat6中實現的接收方式有兩種BioReceiver和NioReceiver。

二、web.xml檔案
web.xml基於Java Servlet規範,可被用於每一個Java servlet容器,通常有兩個存放位置,$CATALINA_BASE/conf和每個Web應用程式(通常是WEB-INF/web.xml)。Tomcat在deploy一個應用程式時(包括重啟或重新載入),它首先讀取conf/web.xml,而後讀取WEB-INF/web.xml。

啟用manager功能:
編輯tomcat-user.xml,新增如下行:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="standard"/>
<user username="tomcat" password="secret" roles="admin-gui,manager-script,standard"/>

而後重啟tomcat。

啟用host-manager和server status功能:
<role rolename="admin-gui"/>
<user username="tomcat" password="s3cret" roles="admin-gui"/>

startup指令碼:
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/jdk1.7.0_05
CATALINA_HOME=/usr/local/apache-tomcat-7.0.29
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/catalina.sh $*

APR即Apache Portable Runtime,原來是apache2的一個庫,後來被獨立成了一個專案。基於此庫檔案,Tomcat可以表現出更好的穩定性和效能,尤其是Tomcat作為apache的後端Servlet容器時。

事先安裝apr-devel包,而後編譯安裝tomcat的APR JNI。安裝方法如下:
# cd  $CATALINA_HOME/bin
# tar xf tomcat-native.tar.gz
# cd tomcat-native-1.1.22-src/jni/native/
# ./configure --with-apr=/usr --with-ssl --with-apxs
# make && make install

# echo "/usr/local/apr/lib/" > /etc/ld.so.conf.d/apr.conf
# ldconfig

應用程式:
jforum
java center home

配置tomcat啟用Manager
<role rolename="manager-gui"/>
<user username="tomcat" password="guessme" roles="manager-gui"/>

Manager的四個管理角色:
manager-gui - allows access to the HTML GUI and the status pages
manager-script - allows access to the text interface and the status pages
manager-jmx - allows access to the JMX proxy and the status pages
manager-status - allows access to the status pages only

新增一個新的Host:
編輯server.xml:
     <Host name="www.magedu.com" appBase="webapps" unpackWARs="true" autoDeploy="true" 
       xmlValidation="false" xmlNamespaceAware="false">
          <Context docBase="my-webapp" path="" />
     </Host>

列出所有Deployed的Web應用程式:
http://{ hostname }:{ portnumber }/manager/list

Tomcat的聯結器分為兩類:HTTP聯結器和Web伺服器聯結器。

Tomcat的HTTP聯結器有三種:
1) 基於java的HTTP/1.1聯結器,這也是Tomcat6預設使用的聯結器,即Coyote;它是Tomcat作為standalone模式工作時所用到的聯結器,可直接響應來自使用者瀏覽器的關於JSP、servlet和HTML的請求;此聯結器是一個Java類,定義在server.xml當中,預設使用8080埠;
2) Java開發的高效能NIO HTTP/1.1聯結器,它支援非阻塞式IO和Comnet,在基於庫向tomcat發起請求時,此聯結器表現不俗;但其實現不太成熟,有嚴重bug存在;
3) C/C++開發的native APR HTTP/1.1聯結器;在負載較大的場景中,此聯結器可以提供非常好的效能;APR即Apache Portable Runtime,它是一個能讓開發者採用與平臺無關的風格的方式來開發C/C++程式碼本地庫,它能夠很好的跨Windows, 

Linux和*nix平臺工作。此聯結器從三個主要方面優化了系統性能並提升了系統的伸縮能力:(1)使用sendfile()核心模式呼叫傳送大的靜態檔案;(2) 僅使用一個native code保持大量的連線;(3) 使用能夠加速SSL請求處理的OpenSSL原生代碼;

啟用APR聯結器的條件:
1) 將聯結器的protocol屬性設定為org.apache.coyote.http11.Http11AprProtocol;
2) APR的庫檔案已經在系統庫檔案的搜尋路徑內;

基於聯結器提供Tomcat6效能的方法:
1) 設定tcpNoDelay屬性值為“true”;
2) 通過maxKeepAliveRequest屬性調整允許keep-alive功能的請求的最大數目,值為1時表示禁用;
3) 調整socketBuffer屬性的值以改變套接字緩衝的大小;
4) 將enableLookups設定為false以禁用DNS反解;
5) Tomcat是一個多執行緒的Servlet容器,使用執行緒池能對伺服器效能帶去很大影響;這主要通過maxThreads、maxSpareThreads和minSpareThreads來定義;
6) 通過JAVA_OPTS,如-Xms和-Xmx設定JVM相關的引數以定義其使用記憶體的能力;

AJP(Apache JServ Protocol):
AJP是面向資料包的基於TCP/IP的協議,它在Apache和Tomcat的例項之間提供了一個專用的通訊通道。目前常用AJP協議的版本是1.3,它主要有以下特徵:
1) 在快速網路有著較好的效能表現,支援資料壓縮傳輸;
2) 支援SSL,加密及客戶端證書;
3) 支援Tomcat例項叢集;
4) 支援在apache和tomcat之間的連線的重用;

Apache可以通過mod_jk和mod_proxy模組跟Tomcat整合,但mod_proxy只有在apache 2.2.x系列的版本才直接提供,但它可以提供更豐富的功能和安全性;而對於apache 1.3.x和2.0.x來說mod_jk才更適用。

配置apache通過mod_proxy模組與Tomcat連線:

1、檢測當前的apache是否支援mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module模組:
# httpd -D DUMP_MODULES
 ……………………
 proxy_module (shared)
 proxy_balancer_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_connect_module (shared)
 ……………………
 
2、在httpd.conf的全域性配置段或虛擬主機中新增如下內容:
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>
ProxyPass /examples/jsp ajp://172.16.100.1:8009/examples/jsp
ProxyPassReverse /examples/jsp ajp://172.16.100.1:8009/examples/jsp
<Location /examples/jsp >
  Order allow,deny
  Allow from all
</Location>

配置apache和tomcat一起工作:

1、編譯安裝apache:
# ./configure --prefix=/usr/local/apache --enable-proxy --enable-proxy-http --enable-proxy-ajp

2、配置apache載入相應的模組:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

3、配置apache代理tomcat:

第一種方法,基於proxy-http:
ProxyPass /my-webapp http://www.magedu.com:8080/my-webapp
ProxyPassReverse /my-webapp http://www.magedu.com:8080/my-webapp
ProxyVia On

第二種方法,基於proxy-ajp:
ProxyPass /my-webapp ajp://tomcathost:8009/my-webapp
ProxyPassReverse /my-webapp ajp://tomcathost:8009/my-webapp
ProxyVia On

4、確保tomcat配置有如上使用的聯結器;

tar xf httpd-2.4.2
cd httpd-2.4.2
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util  --enable-proxy --enable-proxy-http --enable-proxy-ajp
make && make install 

tar xf tomcat-connectors-1.2.37-src.tar.gz 
cd tomcat-connectors-1.2.37-src/native/
./configure --with-apxs=/usr/local/apache/bin/apxs 
make && make install

server端session:
1、service向用戶瀏覽器傳送cookie,此cookie包含獲取服務端session的標識。
2、向用戶通過瀏覽器請求同一站點的頁面時,相應的cookie資訊會隨之傳送。
3、server從cookie資訊中識別出與此瀏覽器相關的session標識,從而判別出當前server上此瀏覽器的session資訊。

在使用者瀏覽器不支援cookie的場景中,也可以基於URL重寫實現session功能。簡單來講就是server端通過為任何一個響應給使用者的URL附加上session id的方式來標識使用者請求。

不過需要注意的是,每個瀏覽器程序都會各自管理各自跟服務端的會話ID,因此,在伺服器端看來,同一個客戶端上的多個瀏覽器程序會被識別成不同的客戶端。

2012年7月7號:
Tomcat7的配置檔案(conf目錄中):
catalina.policy: Tomcat7的安全策略,用於JVM強制將安全策略施加於Webapp;
catalina.properties: Tomcat啟動時會掃描此檔案,它包括共享的server、shared loader及JAR等;
server.xml: 主配置檔案之一,包含了諸多的重要配置,如IP地址、埠、虛擬主機、context路徑等;
tomcat-users.xml: 基於角色實現的認證及授權相關的檔案;
logging.properties: Tomcat例項的日誌相關的定義;
web.xml:定義tomcat例項啟動時為所有裝載至當前例項中的webapp定義的預設屬性值;當然,某webapp也可以定義自己的屬性來替代這裡的預設值;
context.xml: 

JDBC: (Java Database Connectivity) 基於java的資料庫訪問介面, 即用於讓客戶端訪問資料庫的API;
JNDI:(Java Naming and Directory Interface), JAVA的API之一,用於向java語言編寫的應用程式提供命名及目錄的功能;
DataSource: 用於通過JDBC API連線關係型資料庫的Java物件,通常需要整合進JNDI並將資料來源物件註冊為一個JNDI的名稱服務;這樣物件可以被程式自身訪問,並用於連線至資料庫;一般說來,tomcat7連線至任何資料時通常需要提供以下幾個引數:
  IP地址
  埠號
  JNDI名稱
  資料庫使用者名稱及其密碼
DBCP:(Dababase Connection Pool), 其通常位於TOMCAT_HOME或CATALINA_HOME/lib/tomcat-dbcp.jar中,用於實現連線池;

Tomcat Manager:
tomcat強大的管理工具,具有以下特性:
  遠端deploy新應用程式
  清理空閒會話
  在不重啟container的情況下Undeploy應用程式
  分析記憶體洩漏
  JVM狀態
  伺服器狀態
  
然而,在tomcat7中,TM預設是禁用的。要啟用之,需要編輯tomcat-users.xml檔案;

Context:
對於應用程式來說,context路徑是一個關鍵屬性,其也經常用於虛擬主機的配置及.war檔案中的URL對映。使用context可以降低系統負載,因為,當某URL請求到達tomcat時,如果沒有context,tomcat需要搜尋server.xml或context.xml的配置以確定此URL,否則則需要搜尋所有的war檔案來查詢使用者的請求的資源。

此外,context也可以讓管理員基於每個app提供日誌、appBase、DB連線等配置,這極大地增強配置的靈活性;

應用程式目錄的結構:
/WEB-INF/web.xml:包含當前webapp的deploy描述符,如所有的servlets和JSP等動態檔案的詳細資訊,會話超時時間和資料來源等;因此,其也通常用於定義當前webapp特有的資源;
/WEB-INF/classes: 包含所有伺服器端類及當前應用程式相關的其它第三方類等;
/WEB-INF/lib: 包含JSP所用到的JAR檔案;

用於tomcat的webapp即可以多個獨立的檔案組成,也可以是jar打包後的單個檔案;這些打包後的檔案的副檔名可用於判斷其內容的型別,如:
  EJB通常打包為.jar
  webapp通常打包為.war
  資源介面卡(Resource adapters)通常打包為.rar
  企業級應用程式通常打包為.ear,它通常是整合的EJB、webapp及資源介面卡檔案;
  Web服務通常會打包為.ear或.war;
  
於是,到底應該使用展開格式的檔案還是打包為單個檔案的格式,就需要根據需要進行了。一般說來,如果滿足以下場景,就應該使用展開後的格式,而非打包格式:
1、需要在將來的某個時候更新應用程式中的部分內容;使用展開的格式可以避免重新deploy應用程式;
2、期望使用Tomcat Manager來動態編輯及選擇deployment descriptor值;
3、應用程式中包含靜態檔案,而這些靜態檔案需要定期更新;

Deploy應用程式所涉及到的操作:
Deploy: 向tomcat例項提供某應用程式原始檔,並讓伺服器將類載入進類加器中;這樣,應用程式才可以為使用者所使用;
Redeploy:用於更新deployment後的某應用程式或應用程式的部分內容;當redeploy整個應用程式時,當前應用程式的所有模組都必須要redeploy成功,否則整個webapp將會停止 ;
Stop: 解除安裝當前應用程式的所有類,並停止向用戶提供服務;不過,其仍然會保留所有已deploy的檔案及名稱,並可用於後續的redeployment或starting;
Start: 重新裝載當前應用的類至類載入器,並開啟服務;
Undeploy: 停止某已經deploy的應用程式,並移除deploy產生的檔案和名稱;

Tomcat7 deploy應用程式的方法:
War格式的應用程式:將應用程式war檔案放置於CATALINA_BASE目錄中並重新啟動tomcat;
沒打包的應用程式:將應用程式的非歸檔檔案旋轉於CATALINA_BASE目錄中;
Tomcat Manager:登入TM而後進行deploy;

telnet webserver

GET / HTTP/1.1
HOST:localhost
Connection:{Keep-Alive|Close}

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
  <head>
    <title>JSP test page.</title>
  </head>
  <body>
    <% out.println("Hello,world!"); %>
  </body>
</html>

# mkdir /usr/local/tcinstance2
# cd /usr/local/tcinstance2
# cp -a $CATALINA_HOME/conf .
# mkdir common logs temp server shared webapps work

server.xml:

<Server port="8007" shutdown="SHUTDOWN">
<Connector port="8081" maxHttpHeaderSize="8192"
    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" />

# set CATALINA_BASE="/usr/local/tcinstance2"
# set CATALINA_HOME="/usr/local/tomcat"
# export CATALINA_BASE CATALINA_HOME
# service tomcat start # Standard way to start on Linux

http://172.16.100.1/manager/html: 
http://172.16.100.1/manager/text
http://172.16.100.1/manager/status

會話管理:
標準會話管理器和持久會話管理器

標準會話管理器(StandardManager):
<Manager className="org.apache.catalina.session.StandardManager"
         maxInactiveInterval="7200"/>

預設保存於$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser檔案中。

maxActiveSessions:最多允許的活動會話數量,預設為-1,表示不限制; 
maxInactiveInterval:非活動的會話超時時長,預設為60s;
pathname:會話檔案的儲存目錄;

持久會話管理器(PersistentManager):
將會話資料儲存至持久儲存中,並且能在伺服器意外中止後重新啟動時重新載入這些會話資訊。持久會話管理器支援將會話儲存至檔案儲存(FileStore)或JDBC儲存(JDBCStore)中。

儲存至檔案中的示例:
<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.FileStore"
    directory="/data/tomcat-sessions"/>
</Manager>

每個使用者的會話會被儲存至directory指定的目錄中的檔案中,檔名為<session id>.session,並通過後臺執行緒每隔一段時間(checkInterval引數定義,預設為60秒)檢查一次超時會話。

儲存至JDBCStore中的示例:
<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.JDBCStore"
    driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>
</Manager>

安裝apache

6.4.1 安裝apr和apr-util

可以從http://apr.apache.org/獲取apr原始碼,目前最新的版本是1.4.6。
[[email protected]  ~]# tar  xf  apr-1.4.6.tar.bz2
[[email protected]  ~]# cd apr-1.4.6
[[email protected]  ~]# ./configure --prefix=/usr/local/apr --disable-ipv6
[[email protected]  ~]# make && make install

apr-util是apr的工具庫,其可以讓程式設計師更好的使用apr的功能。可以從http://apr.apache.org/獲取apr原始碼,目前最新的版本是1.4.1。
[[email protected]  ~]# tar xf apr-util-1.4.1.tar.bz2
[[email protected]  ~]# cd apr-util-1.4.1
[root@www apr-util-1.4.1]#  ./configure  --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr
[root@www apr-util-1.4.1]#  make && make install

6.4.2 安裝apache

httpd目前最新的2.4系列版本中引入了event MPM,其在效能上較之其它MPM有了較大的提升,
[[email protected]  ~]# tar xf httpd-2.4.2
[[email protected]  ~]# cd httpd-2.4.2
[[email protected]  ~]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer  --enable-lbmethod-heartbeat --enable-heartbeat --enable-slotmem-shm  --enable-slotmem-plain --enable-watchdog
[[email protected]  ~]# make && make install

為apache提供init指令碼,實現服務的控制。建立/etc/rc.d/init.d/httpd檔案,並新增如下內容:

這是個指令碼檔案,因此需要執行許可權;同時,為了讓httpd服務能夠開機自動啟動,還需要將其新增至服務列表,並設定其在3或5級別下自動執行。
chmod  +x  /etc/rc.d/init.d/httpd
chkconfig  --add  httpd
chkconfig  --level  35  httpd  on

6.5  配置apache通過mod_proxy模組與Tomcat連線

要使用mod_proxy與Tomcat例項連線,需要apache已經裝載mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(實現Tomcat叢集時用到)等模組:

# /usr/local/apache/bin/httpd -D DUMP_MODULES | grep  proxy
 proxy_module (shared)
 proxy_connect_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_fcgi_module (shared)
 proxy_scgi_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 proxy_express_module (shared)
 
2、在httpd.conf的全域性配置段或虛擬主機中新增如下內容:
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
  Require all granted
</Proxy>
  ProxyPass  /  ajp://172.16.100.1:8009/
  ProxyPassReverse  /  ajp://172.16.100.1:8009/
<Location  / >
  Require all granted
</Location>

或讓apache跟Tomcat的http聯結器進行整合:
ProxyVia Off
ProxyRequests Off
ProxyPass / http://172.16.100.1:8080/
ProxyPassReverse / http://172.16.100.1:8080/
<Proxy *>
  Require all granted
</Proxy>
<Location  / >
  Require all granted
</Location>

關於如上apache指令的說明:

ProxyPreserveHost {On|Off}:如果啟用此功能,代理會將使用者請求報文中的Host:行傳送給後端的伺服器,而不再使用ProxyPass指定的伺服器地址。如果想在反向代理中支援虛擬主機,則需要開啟此項,否則就無需開啟此功能。

ProxyVia  {On|Off|Full|Block}:用於控制在http首部是否使用Via:,主要用於在多級代理中控制代理請求的流向。預設為Off,即不啟用此功能;On表示每個請求和響應報文均新增Via:;Full表示每個Via:行都會添加當前apache伺服器的版本號資訊;Block表示每個代理請求報文中的Via:都會被移除。

ProxyRequests {On|Off}:是否開啟apache正向代理的功能;啟用此項時為了代理http協議必須啟用mod_proxy_http模組。同時,如果為apache設定了ProxyPass,則必須將ProxyRequests設定為Off。

ProxyPass  [path]  !|url  [key=value key=value ...]]:將後端伺服器某URL與當前伺服器的某虛擬路徑關聯起來作為提供服務的路徑,path為當前伺服器上的某虛擬路徑,url為後端伺服器上某URL路徑。使用此指令時必須將ProxyRequests的值設定為Off。需要注意的是,如果path以“/”結尾,則對應的url也必須以“/”結尾,反之亦然。
另外,mod_proxy模組在httpd 2.1的版本之後支援與後端伺服器的連線池功能,連線在按需建立在可以儲存至連線池中以備進一步使用。連線池大小或其它設定可以通過在ProxyPass中使用key=value的方式定義。常用的key如下所示:
◇ min:連線池的最小容量,此值與實際連線個數無關,僅表示連線池最小要初始化的空間大小。
◇ max:連線池的最大容量,每個MPM都有自己獨立的容量;都值與MPM本身有關,如Prefork的總是為1,而其它的則取決於ThreadsPerChild指令的值。
◇ loadfactor:用於負載均衡叢集配置中,定義對應後端伺服器的權重,取值範圍為1-100。
◇ retry:當apache將請求傳送至後端伺服器得到錯誤響應時等待多長時間以後再重試。單位是秒鐘。

如果Proxy指定是以balancer://開頭,即用於負載均衡叢集時,其還可以接受一些特殊的引數,如下所示:
◇lbmethod:apache實現負載均衡的排程方法,預設是byrequests,即基於權重將統計請求個數進行排程,bytraffic則執行基於權重的流量計數排程,bybusyness通過考量每個後端伺服器的當前負載進行排程。
◇ maxattempts:放棄請求之前實現故障轉移的次數,預設為1,其最大值不應該大於總的節點數。
◇ nofailover:取值為On或Off,設定為On時表示後端伺服器故障時,使用者的session將損壞;因此,在後端伺服器不支援session複製時可將其設定為On。
◇ stickysession:排程器的sticky session的名字,根據web程式語言的不同,其值為JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中設定之外,也可使用ProxySet指令直接進行設定,如:
<Proxy balancer://hotcluster>
BalancerMember  http://www1.magedu.com:8080 loadfactor=1
BalancerMember  http://www2.magedu.com:8080 loadfactor=2
ProxySet  lbmethod=bytraffic
</Proxy>

ProxyPassReverse:用於讓apache調整HTTP重定向響應報文中的Location、Content-Location及URI標籤所對應的URL,在反向代理環境中必須使用此指令避免重定向報文繞過proxy伺服器。

6.6  配置apache通過mod_jk模組與Tomcat連線

mod_jk是ASF的一個專案,是一個工作於apache端基於AJP協議與Tomcat通訊的聯結器,它是apache的一個模組,是AJP協議的客戶端(服務端是Tomcat的AJP聯結器)。

[[email protected]  ~]# tar xf tomcat-connectors-1.2.37-src.tar.gz 
[[email protected]  ~]# cd tomcat-connectors-1.2.37-src/native/
[[email protected]  ~]# ./configure --with-apxs=/usr/local/apache/bin/apxs