Tomcat的安裝和配置文件詳解(二)

server.xml文件時Tomcat的核心配置文件,包括Service,Engine,Realm,Value,Host等組件的相關配置信息。
前端

[root@node1 local]# vim tomcat/conf/server.xml java

<?xml version='1.0' encoding='utf-8'?>
node

<Server port="8005" shutdown="SHUTDOWN">mysql


  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />web


  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />正則表達式

  <Listener className="org.apache.catalina.core.JasperListener" />sql

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />數據庫

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

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />vim

<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 &quot;%r&quot; %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等。

下面將一個個詳細介紹各個組件

一、Server組件


如上面示例文件中定義的:

<Server port=」8005」 shutdown=」SHUTDOWN」>


這會讓Tomcat啓動一個server實例(Tomcat實例),一般一個JVM只能包含一個Tomcat實例;所以,一臺物理服務器上能夠在啓動多個JVM的狀況下在每個JVM中啓動一個Tomcat實例,每一個實例分屬於一個獨立的管理端口,這是一個頂級組件。

如上面示例中,Tomcat實例監聽在8005端口以接收shutdown命令,各Server的定義不能使用同一個端口,這意味着若是在同一個物理機上啓動了多個Server實例,必須配置它們使用不一樣的端口。這個端口的定義用於爲管理員提供一個關閉此實例的便捷途徑,管理員用telnet鏈接到8005端口執行shutdown就能夠把Tomcat關掉,爲了安全建議不啓用


Server的相關屬性:

className: 用於實現此Server容器的徹底限定類的名稱,默認爲                              org.apache.catalina.core.StandardServer;

port: 接收shutdown指令的端口,默認僅容許經過本機訪問,默認爲8005;

shutdown:發往此Server用於實現關閉tomcat實例的命令字符串,默認爲SHUTDOWN; 


二、Service組件:

Service主要用於關聯一個引擎和與此引擎相關的鏈接器,每一個鏈接器經過一個特定的端口和協議(http/ajp)接收入站請求將其轉發相當聯的引擎進行處理。困此,Service要包含一個引擎(也只能包 含一個引擎)、及一個或多個鏈接器。


如上面示例中的定義:

<Service name=」Catalina」>


這定義了一個名爲Catalina的Service,此名字也會在產生相關的日誌信息時記錄在日誌文件當中。


Service相關的屬性:

className: 用於實現service的類名,通常默認都是      org.apache.catalina.core.StandardService。

name:此服務的名稱,默認爲Catalina;


三、Connector(鏈接器)組件:

進入Tomcat的請求能夠根據Tomcat的工做模式分爲以下兩類:

(1)Tomcat做爲應用程序服務器:請求來自於前端的web服務器轉發,這多是Apache, IIS, Nginx      等;

(2)Tomcat做爲獨立服務器:請求直接來自於client的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(能夠false掉);

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" />


四、Engine組件:

Engine是Servlet處理器的一個實例,即servlet引擎,默認爲定義在server.xml中的Catalina。Engine須要defaultHost屬性來爲其定義一個接收全部發往非明肯定義虛擬主機的請求的host組件(由於一個Engine中能夠有多個虛擬主機,當用戶請求了一個不存在的主機時,這時通常要爲引擎指定一個默認的虛擬主機;每個虛擬主機均可以是一個獨立的網站)。

如前面示例中定義的:

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


經常使用的屬性定義:

defaultHost:Tomcat支持基於FQDN(Fully Qualified Domain Name徹底合格域名/全稱域名)的虛擬主 機,這些虛擬主機能夠經過在Engine中定義多個不一樣的Host組件來實現;但若是此引擎的 鏈接器收到一個發往非明肯定義虛擬主機的請求時則須要將此請求發往一個默認的虛擬主機進行處理,所以,在Engine中定義的多個虛擬主機的主機名稱中,至少要有一個虛擬主機的主機名稱跟defaultHost定義的主機名稱同名;


name:Engine組件的名稱,用於日誌和錯誤信息記錄時區別不一樣的引擎;


Engine容器中能夠包含Realm、Host、Listener和Valve子容器。


五、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.zxl.com" appBase="/web/mail">

    <Context path="" docBase="ROOT"/>

  </Host>

</Engine>


主機別名定義:

若是一個主機有兩個或兩個以上的主機名,額外的名稱都可以以別名的形式進行定義,以下:

<Host name="www.zxl.com" appBase="webapps" unpackWARs="true">

  <Alias>zxl.com</Alias>

</Host>


六、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"/>


在Tomcat中,每個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;


七、Realm組件:

用於用戶的認證和受權;在配置一個應用程序時,管理員能夠爲每一個資源或資源組定義角色及權限,而這些訪問控制功能的生效須要經過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" />


八、Valve組件:

Valve常被用來記錄客戶端請求、客戶端IP地址和服務器等信息,Valve相似於過濾器,它能夠工做於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。

一個容器內能夠創建多個Valve,並且Valve定義的次序也決定了它們生效的次序。Tomcat中實現了多種不一樣的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;


九、GlobalNamingResources

應用於整個服務器的JNDI映射,此能夠避免每一個Web應用程序都須要在各自的web.xml建立,這在web應用程序以WAR的形式存在時尤其有用。它一般能夠包含三個子元素:

1) Environment;

2) Resource;

3) ResourceEnvRef;


下面是一些不經常使用的元素定義

十、WatchedResource

WatchedResource能夠用於Context中監視指定的webapp程序文件的改變,而且可以在監視到文件內容發生改變時從新裝載此文件。


十一、Listener

Listener用於建立和配置LifecycleListener對象,而LifecycleListener一般被開發人員用來建立和刪除容器。


十二、Loader

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


1三、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時用到的版本,過於老舊了。


1四、Stores

PersistentManager必須包含一個Store元素以指定將會話數據存儲至何處。這一般有兩種實現方式:FileStore和JDBCStore。


1五、Resources

常常用於實如今Context中指定須要裝載的但不在Tomcat本地磁盤上的應用資源,如Java類,HTML頁面,JSP文件等。


1六、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元素。


(1)Channel

用於Cluster中給集羣中同一組中的節點定義通訊「信道」。Channel中須要至少定義Membership、Receiver和Sender三個元素,此外還有一個可選元素Interceptor。


(2)Membership

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


(3)Sender

用於Channel中配置「複製信息」的發送器,實現發送須要同步給其它節點的數據至集羣中的其它節點。發送器不須要屬性的定義,但能夠在其內部定義一個Transport元素。


(4)Transport

用於Sender內部,配置數據如何發送至集羣中的其它節點。Tomcat6有兩種Transport的實現:

1. PooledMultiSender

基於Java阻塞式IO,能夠將一次將多個信息併發發送至其它節點,但一次只能傳送給一個節點。

2. PooledParallelSener

基於Java非阻塞式IO,即NIO,能夠一次發送多個信息至一個或多個節點。


(5)Receiver

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


本文出自 「11097124」 博客,請務必保留此出處http://11107124.blog.51cto.com/11097124/1888368

相關文章
相關標籤/搜索