<!-- 這些指令組件關閉JMX MBeans支持 -->
<!-- 你也可以通過包含你自己的mbean描述文件配置自定義的組件,然后設置
“descriptors”屬性為以“;”為分隔的文件名列表嚴將它添加到默認列表
中,例如:descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。
-->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0" />
<!-- Global JNDI resources -->
<!-- 全局JNDI資源 -->
<GlobalNamingResources>
<!-- 出于示例目的的測試入口 -->
<Environment name="simpleValue" type="java.lang.Integer" value="30" />
<!-- 可編輯的,用來通過UserDatabaseRealm認證用戶的用戶數(shù)據(jù)庫 -->
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved">
</Resource>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/
tomcat-users.xml</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
<!-- 一個“Service”是一個或多個共用一個單獨“Container”(容器)的“Connectors”
組合(因此,應用程序在容器中可見)。通常,這個容器是一個“Engine”
(引擎),但這不是必須的。
注意:一個“Service”自身不是一個容器,因此,在這個級別上你不可定義
諸如“Valves”或“Loggers”子組件。
-->
<!-- 定義
Tomcat的標準獨立服務 -->
<Service name="Catalina">
<!-- 一個“Connector”(連接器)代表一個請求被接收和應答所需要的端點。每個連
接器通過相關的“Container”(容器)處理請求。
默認情況下,一個非SSL的HTTP/1.1的連接器被綁定在端口8080。你也可以通過
根據(jù)后面的使用說明并取消第二個連接器入口的注釋,在端口8443上建立一個
SSL HTTP/1.1的連接器。開放SSL支持需要下面幾步(參見
Tomcat 5文檔中怎樣
配置SSL的說明以取得更多的詳細信息):
* 如果你的JDK是1.3或1.3以前的版本,下載安裝JSSE 1.0.2或以后版本,并放
置JAR文件到“$JAVA_HOME/jre/lib/ext”目錄下。
* 帶一個“changeit”的口令值執(zhí)行:
%JAVA_HOME%\bin\keytool -genkey -alias
tomcat -keyalg RSA (Windows)
$JAVA_HOME/bin/keytool -genkey -alias
tomcat -keyalg RSA (UNIX)
來生成它自己的證書私鑰。
默認情況下,當一個web應用程序調(diào)用請求時,DNS查詢是可行的。這將對性能造
成一些不利的影響,因此,你可以將“enableLookups”設置為“false”來關閉DNS
查詢。當DNS查詢被關閉時,request.getRemoteHost()將返回包含遠程客戶IP地
址的字符串。
-->
<!-- 在8080端口上定義一個非SSL的HTTP/1.1連接器 -->
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
<!-- 注意,要關閉連接超時,將connectionTimeout設置為0 -->
<!-- 注意:要使用gzip壓縮需要設置如下屬性:
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml"
-->
<!-- 在端口8443上定義一個SSL的HTTP/1.1的連接器 -->
<!--
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- 在端口8009上定義一個Coyote/JK2 AJP 1.3連接器 -->
<Connector port="8009" enableLookups="false" redirectPort="8443"
debug="0" protocol="AJP/1.3" />
<!-- 在8082端口上定義一個代理HTTP/1.1連接器 -->
<!-- 參見代理文檔以取得這里使用屬性的更多的信息。 -->
<!--
<Connector port="8082"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"
acceptCount="100" debug="0" connectionTimeout="20000"
proxyPort="80" disableUploadTimeout="true" />
-->
<!-- 一個“Engine”(引擎)代表處理每個請求的入口點(在Catalina內(nèi))。這個
Tomcat
的標準獨立引擎實現(xiàn)分析包含在請求中的HTTP頭信息,并將請求傳送到適當?shù)闹鳈C
或虛擬主機上。-->
<!-- 你應該這樣設置jvmRoute以便在JK/JK2通道上支持負載平衡:
<Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1">
-->
<!-- 在我們的容器體系中定義最高級別的容器 -->
<Engine name="Catalina" defaultHost="localhost" debug="0">
<!-- 請求轉(zhuǎn)儲器值轉(zhuǎn)儲非常有用的通過
Tomcat這個實例接收到的所有請求的,關于
接收到的請求頭和cookies,以及發(fā)送出的回應頭和cookies的調(diào)試信息。如果
你只在意一個特定的虛擬主機或者一個特定應用程序的請求,在對應的<Host>
或<Context>入口中套用這個元素。
對于所有的Servlet(小服務程序)2.4來所,在示例程序中檢驗
“RequestDumperFilter”過濾是非常容易的(這個過濾器源代碼可以在
“$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。
請求轉(zhuǎn)儲默認情況下是關閉的,如果要使用它,取消下面行的注釋符。-->
<!--
<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
-->
<!-- 全局日志設置,除非在更低的級別上覆蓋它的設置 -->
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="catalina_log." suffix=".txt" timestamp="true" />
<!-- 因為這個Realm(區(qū)域)在這兒,因此這個實例將被全局共享。 -->
<!-- 這個Realm(區(qū)域)使用在全局JNDI資源下,由“UserDatabase”配置的用戶
數(shù)據(jù)庫。通過使用Realm將使對于這個用戶數(shù)據(jù)庫的任何編輯都將會立即可用
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
debug="0" resourceName="UserDatabase"/>-->
<!-- 注釋掉舊有的Realm以便我們能很快速的恢復舊有配置。 -->
<!--
<Realm className="org.apache.catalina.realm.MemoryRealm" />
-->
<!-- 下面的屬性用于從儲存在數(shù)據(jù)庫或從JDBC通道中得到的Realm以取代上面的
Realm配置。-->
<!--
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
connectionName="scott" connectionPassword="tiger"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
-->
<!--
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="sun.jdbc.odbc.JdbcOdbcDriver"
connectionURL="jdbc:odbc:CATALINA"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
-->
<!-- 定義默認的虛擬主機
注意:XML模式確認將不能與Xerces 2.2同工作。
-->
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<!--
為這個結(jié)點定義一個群集,通過定義這個元素,意味著每個管理員都將被改變。
因此,當運行一個群集時,只有確認在必須被聚集和移除其他的地方有你的
web軟件。
一個群集有下面這些參數(shù):
className = 這個群集類的全限定名
name = 你的群集的描述名,可以是任何描述
debug = 調(diào)試級別,更高意味著更多的輸出
mcastAddr = 多播地址,所有的節(jié)點都必須有同樣的多播地址
mcastPort = 多播端口,對所有的節(jié)點都必須有同樣的多播端口
mcastBindAddr = 綁定多播套接字到一個指定的地址
mcastTTL = 多播生存期,如果你想要限制你的廣播的話
mcastSoTimeout = 多播讀取超時
mcastFrequency = 發(fā)送“I'm alive”(我還活著)信息的間隔毫秒數(shù)
mcastDropTime = 多長時間沒有收到“I'm alive”就將這個節(jié)點標識為死節(jié)點(單位:毫秒)
tcpThreadCount = 用于處理重復引入請求的線程數(shù),最好是每個節(jié)點都有相同的線程數(shù)
tcpListenAddress = 在有多塊以太網(wǎng)卡的主機上的監(jiān)聽TCP群集請求的地址(綁定地址),auto意味著地址由InetAddress.getLocalHost().getHostAddress()取得。
tcpListenPort = tcp監(jiān)聽端口
tcpSelectorTimeout = 在操作系統(tǒng)中有java.nio喚醒錯的情況下,使用Selector.select()的超時
毫秒數(shù)。設為0則沒有超時限制
printToScreen = true意味著管理員的相關信息也將打印輸出到std.out
expireSessionsOnShutdown = true 意味著
useDirtyFlag = true意味著我們只能在調(diào)用setAttribute,removeAttribute后才能復制一個會話;
false意味著在每個請求后復制會話。
false意味著復制將以下列代碼方式工作:
<%
HashMap map = (HashMap)session.getAttribute("map");
map.put("key","value");
%>
replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”
* Pooled意味著在多個套接字上同步進行復制。例如,先復制數(shù)據(jù),然后請求返回。
這與“synchronous”相同,除了它使用一個套接字池,因此,它是多線程的。它是
最快和最高級的設置,使用這個配置也增加了處理復制的tcp線程的域。
* Synchronous指執(zhí)行請求的線程,它也是向其他節(jié)點復制數(shù)據(jù)的線程,并且直到
所有的節(jié)點都己經(jīng)收到信息后才返回。
* Asynchronous,對每個群集節(jié)點而言,這是一個特別的“sender”(發(fā)送者)線程,
因此請求線程將復制請求排隊到一個小隊列中,然后,返回給用戶。
這個小隊列是一個當會話被添加到隊列中,而從先前的請求中,同一個會話己經(jīng)存在
,這個會話將被放置在隊列中以代替重復的兩個請求。這幾乎從不會發(fā)生,除非存在
較大的網(wǎng)絡延遲。
-->
<!-- 當配置群集時,你也添加一個值來捕獲所有傳入的請求,在請求結(jié)束時,這個會話可能被子復制,
也可能不被復制。一個會話是否復制取決于下列條件是否發(fā)生:
1. useDirtyFlag為真,或者setAttribute或者removeAttribute己經(jīng)被調(diào)用。
2. 會話己經(jīng)存在(己經(jīng)被創(chuàng)建了)。
3. 請求沒有被“filter”屬性所捕獲。
這個filter(過濾器)屬性用于過濾那些不能修改會話的請求,因此,我們在這個請求結(jié)束后不復制
會主。這個過濾器是消極的,例如,你向過濾器發(fā)送了一些東西,然后被過濾出去,在那個匹配的過
濾器上不會發(fā)生復制。
過濾器屬性以分號為分隔,因此你不能換行,即使你想這么做。
filter=".*\.gif;.*\.js;"意味著在進行以.gif和.js結(jié)束的URI請求后不復制會話。
-->
<!--
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
</Cluster>
-->
<!-- 通常,對每一個應用程序,用戶必須逐個的認證他們自己。當他們遇到被
某種安全約束所保護的資源時,如果你想讓用戶只在第一次被認證,那么,
取消下面入口行的注釋,然后在這個虛擬主機中包含這個用戶的,橫跨所有
web應用程序的用戶身份識別。-->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn"
debug="0"/>
-->
<!-- 這個虛擬主機的所有請求的訪問日志過程。默認情況下,日志文件被創(chuàng)建在相對
于$CATALINA_HOME目錄下的logs目錄下。通過directory屬性,你也可以指定一個
不同的目錄,如果你想的話。可以使用相對路徑(相對于$CATALINA_HOME),也
可以使用絕對路徑。-->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
-->
<!-- 與這個虛擬主機有關系所有上下文所共享的日志。默認情況下(使用FileLogger時),
日志文件被創(chuàng)建在相對于$CATALINA_HOME目錄下的logs目錄下。如果你希望,你也可
以給directory指定一個不同的路徑。可以使用相對于$CATALINA_HOME的相對路徑,也
可以使用絕對路徑。-->
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs"
prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="web上下文路徑" docBase="虛擬目錄路徑" reloadable="true" debug="0"> </Context>
</Host>
</Engine>
</Service>
</Server>
在tomcat文件夾的conf\catalina\localhost(對于Tomcat6版本及其以上,需要自己創(chuàng)建catalina和localhost這兩個文件夾)
增加project .xml文件(該文件名的project要和下面的“path=“/xxx"”的xxx相同)
文件內(nèi)容:
<Context path="/project" reloadable="true" docBase="E:\javastudio\oob" workDir="E:\javastudio\oob\work" />
docBase是項目文件夾的web-inf文件夾的上一層目錄 workDir是指Tomcat解析Jsp轉(zhuǎn)換為Java文件,并編譯為class存放的文件夾,設置在項目文件夾里面,可以避免移植到其他地方首次讀取jsp文件需要重新解析 。一般格式:項目文件夾\work reloadable是指可以重新加載,一般設置為true,方便使用,不需要經(jīng)常重啟Tomcat。 以后啟動Tomcat,在瀏覽器輸入http://localhost:8080/project就能訪問該項目的welcome文件。
***************
為什么要不修改server.xml呢?在Tomcat6的doc幫助文檔中,官方是不提倡修改server.xml來添加虛擬目錄的!
而我認為,以上使用的方法,非常方便于項目的移植,移植后,只有修改docBase和workDir的值就行了,甚至可以去掉workDir這個屬性