鍍金池/ 教程/ Linux/ Tomcat Manager
連接器
JSPs
重寫(xiě)機(jī)制
CGI
Tomcat Manager
Windows 認(rèn)證
代理支持
虛擬主機(jī)
安全性注意事項(xiàng)
如何在 Maven 中使用 Tomcat 庫(kù)
安裝
MBean 描述符
JNDI 資源
類(lèi)加載機(jī)制
Tomcat Web 應(yīng)用部署
基于 APR 的原生庫(kù)
負(fù)載均衡器
安全管理
附加組件
監(jiān)控與管理
Windows 服務(wù)
集群化與會(huì)話(huà)復(fù)制
高級(jí) IO 機(jī)制
SSI(服務(wù)器端嵌入)
WebSocket 支持
JDBC 數(shù)據(jù)源
日志機(jī)制
默認(rèn) Servlet
SSL/TLS 配置
Tomcat 的 JDBC 連接池
第一個(gè)應(yīng)用
簡(jiǎn)介
Realm 配置

Tomcat Manager

概述

很多生產(chǎn)環(huán)境都非常需要以下特性:在無(wú)需關(guān)閉或重啟整個(gè)容器的情況下,部署新的 Web 應(yīng)用或者取消對(duì)現(xiàn)有應(yīng)用的部署?;蛘?,即便在 Tomcat 服務(wù)器配置文件中沒(méi)有指定 reloadable 的情況下,也可以請(qǐng)求重新加載現(xiàn)有應(yīng)用。

Tomcat 中的 Web 應(yīng)用 Manager 就是來(lái)解決這些問(wèn)題的,它默認(rèn)安裝在上下文路徑:/manager 中,支持以下功能:

  • 用已上傳的 WAR 文件內(nèi)容部署新的 Web 應(yīng)用。
  • 在服務(wù)器文件系統(tǒng)中指定上下文路徑處部署新的 Web 應(yīng)用。
  • 列出當(dāng)前已部署的 Web 應(yīng)用,以及這些應(yīng)用目前的活躍會(huì)話(huà)。
  • 重新加載現(xiàn)有的 Web 應(yīng)用,以便響應(yīng) /WEB-INF/classes/WEB-INF/lib 中內(nèi)容的更改。
  • 列出操作系統(tǒng)及 JVM 的屬性值。
  • 列出可用的全局 JNDI 資源,它們將用于預(yù)備 <ResourceLink> 元素的部署工具中。<ResourceLink> 元素內(nèi)嵌于 <Context> 部署描述中。
  • 開(kāi)啟一個(gè)已停止的 Web 應(yīng)用,從而使其再次可用。
  • 停止一個(gè)現(xiàn)有的 Web 應(yīng)用,從而使其不可用,但并不取消對(duì)它的部署。
  • 取消對(duì)一個(gè)已部署 Web 應(yīng)用的部署,刪除它的文檔庫(kù)目錄(除非它是從文件系統(tǒng)中部署的)。

Tomcat 默認(rèn)安裝已經(jīng)包含了 Manager。 將一個(gè) Manager 應(yīng)用實(shí)例的 Context 添加到一個(gè)新的主機(jī)中,manager.xml 上下文配置文件應(yīng)放在 $CATALINA_BASE/conf/[enginename]/[hostname] 文件夾中。如下所示:

<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.0\.0\.1" />
</Context>

如果將 Tomcat 配置成能夠支持多個(gè)虛擬主機(jī)(網(wǎng)站),則需要對(duì)每個(gè)虛擬主機(jī)配置一個(gè) Manager。

Manager 應(yīng)用的使用方式有以下三種:

  • 作為帶有用戶(hù)界面的應(yīng)用,在瀏覽器中運(yùn)行。在隨后這個(gè)范例 URL 中,你可以將 localhost 替換為你的網(wǎng)站主機(jī)名稱(chēng):http://localhost:8080/manager/html。
  • 只使用 HTTP 請(qǐng)求的一個(gè)功能最少的版本。它適合系統(tǒng)管理員通過(guò)創(chuàng)建腳本來(lái)進(jìn)行使用。將命令指定在請(qǐng)求的 URI 中,響應(yīng)是簡(jiǎn)單格式的文本(易于解析與處理)。詳情查看 支持的 Manager 命令。
  • 用于 Ant 構(gòu)建工具(1.4或更新版本)的一套方便的任務(wù)定義。詳情參見(jiàn) 利用 Ant 執(zhí)行 Manager 命令。

配置 Manager 應(yīng)用訪(fǎng)問(wèn)

下文的描述將使用變量名 $CATALINA_BASE 來(lái)指代工作目錄。如果你還沒(méi)有為多個(gè) Tomcat 實(shí)例設(shè)置 CATALINA_BASE 目錄,那么 $CATALINA_BASE 就將被設(shè)置為 $CATALINA_HOME(Tomcat 的安裝目錄)的值。

Tomcat 以默認(rèn)值運(yùn)行是非常危險(xiǎn)的,因?yàn)檫@能讓互聯(lián)網(wǎng)上的任何人都可以在你的服務(wù)器上執(zhí)行 Manager 應(yīng)用。因此,Manager 應(yīng)用要求任何用戶(hù)在使用前必須驗(yàn)證自己的身份,提供自己的用戶(hù)名和密碼,以及相應(yīng)配置的 manager-** 角色(角色名稱(chēng)根據(jù)所需的功能而定)。另外,默認(rèn)用戶(hù)文件$CATALINA_BASE/conf/tomcat-users.xml)中的用戶(hù)名稱(chēng)都沒(méi)有指定角色名稱(chēng),所以默認(rèn)是不能訪(fǎng)問(wèn) Manager 應(yīng)用的。

這些角色名稱(chēng)位于 Manager 應(yīng)用的 web.xml 文件中??捎玫慕巧ǎ?

  • manager-gui 能夠訪(fǎng)問(wèn) HTML 界面。
  • manager-status 只能訪(fǎng)問(wèn)“服務(wù)器狀態(tài)”(Server Status)頁(yè)面。
  • manager-script 能夠訪(fǎng)問(wèn)文檔中描述的適用于工具的純文本界面,以及“服務(wù)器狀態(tài)”頁(yè)面。
  • manager-jmx 能夠訪(fǎng)問(wèn) JMX 代理界面以及“服務(wù)器狀態(tài)”(Server Status)頁(yè)面。

HTML 界面不會(huì)遭受 CSRF(Cross-Site Request Forgery,跨站請(qǐng)求偽造)攻擊,但純文本界面及 JMX 界面卻有可能無(wú)法幸免。這意味著,如果用戶(hù)能夠訪(fǎng)問(wèn)純文本界面及 JMX 界面,那么在利用 Web 瀏覽器去訪(fǎng)問(wèn) Manager 應(yīng)用時(shí),必須要萬(wàn)分謹(jǐn)慎。要想保持對(duì) CSRF 免疫,則必須:

  • 在使用 Web 瀏覽器訪(fǎng)問(wèn) Manager 應(yīng)用時(shí),假如用戶(hù)具有 manager-scriptmanager-jmx 角色(比如為了測(cè)試純文本界面或 JMX 界面),那么必須關(guān)閉所有的瀏覽器窗口,終止會(huì)話(huà)。如果不關(guān)閉瀏覽器,訪(fǎng)問(wèn)了其他站點(diǎn),就可能會(huì)遭受 CSRF 攻擊。
  • 建議永遠(yuǎn)不要將 manager-scriptmanager-jmx 角色授予那些擁有 manager-gui 角色的用戶(hù)。

注意 JMX 代理界面是 Tomcat 中非常高效的底層、類(lèi)似于根級(jí)別的管理界面。如果用戶(hù)知道了該調(diào)用的命令,就能實(shí)現(xiàn)大量行為,所以一定不要輕易授予用戶(hù) manager-jmx 角色。

為了能夠訪(fǎng)問(wèn) Manager 應(yīng)用,必須創(chuàng)建一個(gè)新的用戶(hù)名/密碼組合,并為之授予一種 manager-** 角色,或者把一種 manager-** 角色授予現(xiàn)有的用戶(hù)名/密碼組合。因?yàn)楸疚臋n的大部分內(nèi)容都在描述純文本界面的命令,所以為了將來(lái)討論實(shí)例方便起見(jiàn),把角色名稱(chēng)定為 manager-script。而涉及到具體如何配置用戶(hù)名及密碼,則是跟你所使用的Realm 實(shí)現(xiàn)有關(guān):

  • UserDatabaseRealm 加上 MemoryUserDatabaseMemoryRealm——UserDatabaseRealmMemoryUserDatabase 配置在默認(rèn)的 $CATALINA_BASE/conf/server.xml 文件中。MemoryUserDatabaseMemoryRealm 都會(huì)讀取儲(chǔ)存在 CATALINA_BASE/conf/tomcat-users.xml 里的 XML 格式文件,它可以用任何文本編輯器進(jìn)行編輯。該文件會(huì)為每個(gè)用戶(hù)定義一個(gè) XML 格式的 <user> ,如下所示:

    <user username="craigmcc" password="secret" roles="standard,manager-script" />

    它定義了用戶(hù)登錄時(shí)所用的用戶(hù)名和密碼,以及他或她采用的角色名稱(chēng)。你可以把 manager-script 角色添加到由逗號(hào)分隔的 roles 屬性中,從而將該角色賦予一個(gè)或多個(gè)用戶(hù),也可以利用指定角色來(lái)創(chuàng)建新的用戶(hù)。

  • DataSourceRealmJDBCRealm——用戶(hù)和角色信息都存儲(chǔ)在一個(gè)經(jīng)由 JDBC 訪(fǎng)問(wèn)的數(shù)據(jù)庫(kù)中。按照當(dāng)前環(huán)境的標(biāo)準(zhǔn)流程,將 manager-script 角色賦予一個(gè)或多個(gè)用戶(hù),或者利用該角色創(chuàng)建一個(gè)或多個(gè)新用戶(hù)。

  • JNDIRealm——你的用戶(hù)和角色信息被存儲(chǔ)在經(jīng)由 LDAP 訪(fǎng)問(wèn)的一個(gè)目錄服務(wù)器中。按照當(dāng)前環(huán)境的標(biāo)準(zhǔn)流程,為一個(gè)或更多的現(xiàn)有用戶(hù)添加 manager-script 角色,和(/或)利用指定角色創(chuàng)建一個(gè)或更多的新用戶(hù)。

在下一節(jié),當(dāng)你第一次嘗試使用 Manager 的一個(gè)命令時(shí),將會(huì)使用基本驗(yàn)證進(jìn)行登錄。用戶(hù)名和密碼的具體內(nèi)容并不重要,只要它們能夠證明,用戶(hù)數(shù)據(jù)庫(kù)中擁有 manager-script 角色的用戶(hù)是有效用戶(hù),我們的目的就達(dá)到了。

除了密碼限制訪(fǎng)問(wèn)之外,Manager 還可以配置 RemoteAddrValveRemoteHostValve 這兩個(gè)參數(shù),分別通過(guò) 遠(yuǎn)程 IP 地址 或遠(yuǎn)程主機(jī)名來(lái)進(jìn)行限制訪(fǎng)問(wèn)。詳情可查看 Valve 文檔。下列范例是通過(guò) IP 地址來(lái)限制訪(fǎng)問(wèn)本地主機(jī):

<Context privileged="true">
         <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                allow="127\.0\.0\.1"/>
</Context>  

易用的 HTML 界面

Manager 應(yīng)用易用的 HTML 界面位于:

http://{host}:{port}/manager/html

正像前面講過(guò)的那樣,需要被授予 manager-gui 角色才能訪(fǎng)問(wèn)它。關(guān)于這個(gè)界面,還有一個(gè)獨(dú)立的文檔,請(qǐng)?jiān)L問(wèn)以下頁(yè)面:

HTML 界面可免受 CSRF(跨站請(qǐng)求偽造)攻擊。對(duì) HTML 頁(yè)面的每次訪(fǎng)問(wèn)都會(huì)生成一個(gè)隨機(jī)令牌,存儲(chǔ)在會(huì)話(huà)中,包含在頁(yè)面的所有鏈接中。如果你的下一個(gè)操作沒(méi)有正確的令牌值,操作就會(huì)被拒絕。如果令牌過(guò)期,可以從主頁(yè)或者 Manager 的 List Applications(列出的應(yīng)用)頁(yè)面重新開(kāi)始。

Manager 支持的命令

Manager 應(yīng)用能夠處理的命令都是通過(guò)下面這樣的請(qǐng)求 URL 來(lái)指定的:

http://{host}:{port}/manager/text/{command}?{parameters}

{host}{port} 分別代表運(yùn)行 Tomcat 服務(wù)器所在的主機(jī)名和端口號(hào)。{command} 代表所要執(zhí)行的 Manager 命令。{parameters} 代表該命令所專(zhuān)有的查詢(xún)參數(shù)。在后面的實(shí)例中,可以為你的安裝自定義適當(dāng)?shù)闹鳈C(jī)和端口。

這些命令通常是被 HTTP GET 請(qǐng)求執(zhí)行的。/deploy 命令有一種能夠被 HTTP PUT 請(qǐng)求所執(zhí)行的形式。

常見(jiàn)參數(shù)

多數(shù) Manager 命令都能夠接受一個(gè)或多個(gè)查詢(xún)參數(shù),這些查詢(xún)參數(shù)如下所示:

  • path 要處理的 Web 應(yīng)用的上下文路徑(包含前面的斜杠)。要想選擇 ROOT Web 應(yīng)用,指定 / 即可。注意:無(wú)法對(duì) Manager 應(yīng)用自身執(zhí)行管理命令。
  • version 并行部署 所用的 Web 應(yīng)用版本號(hào)。
  • war Web 應(yīng)用歸檔(WAR)文件的 URL,或者含有 Web 應(yīng)用的目錄路徑名,或者是上下文配置 .xml 文件。你可以按照以下任一格式使用 URL:
    • file:/absolute/path/to/a/directory 解壓縮后的 Web 應(yīng)用所在的目錄的絕對(duì)路徑。它將不做任何改動(dòng),直接附加到你所指定的上下文路徑上。
    • file:/absolute/path/to/a/webapp.war Web 應(yīng)用歸檔(WAR)文件的絕對(duì)路徑。對(duì) /deploy 命令有效,也是該命令所唯一能接受的格式。
    • jar:file:/absolute/path/to/a/warfile.war!/ 本地 WAR 文件的 URL。另外,為了能夠完整引用一個(gè)JAR 文件,你可以采用 JarURLConnection 類(lèi)的任何有效語(yǔ)法。
    • file:/absolute/path/to/a/context.xml Web 應(yīng)用上下文配置 .xml 文件的絕對(duì)路徑,上下文配置文件包含著上下文配置元素。
    • directory 主機(jī)應(yīng)用的基本目錄中的 Web 應(yīng)用的目錄名稱(chēng)。
    • webapp.war 主機(jī)應(yīng)用的基本目錄中的 WAR 文件的名稱(chēng)。

每個(gè)命令都會(huì)以 text/plain 的形式(比如,沒(méi)有 HTML 標(biāo)記的純 ASCII 碼文本 )返回響應(yīng),從而便于開(kāi)發(fā)者與程序閱讀。響應(yīng)的第一行以 OKFAIL 開(kāi)頭,表明請(qǐng)求的命令是否成功。如果失敗,響應(yīng)第一行隨后部分就會(huì)帶有遇到問(wèn)題的描述。一些包含其他信息行的命令會(huì)在下文予以介紹。

國(guó)際化說(shuō)明 Manager 應(yīng)用會(huì)在資源包中查找消息字符串,所以這些字符串可能已經(jīng)轉(zhuǎn)化為你所用平臺(tái)的語(yǔ)言版本了。下文的范例展示的全都是消息的英文版本。

遠(yuǎn)程部署新應(yīng)用

http://localhost:8080/manager/text/deploy?path=/foo

將作為請(qǐng)求數(shù)據(jù)指定在 HTTP PUT 請(qǐng)求中的 Web 應(yīng)用歸檔文件(WAR)上傳,將它安裝到相應(yīng)虛擬主機(jī)的 appBase 目錄中,啟動(dòng),使用目錄名或不帶 .war 后綴的 WAR 文件名作為路徑。稍后,可以通過(guò) /undeploy 取消對(duì)應(yīng)用的部署,相應(yīng)的應(yīng)用目錄也會(huì)被刪除。

該命令通過(guò) HTTP PUT 請(qǐng)求來(lái)執(zhí)行。

通過(guò)在 /META-INF/context.xml 中包含上下文配置 XML 文件,.WAR 文件能夠包含 Tomcat 特有的部署配置信息。

URL 參數(shù)包括:

  • update 設(shè)置為 true 時(shí),任何已有的更新將會(huì)首先取消部署。默認(rèn)值為 false。
  • tag 指定一個(gè)標(biāo)簽名稱(chēng)。這個(gè)參數(shù)能將已部署的 Web 應(yīng)用與標(biāo)簽連接起來(lái)。如果 Web 應(yīng)用被取消部署,則以后在需要重新部署時(shí),只需使用標(biāo)簽就能實(shí)現(xiàn)。

注意:該命令是 /undeploy 命令在邏輯上是對(duì)立的。

如果安裝或啟動(dòng)成功,會(huì)接受到這樣一個(gè)響應(yīng):

OK - Deployed application at context path /foo

否則,響應(yīng)會(huì)以 FAIL 開(kāi)始,并包含一個(gè)錯(cuò)誤消息。出現(xiàn)問(wèn)題的可能原因?yàn)椋?

  • Application already exists at path /foo
    當(dāng)前運(yùn)行的 Web 應(yīng)用的上下文路徑必須是唯一的。否則,必須使用這一上下文路徑取消對(duì)現(xiàn)有 Web 應(yīng)用的部署,或者為新應(yīng)用選擇另外一個(gè)上下文路徑。update 參數(shù)可以指定為 URL 中的參數(shù)。true 值可避免這種錯(cuò)誤。這種情況下,會(huì)在部署前,取消對(duì)現(xiàn)有應(yīng)用的部署。

  • Encountered exception
    遇到試圖開(kāi)啟新的 Web 應(yīng)用??刹榭?Tomcat 日志了解詳情。但有可能是在解析 /WEB-INF/web.xml 文件時(shí)遇到了問(wèn)題,或者在初始化應(yīng)用的事件偵聽(tīng)器與過(guò)濾器時(shí)出現(xiàn)遺失類(lèi)的情況。

從本地路徑處部署新的應(yīng)用

部署并啟動(dòng)一個(gè)新的 Web 應(yīng)用,附加到指定的上下文 path 上(不能被其他 Web 應(yīng)用同時(shí)使用)。該命令與 /undeploy 在邏輯上是對(duì)立的。

該命令由一個(gè) HTTP GET 請(qǐng)求執(zhí)行。部署命令的應(yīng)用方式有很多種。

部署之前部署過(guò)的 Web 應(yīng)用

http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag

用來(lái)部署之前曾通過(guò) tag 屬性部署過(guò)的 Web 應(yīng)用。注意,Manager 應(yīng)用的工作目錄包含之前部署過(guò)的 WAR 文件;如果清除它則將使部署失敗。

通過(guò) URL 部署一個(gè)目錄或 WAR 文件

部署位于 Tomcat 服務(wù)器上的 Web 應(yīng)用目錄或 .war 文件。如果沒(méi)有指定上下文路徑參數(shù) path,就會(huì)把目錄名或未帶 .war 后綴的 war 文件名當(dāng)做路徑來(lái)使用。war 參數(shù)指定了目錄或 WAR 文件的 URL(也包含 file:格式)。引用 WAR 文件的 URL 所采用的語(yǔ)法詳見(jiàn) java.net.JarURLConnection 類(lèi)的 Java 文檔頁(yè)面。只使用引用了整個(gè) WAR 文件的 URL。

下面這個(gè)實(shí)例中,Web 應(yīng)用位于 Tomcat 服務(wù)器上的 /path/to/foo 目錄中,被部署為上下文路徑為 /footoo 的 Web 應(yīng)用。

http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo

在下例中,Tomcat 服務(wù)器上的 .war 文件 /path/to/bar.war 被部署為上下文路徑為 /bar 的 Web 應(yīng)用。注意,這里沒(méi)有 path 參數(shù),因此上下文路徑默認(rèn)為沒(méi)有 .war 后綴的 WAR 文件名。

http://localhost:8080/manager/text/deploy?war=jar:file:/path/to/bar.war!/

從主機(jī)的 appBase 目錄中部署一個(gè)目錄或 WAR

對(duì)位于主機(jī) appBase 目錄中的 Web 應(yīng)用目錄或 .war 文件進(jìn)行部署。目錄名或沒(méi)有 .war 后綴名的 WAR 文件名被用作上下文路徑名。

在下面的范例中,Web 應(yīng)用位于 Tomcat 服務(wù)器中主機(jī) appBase 目錄下名為 foo 的子目錄中,被部署為上下文路徑名為 /foo 的 Web 應(yīng)用。注意,用到的上下文路徑名就是 Web 應(yīng)用的目錄名。

http://localhost:8080/manager/text/deploy?war=foo

在下面的范例中,位于主機(jī) appBase 目錄中的 bar.war 文件被部署為上下文名為 /bar 的 Web 應(yīng)用。

http://localhost:8080/manager/text/deploy?war=bar.war

使用上下文配置 .xml 文件來(lái)進(jìn)行部署

如果主機(jī)的 deployXML 標(biāo)志設(shè)定為 true,就可以使用上下文配置 .xml 文件以及一個(gè)可選的 .war 文件(或 Web 應(yīng)用目錄)來(lái)進(jìn)行 Web 應(yīng)用部署。在使用上下文 .xml 文件配置文件進(jìn)行部署時(shí),不會(huì)用到上下文路徑參數(shù) /path。

上下文配置 .xml 文件包含用于 Web 應(yīng)用上下文的有效 XML,就好像是在 Tomcat 的 server.xml 配置文件中進(jìn)行配置一樣。范例如下:

<Context path="/foobar" docBase="/path/to/application/foobar">
</Context>

可選的 war 參數(shù)被設(shè)定為指向 Web 應(yīng)用的 .war 文件或目錄的 URL,它會(huì)覆蓋掉上下文配置 .xml 文件中的任意 docBase。

在下面這個(gè)實(shí)例中,使用上下文配置 .xml 文件部署 Web 應(yīng)用:

http://localhost:8080/manager/text/deploy?config=file:/path/context.xml

在下面這個(gè)應(yīng)用部署范例中,使用了上下文配置 .xml 文件和位于服務(wù)器中的 Web 應(yīng)用的 .war 文件。

http://localhost:8080/manager/text/deploy
 ?config=file:/path/context.xml&war=jar:file:/path/bar.war!/

部署中的一些注意事項(xiàng)

如果主機(jī)配置中將 unpackWARs 設(shè)為 true,而且你部署了一個(gè) war 文件,那么這個(gè) war 文件將解壓縮至主機(jī)的 appBase 目錄下的一個(gè)目錄中。

如果應(yīng)用的 war 文件或目錄安裝在主機(jī)的 appBase 目錄中,那么或者主機(jī)應(yīng)該被部署為 autoDeploy 為 true,或者上下文路徑必須匹配目錄名或不帶 .war 后綴的 war 文件名。

為了避免不可信用戶(hù)作出對(duì) Web 應(yīng)用的侵害,主機(jī)的 deployXML 標(biāo)志可以設(shè)為 false。這能保證不可信用戶(hù)通過(guò)使用 XML 配置文件來(lái)部署 Web 應(yīng)用,也能阻止他們部署位于其主機(jī) appBase 之外的應(yīng)用目錄或 .war 文件。

部署響應(yīng)

如果安裝及啟動(dòng)都正常,會(huì)得到以下這樣的響應(yīng):

OK - Deployed application at context path /foo

否則,響應(yīng)會(huì)以 FAIL 開(kāi)頭并包含一些錯(cuò)誤消息,引起問(wèn)題的原因可能有以下幾種:

  • Application already exists at path /foo
    當(dāng)前運(yùn)行的 Web 應(yīng)用的上下文路徑必須是唯一的。否則,必須使用這一上下文路徑取消對(duì)現(xiàn)有 Web 應(yīng)用的部署,或者為新應(yīng)用選擇另外一個(gè)上下文路徑。update 參數(shù)可以指定為 URL 中的參數(shù)。true 值可避免這種錯(cuò)誤。這種情況下,會(huì)在部署前,取消對(duì)現(xiàn)有應(yīng)用的部署。

  • Document base does not exist or is not a readable directory
    通過(guò) war 指定的 URL 必須要確認(rèn)服務(wù)器中的某個(gè)目錄含有解壓縮后的 Web 應(yīng)用,包含該應(yīng)用的 WAR 文件的絕對(duì) URL 。更正 war 參數(shù)所提供的值。

  • Encountered exception
    遇到試圖開(kāi)啟新 Web 應(yīng)用??刹榭?Tomcat 日志了解詳情。但有可能是在解析 /WEB-INF/web.xml 文件時(shí)遇到了問(wèn)題,或者在初始化應(yīng)用的事件偵聽(tīng)器與過(guò)濾器時(shí)出現(xiàn)遺失類(lèi)的情況。

  • Invalid application URL was specified 所指定的指向目錄或 Web 應(yīng)用的 URL 無(wú)效。有效的 URL 必須以 file: 開(kāi)始,用于 WAR 文件的 URL 必須以 .war 結(jié)尾。

  • Invalid context path was specified
    上下文路徑必須以斜杠字符開(kāi)始,引用 ROOT 應(yīng)用必須使用 /。

  • Context path must match the directory or WAR file name
    如果應(yīng)用的 .war 文件或目錄安裝在主機(jī)的 appBase 目錄,那么或者主機(jī)應(yīng)該被部署為 autoDeploy 為 true,或者上下文路徑必須匹配目錄名或不帶 .war 后綴的 war 文件名。

  • Only web applications in the Host web application directory can be installed 如果主機(jī)的 deployXML 標(biāo)志為設(shè)為 false,那么當(dāng)要部署的 Web 應(yīng)用目錄或 .war 文件位于主機(jī) appBase 目錄之外時(shí),就會(huì)產(chǎn)生這樣的錯(cuò)誤。

列出當(dāng)前已部署的應(yīng)用

http://localhost:8080/manager/text/list

列出當(dāng)前所有部署的 Web 應(yīng)用的上下文路徑、當(dāng)前狀態(tài)(runningstopped),以及活躍會(huì)話(huà)。開(kāi)啟 Tomcat 后,一般立刻會(huì)產(chǎn)生如下這樣的響應(yīng):

OK - Listed applications for virtual host localhost
/webdav:running:0
/examples:running:0
/manager:running:0
/:running:0

Listed applications for virtual host localhost:列出虛擬主機(jī)本地主機(jī)的所有應(yīng)用。

重新加載一個(gè)現(xiàn)有應(yīng)用

http://localhost:8080/manager/text/reload?path=/examples

標(biāo)記一個(gè)現(xiàn)有應(yīng)用,關(guān)閉它并重新加載。這一功能的適用情況為:當(dāng) Web 應(yīng)用上下文不能重新加載;你已經(jīng)更新了 /WEB-INF/classes 目錄中的類(lèi)和屬性文件時(shí);或者當(dāng)你在 /WEB-INF/lib 目錄添加或更新了 jar 文件。

注意:在重新加載時(shí),Web 應(yīng)用配置文件 /WEB-INF/web.xml無(wú)法重新讀取。如果對(duì) web.xml 文件作出改動(dòng),則必須停止并啟動(dòng) Web 應(yīng)用。

如果命令成功執(zhí)行,應(yīng)得如下所示的響應(yīng):

OK - Reloaded application at context path /examples

否則,返回的響應(yīng)以 FAIL 開(kāi)頭,并包含相關(guān)的錯(cuò)誤消息。引起問(wèn)題的可能原因有以下幾種:

  • Encountered exception
    遇到試圖重啟 Web 應(yīng)用的異常??刹榭?Tomcat 日志了解詳情。

  • Invalid context path was specified
    上下文路徑必須以斜杠開(kāi)始,引用 ROOT Web 應(yīng)用必須使用 /。

  • No context exists for path /foo
    在所指定的上下文路徑中沒(méi)有發(fā)現(xiàn)部署好的應(yīng)用。

  • No context path was specified
    需要 path 參數(shù)。

  • Reload not supported on WAR deployed at path /foo
    當(dāng)前,如果主機(jī)配置為不解壓縮 WAR 文件時(shí),直接從一個(gè) WAR 文件安裝 Web 應(yīng)用時(shí),不支持重新加載應(yīng)用(以便使類(lèi)或 web.xml 文件中的更改生效)。由于只有在從已解壓縮目錄安裝 Web 應(yīng)用時(shí)才生效,所以在使用 WAR 文件時(shí),應(yīng)該先取消對(duì)應(yīng)用的部署,然后重新部署該應(yīng)用,以便使更改生效。

列出 OS 及 JVM 屬性

http://localhost:8080/manager/text/serverinfo

列出 Tomcat 版本、操作系統(tǒng)以及 JVM 屬性等相關(guān)信息。

如果出現(xiàn)錯(cuò)誤,響應(yīng)會(huì)以 FAIL 開(kāi)始并包含一系列錯(cuò)誤消息,導(dǎo)致錯(cuò)誤的可能原因包括有:

  • Encountered exception
    碰到異常試圖列舉系統(tǒng)屬性??刹榭?Tomcat 日志了解詳情。

列出可能的全局 JNDI 資源

http://localhost:8080/manager/text/resources[?type=xxxxx]

列出上下文配置文件資源鏈接中所使用的全局 JNDI 資源。如果指定 type 請(qǐng)求參數(shù),參數(shù)值必須是所需資源類(lèi)型的完整 Java 類(lèi)名(比如,指定 javax.sql.DataSource 獲取所有可用的 JDBC 數(shù)據(jù)資源的名稱(chēng))。如果沒(méi)有指定 type 請(qǐng)求參數(shù),則將返回所有類(lèi)型的資源。

根據(jù)是否指定了 type 請(qǐng)求參數(shù),常見(jiàn)響應(yīng)的第一行將如下所示:

OK - Listed global resources of all types

OK - Listed global resources of type xxxxx

后面將每個(gè)資源都單列一行,每一行內(nèi)的字段都由冒號(hào)(:)分隔,如下所示:

  • Global Resource Name 全局 JNDI 資源的名稱(chēng),將用在 <ResourceLink> 元素的 global 屬性中。
  • Global Resource Type 該全局 JNDI 資源的完整描述的 Java 類(lèi)名。

如果出現(xiàn)錯(cuò)誤,響應(yīng)將會(huì)以 FAIL 開(kāi)始,并包含一個(gè)錯(cuò)誤消息。出錯(cuò)的原因可能包括以下幾方面:

  • Encountered exception
    碰到異常試圖列舉 JNDI 資源,可查看 Tomcat 日志了解詳情。

  • No global JNDI resources are available
    運(yùn)行的 Tomcat 服務(wù)器沒(méi)有配置全局 JNDI 資源。

會(huì)話(huà)統(tǒng)計(jì)

http://localhost:8080/manager/text/sessions?path=/examples

顯示 Web 應(yīng)用默認(rèn)的會(huì)話(huà)超時(shí),當(dāng)前活躍會(huì)話(huà)在一分鐘范圍內(nèi)實(shí)際的超時(shí)次數(shù)。比如,重啟 Tomcat 并隨后執(zhí)行 /examples Web 應(yīng)用中的一個(gè) JSP 范例,有可能得到如下信息:

OK - Session information for application at context path /examples
Default maximum session inactive interval 30 minutes
<1 minutes: 1 sessions
1 - <2 minutes: 1 sessions

過(guò)期會(huì)話(huà)

http://localhost:8080/manager/text/expire?path=/examples&idle=num

顯示會(huì)話(huà)統(tǒng)計(jì)信息(比如上面的 /sessions 命令)以及超出 num 所指定的分鐘數(shù)的過(guò)期會(huì)話(huà)。要想使所有會(huì)話(huà)都過(guò)期,可使用 &idle = 0

OK - Session information for application at context path /examples
Default maximum session inactive interval 30 minutes
1 - <2 minutes: 1 sessions
3 - <4 minutes: 1 sessions
>0 minutes: 2 sessions were expired

實(shí)際上,/sessions/expire 是同一個(gè)命令的兩種異名,唯一不同之處在于 idle 參數(shù)。

開(kāi)啟一個(gè)現(xiàn)有應(yīng)用

http://localhost:8080/manager/text/start?path=/examples

標(biāo)記一個(gè)已停止的應(yīng)用,重新開(kāi)啟它,使其再次可用。停止并隨后重新開(kāi)啟應(yīng)用有時(shí)顯得非常重要,比如當(dāng)應(yīng)用所需的服務(wù)器暫時(shí)變得不可用時(shí)。通常情況下,與其讓用戶(hù)頻繁碰到數(shù)據(jù)庫(kù)異常,倒不如停止基于該數(shù)據(jù)庫(kù)的 Web 應(yīng)用運(yùn)行。

如果該命令成功執(zhí)行,將得到類(lèi)似如下的響應(yīng):

OK - Started application at context path /examples

否則,將返回出錯(cuò)響應(yīng),該響應(yīng)以 FAIL 開(kāi)頭,并包含一些錯(cuò)誤。出錯(cuò)原因可能是由于:

  • Encountered exception
    碰到異常情況,試圖開(kāi)啟 Web 應(yīng)用。可檢查 Tomcat 日志了解詳情。

  • Invalid context path was specified
    上下文路徑必須以斜杠字符開(kāi)始,引用 ROOT Web 應(yīng)用必須使用反斜杠(/)。

  • No context exists for path /foo
    在指定的上下文路徑處沒(méi)有部署的應(yīng)用。

  • No context path was specified
    需要指定 path 參數(shù)。

停止已有應(yīng)用

http://localhost:8080/manager/text/stop?path=/examples

標(biāo)記現(xiàn)有應(yīng)用,使其不可用,但仍使其處于已部署狀態(tài)。當(dāng)應(yīng)用停止時(shí),任何請(qǐng)求都將得到著名的 HTTP 404錯(cuò)誤。在應(yīng)用列表中,該應(yīng)用將顯示為“stopped”。

如果該命令成功執(zhí)行,將得到類(lèi)似如下的響應(yīng):

OK - Stopped application at context path /examples

否則,將返回出錯(cuò)響應(yīng),它以 FAIL 開(kāi)頭,并包含一個(gè)出錯(cuò)消息,可能導(dǎo)致出誤的原因包括:

  • Encountered exception
    碰到異常情況,試圖開(kāi)啟 Web 應(yīng)用??蓹z查 Tomcat 日志了解詳情。

  • Invalid context path was specified
    上下文路徑必須以斜杠字符開(kāi)始,引用 ROOT Web 應(yīng)用必須使用反斜杠(/)。

  • No context exists for path /foo 在指定的上下文路徑處沒(méi)有部署的應(yīng)用。

  • No context path was specified
    需要指定 path 參數(shù)。

取消對(duì)現(xiàn)有應(yīng)用的部署

http://localhost:8080/manager/text/undeploy?path=/examples

警告:該命令將刪除虛擬主機(jī) appBase 目錄(通常是 webapps )中的所有 Web 應(yīng)用。該命令將從未解壓縮(或已解壓縮)的 .WAR 式部署中,以及 $CATALINA_BASE/conf/[enginename]/[hostname]/ 中以 XML 格式保存的上下文描述符中,刪除應(yīng)用的 .WAR 文件及目錄。如果你只是想讓某個(gè)應(yīng)用暫停服務(wù),則應(yīng)該使用 /stop 命令。

標(biāo)記一個(gè)已有的應(yīng)用,將其恰當(dāng)?shù)仃P(guān)閉,從 Tomcat 中移除(從而使得以后可以重新使用該上下文路徑)。另外,如果文檔根目錄位于虛擬主機(jī)的 appBase 目錄(通常是 webapps)中,則它也將被移除。該命令是 /deploy 的逆向命令。

如果該命令成功執(zhí)行,將得到類(lèi)似如下的響應(yīng):

OK - Undeployed application at context path /examples

否則,將返回出錯(cuò)響應(yīng),它以 FAIL 開(kāi)頭,并包含一個(gè)出錯(cuò)消息,可能導(dǎo)致出誤的原因包括:

  • Encountered exception
    碰到異常情況,試圖取消對(duì)某個(gè) Web 應(yīng)用的部署??蓹z查 Tomcat 日志了解詳情。

  • Invalid context path was specified
    上下文路徑必須以斜杠字符開(kāi)始,引用 ROOT Web 應(yīng)用必須使用反斜杠(/)。

  • No context exists for path /foo 在指定的上下文路徑處沒(méi)有部署的應(yīng)用。

  • No context path was specified
    需要指定 path 參數(shù)。

尋找內(nèi)存泄露

http://localhost:8080/manager/text/findleaks[?statusLine=[true|false]]

尋找內(nèi)存泄露的診斷將觸發(fā)一個(gè)徹底的垃圾回收(GC)方案,所以如果在生產(chǎn)環(huán)境中使用它,需要非常謹(jǐn)慎才行。

尋找內(nèi)存泄露的診斷會(huì)試圖確認(rèn)已導(dǎo)致內(nèi)存泄露的 Web 應(yīng)用(當(dāng)其處于停止、重新加載,以及被取消部署狀態(tài)時(shí))。通常由一種分析器來(lái)確認(rèn)結(jié)論。診斷使用了由 StandardHost(標(biāo)準(zhǔn)主機(jī))實(shí)現(xiàn)所提供的附加功能。如果使用的是沒(méi)有擴(kuò)展自 StandHost 的自定義主機(jī),則該診斷無(wú)法生效。

已有一些文檔介紹,從 Java 代碼中顯式地觸發(fā)徹底的垃圾回收方案是不可靠的。此外,在不同的 JVM 中,也有很多選項(xiàng)禁止顯式觸發(fā)垃圾回收,比如像 -XX:+DisableExplicitGC。 如果你需要確認(rèn)診斷是否成功地實(shí)現(xiàn)了徹底的垃圾回收,可以使用 GC 日志、JConsole 分析器,或其他類(lèi)似工具。

如果該命令成功執(zhí)行,將得到類(lèi)似如下的響應(yīng):

/leaking-webapp

如果你希望在響應(yīng)中看到狀態(tài)行,那么可以在請(qǐng)求中加入 statusLine 查詢(xún)參數(shù),并將其設(shè)定為 true。

對(duì)于已停止運(yùn)行、被重新加載或被取消部署的Web 應(yīng)用,由于之前運(yùn)行所用到的類(lèi)可能仍然加載在內(nèi)存中,從而會(huì)造成內(nèi)存泄露。響應(yīng)將把這種應(yīng)用的每個(gè)上下文路徑都單列一行。如果應(yīng)用被重新加載了數(shù)次,就可能會(huì)列出幾次。

如果命令并沒(méi)有成功執(zhí)行,響應(yīng)將以 FAIL 開(kāi)頭,并包含一個(gè)錯(cuò)誤消息。

連接器 SSL/TLS 診斷

http://localhost:8080/manager/text/sslConnectorCiphers

SSL 連接器/加密診斷會(huì)列出當(dāng)前每一連接器所配置的 SSL/TLS 加密算法。對(duì)于 BIO 和 NIO,將列出每個(gè)加密算法套件的名稱(chēng);對(duì)于 APR,則返回 SSLCipherSuite 的值。

響應(yīng)類(lèi)似如下所示:

OK - Connector / SSL Cipher information
Connector[HTTP/1.1-8080]
  SSL is not enabled for this connector
Connector[HTTP/1.1-8443]
  TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  ...

線(xiàn)程轉(zhuǎn)儲(chǔ)

http://localhost:8080/manager/text/threaddump

編寫(xiě) JVM 線(xiàn)程轉(zhuǎn)儲(chǔ)。

響應(yīng)類(lèi)似如下所示:

OK - JVM thread dump
2014-12-08 07:24:40.080
Full thread dump Java HotSpot(TM) Client VM (25.25-b02 mixed mode):

"http-nio-8080-exec-2" Id=26 cpu=46800300 ns usr=46800300 ns blocked 0 for -1 ms waited 0 for -1 ms
   java.lang.Thread.State: RUNNABLE
        locks java.util.concurrent.ThreadPoolExecutor$Worker@1738ad4
        at sun.management.ThreadImpl.dumpThreads0(Native Method)
        at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446)
        at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:440)
        at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:409)
        at org.apache.catalina.manager.ManagerServlet.threadDump(ManagerServlet.java:557)
        at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:371)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
...

虛擬機(jī)(VM)相關(guān)信息

http://localhost:8080/manager/text/vminfo

寫(xiě)入一些關(guān)于 Java 虛擬機(jī)(JVM)的診斷信息。

響應(yīng)類(lèi)似如下所示:

OK - VM info
2014-12-08 07:27:32.578
Runtime information:
  vmName: Java HotSpot(TM) Client VM
  vmVersion: 25.25-b02
  vmVendor: Oracle Corporation
  specName: Java Virtual Machine Specification
  specVersion: 1.8
  specVendor: Oracle Corporation
  managementSpecVersion: 1.2
  name: ...
  startTime: 1418012458849
  uptime: 393855
  isBootClassPathSupported: true

OS information:
...

保存配置信息

http://localhost:8080/manager/text/save

如果不指定任何參數(shù),該命令將把服務(wù)器的當(dāng)前配置信息保存到 server.xml 中。已有的配置信息 .xml 文件將被重命名,作為必要時(shí)的備份文件。

如果指定了 path 參數(shù),而且該參數(shù)與已部署應(yīng)用的路徑相匹配,那么該 Web 應(yīng)用的配置將保存為一個(gè)命名恰當(dāng)?shù)纳舷挛?.xml 文件中,位于當(dāng)前主機(jī)的 xmlBase 中。

要想使用該命令,則 StoreConfig MBean 必須存在。通常需要用 StoreConfigLifecycleListener來(lái)配置。

如果命令不能成功執(zhí)行,響應(yīng)將以 FAIL 開(kāi)頭,并包含一個(gè)錯(cuò)誤消息。

服務(wù)器狀態(tài)

可從下面這些鏈接中觀(guān)察有關(guān)服務(wù)器的狀態(tài)信息。任何一個(gè) manager-** 角色都能訪(fǎng)問(wèn)這一頁(yè)面。

http://localhost:8080/manager/status
http://localhost:8080/manager/status/all

上面是用 HTML 格式顯示服務(wù)器狀態(tài)信息的命令。

http://localhost:8080/manager/status?XML=true
http://localhost:8080/manager/status/all?XML=true

上面是用 XML 格式顯示服務(wù)器狀態(tài)信息的命令。

首先,顯示的是服務(wù)器和 JVM 的版本號(hào)、JVM 提供者、操作系統(tǒng)的名稱(chēng)及其版本號(hào),然后還顯示了系統(tǒng)體系架構(gòu)類(lèi)型。

其次,顯示的是關(guān)于 JVM 的內(nèi)存使用信息。

最后,顯示的是關(guān)于 Tomcat AJP 和 HTTP 連接器的信息。對(duì)兩者來(lái)說(shuō),這些信息都很有用:

  • 線(xiàn)程信息:最大線(xiàn)程數(shù)、最少及最多的空閑線(xiàn)程數(shù)、當(dāng)前線(xiàn)程數(shù)量以及當(dāng)前繁忙線(xiàn)程。
  • 請(qǐng)求信息:最長(zhǎng)及最短的處理時(shí)間、請(qǐng)求和錯(cuò)誤的數(shù)量,以及接受和發(fā)送的字節(jié)數(shù)量。
  • 一張完整顯示線(xiàn)程階段、時(shí)間、發(fā)送字節(jié)數(shù)、接受字節(jié)數(shù)、客戶(hù)端、虛擬主機(jī)及請(qǐng)求的表。它將列出所有現(xiàn)有線(xiàn)程。下面列出了所有可能的線(xiàn)程階段:

    • 解析及準(zhǔn)備請(qǐng)求 將對(duì)請(qǐng)求報(bào)頭進(jìn)行解析,或進(jìn)行必要的準(zhǔn)備,以便讀取請(qǐng)求主體(如果指定了傳輸編碼)。
    • 服務(wù) 線(xiàn)程處理請(qǐng)求并生成響應(yīng)。該階段中至少有一個(gè)線(xiàn)程(可查看服務(wù)器狀態(tài)頁(yè))。
    • 完成 請(qǐng)求處理結(jié)束。所有仍在輸出緩沖區(qū)中的剩余響應(yīng)都被傳送至客戶(hù)端。如果有必要保持連接活躍,則下一個(gè)階段是“持續(xù)活躍”階段,否則接下來(lái)直接進(jìn)入“就緒”階段。
    • 持續(xù)活躍 當(dāng)客戶(hù)端發(fā)送另一請(qǐng)求時(shí),線(xiàn)程能使連接對(duì)客戶(hù)端保持開(kāi)放。如果接收到另一請(qǐng)求,下一階段就將是“解析及準(zhǔn)備請(qǐng)求”階段。如果持續(xù)活躍超時(shí)結(jié)束,仍沒(méi)有接收到請(qǐng)求,則連接關(guān)閉,進(jìn)入下一階段“就緒”階段。
    • 就緒 線(xiàn)程空閑,等待再此被使用。

使用 /status/all 命令可查看每一個(gè)已配置 Web 應(yīng)用的額外信息。

使用 JMX 代理 Servlet

什么是 JMX 代理 Servlet

JMX 代理 Servlet 是一款輕量級(jí)的代理。它的用途對(duì)用戶(hù)來(lái)說(shuō)并不是特別友好,但是其 UI 卻非常有助于整合命令行腳本,從便于監(jiān)控和改變 Tomcat 的內(nèi)部運(yùn)行。通過(guò)這個(gè)代理,我們可以獲取和設(shè)置信息。要想真正了解 JMX 代理 Servlet,首先應(yīng)該大概了解 JMX。如果不知道 JMX 的基本原理,那有些內(nèi)容就很難理解了。

JMX 查詢(xún)命令

JMX 的查詢(xún)命令格式如下所示:

http://webserver/manager/jmxproxy/?qry=STUFF

STUFF 是所要執(zhí)行的 JMX 查詢(xún)。比如,可以執(zhí)行以下這些查詢(xún):

  • qry=*%3Atype%3DRequestProcessor%2C* --> type=RequestProcessor 定位所有能夠處理請(qǐng)求并匯報(bào)各自狀態(tài)的 Worker。
  • qry=*%3Aj2eeType=Servlet%2c* --> j2eeType=Servlet 查詢(xún)返回所有加載的 Servlet。
  • qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> Catalina:type=Environment,resourcetype=Global,name=simpleValue 按照指定名稱(chēng)查找 MBean。

需要實(shí)際地試驗(yàn)一下才能真正理解這些功能。如果沒(méi)有提供 qry 參數(shù),則將顯示全部的 MBean。我們強(qiáng)烈建議你去閱讀 Tomcat 源代碼,真正了解 JMX 規(guī)范,更好地掌握所有能夠執(zhí)行的查詢(xún)。

JMX 的 get 命令

JMXProxyServlet 還支持一種 get 命令來(lái)獲取特定 MBean的屬性值。該命令的一般格式如下所示:

http://webserver/manager/jmxproxy/?get=BEANNAME&att=MYATTRIBUTE&key=MYKEY

必須提供如下參數(shù):

  1. get:MBean 的完整名稱(chēng)。
  2. att:希望獲取的屬性。
  3. key:(可選參數(shù))CompositeData MBean 的屬性中的鍵。

如果命令成功執(zhí)行,則一切正常,否則就會(huì)返回一個(gè)出錯(cuò)消息。舉兩個(gè)例子,比如當(dāng)希望獲取當(dāng)前的堆內(nèi)存數(shù)據(jù)時(shí),可以采用如下命令:

http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage

再或者,如果只希望獲取“用過(guò)的”鍵,可以采用如下命令:

http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used

JMX 的 set 命令

上面介紹了如何查詢(xún)一個(gè) MBean。下面來(lái)看看 Tomcat 的內(nèi)部運(yùn)行吧!set 命令的一般格式為:

http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE

需要提供三個(gè)請(qǐng)求參數(shù):

  • set:完整的 bean 名稱(chēng)。
  • att:想要改變的屬性。
  • val:新的屬性值。

如果命令成功執(zhí)行,則一切正常,否則就會(huì)返回一個(gè)出錯(cuò)消息。比如,假如想為 ErrorReportValve 進(jìn)行立即調(diào)試,可以將屬性 debug 設(shè)為 10:

http://localhost:8080/manager/jmxproxy/
 ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
 &att=debug&val=10  

所得結(jié)果如下(你的有可能不同):

Result: ok

下面來(lái)看看如果傳入一個(gè)不恰當(dāng)數(shù)值時(shí)的情況,比如使用一個(gè)URL,并試圖將屬性 debug 設(shè)置為 'cow'。

http://localhost:8080/manager/jmxproxy/
 ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost
 &att=debug&val=cow

運(yùn)行結(jié)果如下:

Error: java.lang.NumberFormatException: For input string: "cow"

JMX 的 invoke 命令

使用 invoke 命令,我們就可以在 MBean 中調(diào)用方法。該命令的一般格式為:

http://webserver/manager/jmxproxy/
 ?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS

比如,使用如下方式來(lái)調(diào)用 ServicefindConnectors() 方法:

http://localhost:8080/manager/jmxproxy/
 ?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=

利用 Ant 執(zhí)行 Manager 的命令

上面的文檔介紹了如何利用 HTTP 請(qǐng)求來(lái)執(zhí)行 Manager 的命令。除此之外,Tomcat 還專(zhuān)為 Ant(1.4 版或更新版本)構(gòu)建工具準(zhǔn)備了一套方便的任務(wù)定義。為了使用這些命令,必須執(zhí)行下面這些操作:

  • 下載 Ant 二進(jìn)制分發(fā)包,地址為:http://ant.apache.org。必須使用 1.4 版本或更新版本。
  • 將分發(fā)包安裝到合適的目錄中(下面將把它叫做 ANT_HOME)。
  • 將文件 server/lib/catalina-ant.jar 從 Tomcat 安裝目錄中復(fù)制到 Ant 的庫(kù)目錄($ANT_HOME/lib)。
  • $ANT_HOME/bin 目錄添加到環(huán)境變量 PATH 中。
  • 在 Tomcat 用戶(hù)數(shù)據(jù)庫(kù)中,至少配置一個(gè)擁有 manager-script 角色的用戶(hù)名/密碼組合數(shù)據(jù)。

為了在 Ant 中使用自定義任務(wù),必須首先用 <taskdef> 元素來(lái)聲明它們,因而 build.xml 文件應(yīng)類(lèi)似如下這樣:

<project name="My Application" default="compile" basedir=".">

  <!-- Configure the directory into which the web application is built -->
  <property name="build"    value="${basedir}/build"/>

  <!-- Configure the context path for this application -->
  <property name="path"     value="/myapp"/>

  <!-- Configure properties to access the Manager application -->
  <property name="url"      value="http://localhost:8080/manager/text"/>
  <property name="username" value="myusername"/>
  <property name="password" value="mypassword"/>

  <!-- Configure the custom Ant tasks for the Manager application -->
  <taskdef name="list"      classname="org.apache.catalina.ant.ListTask"/>
  <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask"/>
  <taskdef name="start"     classname="org.apache.catalina.ant.StartTask"/>
  <taskdef name="reload"    classname="org.apache.catalina.ant.ReloadTask"/>
  <taskdef name="stop"      classname="org.apache.catalina.ant.StopTask"/>
  <taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>
  <taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask"/>
  <typedef name="sessions"  classname="org.apache.catalina.ant.SessionsTask"/>
  <taskdef name="findleaks" classname="org.apache.catalina.ant.FindLeaksTask"/>
  <typedef name="vminfo"    classname="org.apache.catalina.ant.VminfoTask"/>
  <typedef name="threaddump" classname="org.apache.catalina.ant.ThreaddumpTask"/>
  <typedef name="sslConnectorCiphers" classname="org.apache.catalina.ant.SslConnectorCiphersTask"/>

  <!-- Executable Targets -->
  <target name="compile" description="Compile web application">
    <!-- ... construct web application in ${build} subdirectory, and
            generated a ${path}.war ... -->
  </target>

  <target name="deploy" description="Install web application"
          depends="compile">
    <deploy url="${url}" username="${username}" password="${password}"
            path="${path}" war="file:${build}${path}.war"/>
  </target>

  <target name="reload" description="Reload web application"
          depends="compile">
    <reload  url="${url}" username="${username}" password="${password}"
            path="${path}"/>
  </target>

  <target name="undeploy" description="Remove web application">
    <undeploy url="${url}" username="${username}" password="${password}"
            path="${path}"/>
  </target>

</project>

注意:上面的資源任務(wù)定義將覆蓋 Ant 1.7 中所添加的資源數(shù)據(jù)類(lèi)型。如果你希望使用這些資源數(shù)據(jù)類(lèi)型,需要使用 Ant 命名空間支持,將 Tomcat 的任務(wù)分配到它們自己的命名空間中。

現(xiàn)在,可以執(zhí)行類(lèi)似 ant deploy 這樣的命令將應(yīng)用部署到 Tomcat 的一