Tomcat8.5.24 403問題!

在許多生產環境中,具備部署新Web應用程序或取消部署現有Web應用程序的功能很是有用,而無需關閉並從新啓動整個容器。另外,即便您還沒有聲明它reloadable在Tomcat服務器配置文件中,也能夠請求現有應用程序從新加載自身。html

爲了支持這些功能,Tomcat包含一個Web應用程序(默認狀況下安裝在上下文路徑中/manager),該應用程序支持如下功能:java

  • 從WAR文件的上傳內容中部署新的Web應用程序。
  • 從服務器文件系統在指定的上下文路徑上部署新的Web應用程序。
  • 列出當前部署的Web應用程序以及當前對這些Web應用程序有效的會話。
  • 從新加載現有的Web應用程序,以反映/WEB-INF/classes或更改內容/WEB-INF/lib
  • 列出OS和JVM屬性值。
  • 列出可用的全局JNDI資源,用於準備<ResourceLink>嵌套在<Context>部署描述中的元素的部署工具。
  • 啓動一個已中止的應用程序(從而使其再次可用)。
  • 中止現有的應用程序(以便它變得不可用),但不要取消部署它。
  • 取消部署Web應用程序並刪除其文檔基目錄(除非它是從文件系統部署的)。

默認的Tomcat安裝包括Manager。要將Manager Web應用程序的實例添加Context到新主機,請在manager.xml文件$CATALINA_BASE/conf/[enginename]/[hostname]夾中安裝 上下文配置文件 。這裏是一個例子:web

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

若是您將Tomcat配置爲支持多個虛擬主機(網站),則須要爲每一個虛擬主機配置一個管理器。sql

有三種方法可使用Manager Web應用程序。數據庫

  • 做爲您在瀏覽器中使用的具備用戶界面的應用程序。如下是一個示例URL,您能夠localhost用您的網站主機名替換: http://localhost:8080/manager/html
  • 僅使用HTTP請求的最小版本,適用於系統管理員設置的腳本。命令是做爲請求URI的一部分給出的,而且響應以簡單文本的形式被容易地解析和處理。有關更多信息,請參閱 支持的經理命令
  • Ant (1.4或更高版本)構建工具的一組便利任務定義。有關更多信息,請參閱 使用Ant執行管理器命令

配置Manager應用程序訪問

下面的描述使用變量名$ CATALINA_BASE來引用基本目錄,大多數相對路徑被解析。若是您還沒有經過設置CATALINA_BASE目錄將Tomcat配置爲多個實例,則$ CATALINA_BASE將被設置爲$ CATALINA_HOME(您已安裝Tomcat的目錄)的值。apache

使用容許互聯網上的任何人執行服務器上的Manager應用程序的默認設置來運送Tomcat是至關不安全的。所以,Manager應用程序隨附的要求是,任未嘗試使用它的用戶都必須使用具備與其關聯的manager-xxx角色之一(角色名稱取決於所需功能)的用戶名和密碼進行身份驗證。此外,$CATALINA_BASE/conf/tomcat-users.xml分配給這些角色的默認用戶文件()中沒有用戶名。所以,默認狀況下徹底禁用對Manager應用程序的訪問。瀏覽器

您能夠web.xml在Manager Web應用程序的文件中找到角色名稱。可用的角色是:tomcat

  • manager-gui - 訪問HTML界面。
  • manager-status - 只能訪問「服務器狀態」頁面。
  • manager-script - 訪問本文檔中描述的工具友好純文本界面以及「服務器狀態」頁面。
  • manager-jmx - 訪問JMX代理接口並訪問「服務器狀態」頁面。

HTML接口受到CSRF(跨站點請求僞造)攻擊的保護,但文本和JMX接口沒法受到保護。這意味着容許訪問文本和JMX界面的用戶在使用Web瀏覽器訪問Manager應用程序時必須謹慎行事。爲了保持CSRF保護:安全

  • 若是您使用Web瀏覽器使用具備manager-script或 manager-jmx角色的用戶(例如,用於測試純文本或JMX界面)訪問Manager應用程序,則必須關閉瀏覽器的全部窗口以終止會話。若是您未關閉瀏覽器並訪問其餘網站,則可能成爲CSRF攻擊的受害者。
  • 建議不要將manager-scriptmanager-jmx 角色授予具備manager-gui角色的用戶。

請注意,JMX代理接口其實是Tomcat的低級別根類管理接口。若是他知道要調用哪些命令,能夠作不少事情。啓用manager-jmx角色時應謹慎 。服務器

要容許訪問Manager Web應用程序,您必須建立一個新的用戶名/密碼組合,並將其中一個manager-xxx角色與其關聯 ,或者將manager-xxx角色添加 到某個現有用戶名/密碼組合。因爲本文檔的大部分描述了使用文本界面,本示例將使用角色名稱管理器腳本。具體如何配置用戶名/密碼取決於 您使用的Realm實施方式:

  • UserDatabaseRealm加上MemoryUserDatabaseMemoryRealm - UserDatabaseRealmMemoryUserDatabase配置爲默認值$CATALINA_BASE/conf/server.xmlMemoryUserDatabaseMemoryRealm都默認讀取一個XML格式的文件 $CATALINA_BASE/conf/tomcat-users.xml,這個文件能夠用任何文本編輯器編輯。該文件包含<user>每一個用戶的XML ,可能以下所示:
    <user username="craigmcc" password="secret" roles="standard,manager-script" />
    它定義了這我的用來登陸的用戶名和密碼,以及他或她所關聯的角色名稱。您能夠將manager-script角色添加到roles一個或多個現有用戶的逗號分隔 屬性,和/或使用該指定角色建立新用戶。
  • DataSourceRealmJDBCRealm - 您的用戶和角色信息存儲在經過JDBC訪問的數據庫中。將管理員腳本角色添加到一個或多個現有用戶,和/或按照您的環境的標準程序建立一個或多個分配了此角色的新用戶。
  • JNDIRealm - 您的用戶和角色信息存儲在經過LDAP訪問的目錄服務器中。將管理員腳本角色添加 到一個或多個現有用戶,和/或按照您的環境的標準程序建立一個或多個分配了此角色的新用戶。

當您第一次嘗試發佈下一節中介紹的管理員命令之一時,您將面臨使用BASIC認證登陸的挑戰。您輸入的用戶名和密碼可有可無,只要它們標識擁有角色管理器腳本的用戶數據庫中的有效用戶便可。

除了密碼限制以外,還能夠經過添加或來限制遠程IP地址或主機對Manager Web應用程序的訪問權限。詳情請參閱閥門文檔 。如下是經過IP地址限制對本地主機的訪問的示例:RemoteAddrValveRemoteHostValve

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

HTML用戶友好界面

Manager Web應用程序的用戶友好HTML界面位於

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

如上所述,您須要 容許manager-gui角色訪問它。有一個單獨的文檔提供了有關此界面的幫助。看到:

HTML接口受到CSRF(跨站點請求僞造)攻擊的保護。每次訪問HTML頁面都會生成一個隨機令牌,該令牌存儲在會話中幷包含在頁面上的全部連接中。若是您的下一個操做沒有正確的令牌值,則操做將被拒絕。若是令牌已過時,則能夠從管理器的主頁面或列表應用程序頁面從新開始 。

支持的管理員命令

Manager應用程序知道如何處理的全部命令都在單個請求URI中指定,以下所示:

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

其中{host}{port}表示是Tomcat運行的主機名和端口號,{command} 表示要執行經理命令, {parameters}表明特定於該命令的查詢參數。在下面的插圖中,爲您的安裝適當地自定義主機和端口。

這些命令一般由HTTP GET請求執行。該 /deploy命令具備由HTTP PUT請求執行的表單。

通用參數

大多數命令接受一個或多個如下查詢參數:

  • 路徑 - 正在處理的Web應用程序的上下文路徑(包括前導斜槓)。要選擇ROOT Web應用程序,請指定「/」。 注意:沒法在Manager應用程序自己上執行管理命令。
  • 版本 - 並行部署功能所使用的此Web應用程序的版本。若是在須要路徑的地方使用並行部署,則必須指定除路徑之外的版本,而且路徑和版本的組合必須是惟一的,而不只限於路徑。
  • war - Web應用程序存檔(WAR)文件的URL,或包含Web應用程序的目錄的路徑名,或上下文配置「.xml」文件。您可使用如下任何格式的網址:
    • file:/ absolute / path / to / a / directory - 包含Web應用程序的未打包版本的目錄的絕對路徑。該目錄將附加到您指定的上下文路徑,而不作任何更改。
    • 文件:/absolute/path/to/a/webapp.war - Web應用程序歸檔(WAR)文件的絕對路徑。這是有效的 惟一/deploy命令,而且是於該命令的惟一可接受的格式。
    • file:/absolute/path/to/a/context.xml - Web應用程序的絕對路徑上下文配置「.xml」文件,其中包含Context配置元素。
    • 目錄 - 主機的應用程序基目錄中的Web應用程序上下文的目錄名稱。
    • webapp.war - 位於主機的應用程序基礎目錄中的Web應用程序戰爭文件的名稱。

每一個命令都將返回一個text/plain格式的響應(即純HTML沒有HTML標記),令人和程序均可以輕鬆讀取)。響應的第一行將以OK或者開始 FAIL,指示請求的命令是否成功。在失敗的狀況下,第一行的其他部分將包含遇到的問題的描述。某些命令包含以下所述的其餘行信息。

國際化注意事項 - Manager應用程序在資源包中查找其消息字符串,所以可能爲您的平臺翻譯了字符串。如下示例顯示了這些消息的英文版本。

遠程部署新的應用程序存檔(WAR)

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

上傳在此HTTP PUT請求中指定爲請求數據的Web應用程序存檔(WAR)文件,將其安裝到appBase 咱們對應的虛擬主機的目錄中,而後啓動,爲appBase從指定路徑添加的WAR文件派生名稱。稍後可使用該/undeploy命令取消部署該應用程序(並刪除相應的WAR文件)。

該命令由HTTP PUT請求執行。

.WAR文件可能包含Tomcat特定的部署配置,其中包含一個Context配置XML文件 /META-INF/context.xml

網址參數包括:

  • update:若是設置爲true,則任何現有更新都將首先取消部署。默認值設置爲false。
  • tag:指定標籤名稱,這容許將部署的webapp與標籤或標籤相關聯。若是Web應用程序未部署,則能夠稍後在僅使用標記的狀況下從新部署。

 - 該命令與命令的邏輯相反/undeploy

若是安裝和啓動成功,您將收到以下響應:

OK - Deployed application at context path /foo

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 應用程序已存在於path / foo

    全部當前運行的Web應用程序的上下文路徑必須是惟一的。所以,您必須使用此上下文路徑取消部署現有的Web應用程序,或者爲新的Web應用程序選擇不一樣的上下文路徑。該update參數能夠指定爲URL上的參數,其值爲true避免此錯誤。在這種狀況下,將在執行部署以前在現有應用程序上執行取消部署。

  • 遇到異常

    嘗試啓動新的Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息,但可能的解釋包括解析/WEB-INF/web.xml文件時遇到的問題,或初始化應用程序事件偵聽器和過濾器時遇到的類丟失。

從本地路徑部署新的應用程序

部署並啓動一個新的Web應用程序,並附加到指定的上下文中 path(不能由任何其餘Web應用程序使用)。該命令與命令的邏輯相反/undeploy

該命令由HTTP GET請求執行。可使用部署命令的多種不一樣方式。

部署之前部署的Web應用程序

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

這可用於部署之前部署的Web應用程序,該應用程序已使用該tag屬性進行了部署。請注意,Manager webapp的工做目錄將包含先前部署的WAR; 刪除它會致使部署失敗。

經過URL部署目錄或WAR

部署位於Tomcat服務器上的Web應用程序目錄或「.war」文件。若是path指定no ,則路徑和版本將從目錄名稱或war文件名稱派生。該war參數指定file:目錄或Web應用程序歸檔(WAR)文件的URL(包括方案)。在Javadocs頁面上描述了引用WAR文件的URL的支持語法 java.net.JarURLConnection。僅使用引用整個WAR文件的URL。

在此示例中,位於/path/to/fooTomcat服務器目錄 中的Web應用程序部署爲名爲的Web應用程序上下文/footoo

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

在本例中,/path/to/bar.warTomcat服務器上的「.war」文件被部署爲名爲的Web應用程序上下文 /bar。請注意,沒有path參數,所以上下文路徑默認爲不帶「.war」擴展名的Web應用程序歸檔文件的名稱。

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

從主機應用程序庫部署目錄或戰爭

部署位於您的Host appBase目錄中的Web應用程序目錄或「.war」文件。路徑和可選版本源自目錄或war文件名。

在此示例中,位於 fooTomcat服務器的Host appBase目錄中的子目錄中的Web應用程序將部署爲名爲的Web應用程序上下文/foo。請注意,使用的上下文路徑是Web應用程序目錄的名稱。

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

在這個例子中,bar.war位於Tomcat服務器的Host appBase目錄中的「.war」文件被部署爲名爲的Web應用程序上下文/bar

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

使用上下文配置「.xml」文件進行部署

若是Host deployXML標誌設置爲true,則可使用Context配置「.xml」文件和可選的「.war」文件或Web應用程序目錄來部署Web應用程序。上下文path 使用上下文「.XML」配置文件部署Web應用程序時不被使用。

上下文配置「.xml」文件能夠包含Web應用程序上下文的有效XML,就像它在Tomcat server.xml配置文件中配置同樣。這裏是一個例子:

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

當可選war參數設置爲Web應用程序「.war」文件或目錄的URL時,它將覆蓋上下文配置「.xml」文件中配置的任何docBase。

如下是使用Context配置「.xml」文件部署應用程序的示例。

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

如下是使用位於服務器上的Context配置「.xml」文件和Web應用程序「.war」文件部署應用程序的示例。

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

部署說明

若是主機配置了unpackWARs = true而且您部署了一個war文件,則該war將被解壓到您的主機appBase目錄中的一個目錄中。

若是應用程序戰爭或目錄安裝在您的主機appBase目錄中,而且主機配置了autoDeploy = true,或者上下文路徑必須與不帶「.war」擴展名的目錄名或war文件名匹配。

爲了確保不受信任的用戶能夠管理Web應用程序的安全性,能夠將Host deployXML標誌設置爲false。這能夠防止不受信任的用戶使用配置XML文件部署Web應用程序,並防止他們部署位於其主機應用程序庫外部的應用程序目錄或「.war」文件。

部署響應

若是安裝和啓動成功,您將收到以下響應:

OK - Deployed application at context path /foo

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 應用程序已存在於path / foo

    全部當前運行的Web應用程序的上下文路徑必須是惟一的。所以,您必須使用此上下文路徑取消部署現有的Web應用程序,或者爲新的Web應用程序選擇不一樣的上下文路徑。該update參數能夠指定爲URL上的參數,其值爲true避免此錯誤。在這種狀況下,將在執行部署以前在現有應用程序上執行取消部署。

  • 文檔庫不存在或不是可讀的目錄

    war參數指定的URL 必須標識此服務器上包含Web應用程序的「解包」版本的目錄,或包含此應用程序的Web應用程序存檔(WAR)文件的絕對URL。更正war參數指定的值。

  • 遇到異常

    嘗試啓動新的Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息,但可能的解釋包括解析/WEB-INF/web.xml文件時遇到的問題,或初始化應用程序事件偵聽器和過濾器時遇到的類丟失。

  • 指定了無效的應用程序URL

    您指定的目錄或Web應用程序的URL無效。這些URL必須file:以WAR 開頭,而且URL文件必須以「.war」結尾。

  • 指定了無效的上下文路徑

    上下文路徑必須以斜槓字符開頭。要引用ROOT Web應用程序,請使用「/」。

  • 上下文路徑必須與目錄或WAR文件名稱匹配:

    若是應用程序戰爭或目錄安裝在主機appBase目錄中,而且主機配置了autoDeploy = true,則上下文路徑必須與不帶「.war」擴展名的目錄名稱或war文件名稱匹配。

  • 只能安裝Host Web應用程序目錄中的Web應用程序

    若是Host deployXML標誌設置爲false,則若是嘗試在Host AppBase目錄以外部署Web應用程序目錄或「.war」文件,則會發生此錯誤。

列出當前部署的應用程序

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

列出全部當前部署的Web應用程序的上下文路徑,當前狀態(running或 stopped)以及活動會話的數量。啓動Tomcat後當即進行的典型響應可能以下所示:

OK - Listed applications for virtual host localhost
/webdav:running:0:webdav
/examples:running:0:examples
/manager:running:0:manager
/:running:0:ROOT
/test:running:0:test##2
/test:running:0:test##1

從新加載現有的應用程序

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

指示現有應用程序關閉並從新加載。若是Web應用程序上下文不可從新載入,而且已經更新了/WEB-INF/classes 目錄中的類或屬性文件,或者在目錄中添加或更新了jar文件時,這會很是有用/WEB-INF/lib

若是此命令成功,您將看到以下的響應:

OK - Reloaded application at context path /examples

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試從新啓動Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息。

  • 指定了無效的上下文路徑

    上下文路徑必須以斜槓字符開頭。要引用ROOT Web應用程序,請使用「/」。

  • 路徑/ foo沒有上下文

    您指定的上下文路徑上沒有部署的應用程序。

  • 沒有指定上下文路徑

    path參數是必需的。

  • 在部署在path / foo的WAR上不支持從新加載

    目前,web.xml當Web應用程序直接從WAR文件進行部署時,不支持應用程序從新加載(以獲取對類或文件的更改 )。它僅適用於從解壓目錄中部署Web應用程序的狀況。若是您正在使用WAR文件,那麼應該undeploy再次deploy或者 deploy經過update參數使應用程序再次選擇您的更改。

列出操做系統和JVM屬性

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

列出有關Tomcat版本,操做系統和JVM屬性的信息。

若是發生錯誤,響應將從頭開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試枚舉系統屬性時遇到異常。查看Tomcat日誌以獲取詳細信息。

列出可用的全局JNDI資源

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

列出可用於上下文配置文件資源連接的全局JNDI資源。若是指定了type 請求參數,則該值必須是您感興趣的資源類型的徹底限定Java類名稱(例如,您將指定javax.sql.DataSource獲取全部可用JDBC數據源的名稱)。若是您不指定type請求參數,則會返回全部類型的資源。

根據type請求參數是否被指定,正常響應的第一行將是:

OK - Listed global resources of all types

要麼

OK - Listed global resources of type xxxxx

以後每一個資源一行。每行由由冒號字符(「:」)分隔的字段組成,以下所示:

  • 全局資源名稱 - 此全局JNDI資源的名稱,將在元素的global屬性中使用 <ResourceLink>
  • 全局資源類型 - 此全局JNDI資源的徹底限定Java類名稱。

若是發生錯誤,響應將從頭開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試枚舉全局JNDI資源時遇到異常。查看Tomcat日誌以獲取詳細信息。

  • 沒有全球JNDI資源可用

    您正在運行的Tomcat服務器已配置爲不具備全局JNDI資源。

會話統計

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

顯示Web應用程序的默認會話超時以及落在其實際超時時間的一分鐘範圍內的當前活動會話的數量。例如,在從新啓動Tomcat,而後在/examplesWeb應用程序中執行一個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

過時會話

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

顯示會話統計信息(如上述/sessions 命令)並使空閒時間超過num 幾分鐘的會話過時。要過時全部會話,請使用&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

其實/sessions/expire是相同的命令同義詞。區別在於idle 參數的存在。

啓動現有的應用程序

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

指示中止的應用程序從新啓動,並使其本身再次可用。例如,若是應用程序所需的數據庫暫時不可用,則中止和啓動頗有用。中止依賴此數據庫的Web應用程序一般會更好,而不是讓用戶不斷遇到數據庫異常。

若是此命令成功,您將看到以下的響應:

OK - Started application at context path /examples

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試啓動Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息。

  • 指定了無效的上下文路徑

    上下文路徑必須以斜槓字符開頭。要引用ROOT Web應用程序,請使用「/」。

  • 路徑/ foo沒有上下文

    您指定的上下文路徑上沒有部署的應用程序。

  • 沒有指定上下文路徑

    path參數是必需的。

中止現有的應用程序

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

指示現有應用程序使其不可用,但保留它的部署狀態。在應用程序中止時進入的任何請求都將看到HTTP錯誤404,而且此應用程序將在列表應用程序命令中顯示爲「已中止」。

若是此命令成功,您將看到以下的響應:

OK - Stopped application at context path /examples

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試中止Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息。

  • 指定了無效的上下文路徑

    上下文路徑必須以斜槓字符開頭。要引用ROOT Web應用程序,請使用「/」。

  • 路徑/ foo沒有上下文

    您指定的上下文路徑上沒有部署的應用程序。

  • 沒有指定上下文路徑 該path參數是必需的。

取消部署現有的應用程序

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

警告 - 該命令將刪除appBase該虛擬主機的目錄內存在的任何Web應用程序工件(一般爲「webapps」)。這將刪除應用程序.WAR(若是有的話),從應用程序目錄中以解壓縮的形式部署或從.WAR擴展部署獲得的應用程序目錄,以及從$CATALINA_BASE/conf/[enginename]/[hostname]/目錄的XML上下文定義 。若是您只是想讓應用程序中止服務,則應該使用該/stop命令。

指示現有的應用程序正常關閉,並將其從Tomcat中移除(這也使得此上下文路徑可供稍後重用)。另外,若是該文檔根目錄存在於appBase該虛擬主機的目錄(一般是「webapps」)中,則該目錄將被刪除。該命令與命令的邏輯相反 /deploy

若是此命令成功,您將看到以下的響應:

OK - Undeployed application at context path /examples

不然,響應將以開始FAIL幷包含錯誤消息。問題的可能緣由包括:

  • 遇到異常

    嘗試取消部署Web應用程序時遇到異常。查看Tomcat日誌以獲取詳細信息。

  • 指定了無效的上下文路徑

    上下文路徑必須以斜槓字符開頭。要引用ROOT Web應用程序,請使用「/」。

  • 沒有名爲/ foo的上下文

    沒有您指定的名稱的已部署應用程序。

  • 沒有指定上下文路徑 該path參數是必需的。

發現內存泄漏

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

查找泄漏診斷觸發完整的垃圾回收。在生產系統中應該很是當心地使用它。

查找泄漏診斷嘗試識別在中止,從新加載或取消部署時致使內存泄漏的Web應用程序。結果應該始終使用分析器進行確認。診斷使用StandardHost實現提供的附加功能。若是使用不擴展StandardHost的自定義主機,它將不起做用。

記錄顯式觸發Java代碼的完整垃圾收集是不可靠的。此外,根據使用的JVM,能夠選擇禁用顯式GC觸發,例如-XX:+DisableExplicitGC。若是您想確保診斷程序成功運行完整的GC,則須要使用GC日誌記錄,JConsole或相似工具進行檢查。

若是此命令成功,您將看到以下的響應:

/leaking-webapp

若是您但願查看響應中包含的狀態行statusLine,請將請求中的查詢參數包含在 值中 true

中止,從新加載或取消部署的Web應用程序的每一個上下文路徑,但以前運行的哪些類仍然加載到內存中,從而致使內存泄漏,將在新行中列出。若是應用程序已屢次從新加載,則可能會屢次列出。

若是該命令不成功,則響應將以 FAIL包含錯誤消息的開始。

鏈接器SSL / TLS診斷

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

SSL鏈接器/密碼診斷程序列出了當前爲每一個鏈接器配置的SSL / TLS密碼。對於NIO和NIO2,列出了各個密碼套件的名稱。對於APR,返回SSLCipherSuite的值。

答案看起來像這樣:

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
  ...

線程轉儲

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

編寫一個JVM線程轉儲。

答案看起來像這樣:

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)
...

VM信息

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

編寫一些關於Java虛擬機的診斷信息。

答案看起來像這樣:

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

若是未指定任何參數,則此命令將服務器的當前配置保存到server.xml。若是須要,現有文件將被重命名爲備份。

若是使用與path部署的Web應用程序的路徑相匹配的參數指定,則該Web應用程序的配置將被保存到xmlBase 當前主機中適當命名的context.xml文件中。

要使用該命令,StoreConfig MBean必須存在。一般這是使用StoreConfigLifecycleListener配置的。

若是該命令不成功,則響應將以 FAIL包含錯誤消息的開始。

服務器狀態

從如下連接能夠查看關於服務器的狀態信息。任何一個manager-xxx角色都容許訪問此頁面。

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

以HTML格式顯示服務器狀態信息。

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

以XML格式顯示服務器狀態信息。

首先,您有服務器和JVM版本號,JVM提供程序,操做系統名稱和編號,而後是架構類型。

其次,有關於JVM的內存使用狀況的信息。

而後,有關於Tomcat AJP和HTTP鏈接器的信息。他們都有相同的信息:

  • 線程信息:最大線程數,最小和最大備用線程數,當前線程數和當前線程繁忙。

  • 請求信息:最大處理時間和處理時間,請求和錯誤計數,接收和發送的字節數。

  • 顯示階段,時間,字節發送,字節接收,客戶端,VHost和請求的表格。表中列出了全部現有的線程。如下是可能的線程階段列表:

    • 「解析和準備請求」:正在解析請求標頭或正在進行讀取請求正文(若是已指定傳輸編碼)的必要準備。

    • 「服務」:線程正在處理請求並生成響應。此階段遵循「解析和準備請求」階段,並在「完成」階段以前。在這個階段老是有至少一個線程(服務器狀態頁面)。

    • 「完成」:請求處理結束。任何剩餘的響應仍在輸出緩衝區中發送到客戶端。若是適合保持鏈接處於活動狀態,或者「保持活動」不合適,則該階段後面跟隨「Keep-Alive」。

    • 「Keep-Alive」:在客戶端發送另外一個請求的狀況下,線程保持鏈接對客戶端開放。若是收到另外一個請求,下一階段將是「解析和準備請求」。若是在保持活動超時以前沒有收到請求,鏈接將被關閉,下一階段將爲「就緒」。

    • 「就緒」:線程處於靜止狀態,可使用。

若是您使用的是/status/all命令,則每一個部署的Web應用程序的其餘信息都將可用。

使用JMX代理Servlet

什麼是JMX Proxy Servlet

JMX代理Servlet是一個輕量級代理,用於獲取和設置tomcat內部。(或者任何經過MBean暴露的類)它的用法不是很是用戶友好,可是UI對於集成命令行腳原本監視和更改tomcat的內部很是有用。你能夠用代理作兩件事:獲取信息和設置信息。爲了您真正理解JMX代理Servlet,您應該對JMX有一個大致的瞭解。若是你不知道JMX是什麼,那麼準備好會感到困惑。

JMX查詢命令

這採起的形式是:

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

STUFF您但願執行的JMX查詢在哪裏?例如,如下是您可能但願運行的一些查詢:

  • qry=*%3Atype%3DRequestProcessor%2C* --> type=RequestProcessor 這將找到全部能夠處理請求並報告其狀態的工做人員。
  • qry=*%3Aj2eeType=Servlet%2c* --> j2eeType=Servlet 它返回全部加載的servlet。
  • qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> Catalina:type=Environment,resourcetype=Global,name=simpleValue 它以給定名稱查找特定的MBean。

您須要試驗以真正理解其功能若是您不提供qry參數,則將顯示全部MBean。咱們建議您查看tomcat源代碼並理解JMX規範,以更好地理解您可能運行的全部查詢。

JMX獲取命令

JXMProxyServlet還支持一個「get」命令,您可使用該命令來獲取特定MBean屬性的值。該get命令的通常形式是:

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

您必須提供如下參數:

  1. get:完整的bean名稱
  2. att:您想要獲取的屬性
  3. key:(可選)成爲CompositeData MBean屬性的鍵

若是一切順利,那麼它會說OK,不然會顯示錯誤消息。例如,假設咱們但願獲取當前的堆內存數據:

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

或者,若是您只須要「已用」鍵:

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

JMX設置命令

既然您能夠查詢MBean,那麼就可使用Tomcat的內部工具了!set命令的通常形式是:

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

因此你須要提供3個請求參數:

  1. set:完整的bean名稱
  2. att:你想改變的屬性
  3. val:新的價值

若是一切正常,那麼它會說OK,不然會顯示錯誤消息。例如,讓咱們說咱們但願打開調試的動態 ErrorReportValve。如下將把調試設置爲10。

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

個人結果是(YMMV):

Result: ok

這是我看到的,若是我經過了一個很差的價值。這裏是我使用的URL,我嘗試設置調試等於'牛':

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

當我嘗試時,個人結果是

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

JMX Invoke命令

invoke命令容許在MBean上調用方法。該命令的通常形式是:

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

例如,要調用Service的使用findConnectors()方法 :

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

使用Ant執行管理器命令

如上文所述,除了可以經過HTTP請求執行管理器命令外,Tomcat還包括一組適用於Ant(版本1.4或更高版本)構建工具的任務定義。爲了使用這些命令,您必須執行如下設置操做:

  • http://ant.apache.org下載Ant的二進制發行版 。您必須使用版本1.4或更高版本。
  • 將Ant發行版安裝在方便的目錄中(在這些說明的其他部分中稱爲ANT_HOME)。
  • 將該$ANT_HOME/bin目錄添加到您的PATH 環境變量。
  • 在包含該manager-script角色的Tomcat用戶數據庫中至少配置一個用戶名/密碼組合。

要在Ant中使用自定義任務,必須首先使用<import>元素聲明它們 。所以,你的build.xml 文件可能看起來像這樣:

<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 path to the Tomcat installation -->
  <property name="catalina.home" value="/usr/local/apache-tomcat"/>

  <!-- Configure the custom Ant tasks for the Manager application -->
  <import file="${catalina.home}/bin/catalina-tasks.xml"/>

  <!-- 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>

注意:經過上述導入定義資源任務將覆蓋Ant 1.7中添加的資源數據類型。若是您但願使用資源數據類型,則須要使用Ant的名稱空間支持進行修改, catalina-tasks.xml以將Tomcat任務分配給其本身的名稱空間。

如今,您能夠執行命令ant deploy來將應用程序部署到正在運行的Tomcat實例,或者ant reload告訴Tomcat從新加載它。還要注意,該build.xml文件中的大部分有趣值都被定義爲可替換的屬性,所以您能夠從命令行覆蓋它們的值。例如,您可能認爲將真實管理員密碼包含在build.xml文件源代碼中存在安全風險 。爲了不這種狀況,省略密碼屬性,並從命令行指定它:

ant -Dpassword=secret deploy

任務輸出捕獲

使用Ant版本1.6.2或更高版本,Catalina任務提供了在屬性或外部文件中捕獲其輸出的選項。它們直接支持<redirector>類型屬性的如下子集 :

屬性 描述 須要
產量 要寫入輸出的文件的名稱。若是錯誤流不是也被重定向到文件或屬性,它將出如今這個輸出中。 沒有
錯誤 應將命令的標準錯誤重定向到的文件。 沒有
LOGERROR 當你但願在Ant的日誌中看到錯誤輸出,並將輸出重定向到文件/屬性時,使用該屬性。錯誤輸出將不會包含在輸出文件/屬性中。若是您使用錯誤errorProperty 屬性重定向錯誤,則這將不起做用。 沒有
附加 輸出文件和錯誤文件是否應附加到或覆蓋。默認爲false 沒有
createemptyfiles 輸出和錯誤文件是否應該在空時建立。默認爲true 沒有
outputproperty 應該存儲命令輸出的屬性的名稱。除非錯誤流被重定向到單獨的文件或流,不然此屬性將包含錯誤輸出。 沒有
errorproperty 應存儲命令的標準錯誤的屬性的名稱。 沒有

還能夠指定幾個附加屬性:

屬性 描述 須要
alwaysLog 當你但願看到你正在捕獲的輸出時,使用這個屬性,這個屬性也出如今Ant的日誌中。除非您捕獲任務輸出,不然不得使用它。默認爲false。 該屬性將<redirector> 在Ant 1.6.3中直接支持 沒有
failonerror 當您但願避免任何管理器命令處理錯誤終止螞蟻執行時使用此屬性。默認爲truefalse若是要捕獲錯誤輸出,則必須將其設置爲,不然在捕獲任何內容以前執行將終止。 
該屬性只對管理命令執行起做用,任何錯誤或缺乏的命令屬性仍將致使Ant執行終止。
沒有

它們還支持嵌入<redirector>在其中您能夠指定其完整的屬性集元素,可是inputinputstring而且 inputencoding,即便接受,不使用,由於他們在這方面沒有任何意義。有關元素屬性的詳細信息, 請參閱ant手冊<redirector>

這是一個示例構建文件提取,它顯示瞭如何使用此輸出重定向支持:

<target name="manager.deploy"
        depends="context.status"
        if="context.notInstalled">
        <deploy url="${mgr.url}"
            username="${mgr.username}"
            password="${mgr.password}"
            path="${mgr.context.path}"
            config="${mgr.context.descriptor}"/>
    </target>

    <target name="manager.deploy.war"
        depends="context.status"
        if="context.deployable">
        <deploy url="${mgr.url}"
            username="${mgr.username}"
            password="${mgr.password}"
            update="${mgr.update}"
            path="${mgr.context.path}"
            war="${mgr.war.file}"/>
    </target>

    <target name="context.status">
        <property name="running" value="${mgr.context.path}:running"/>
        <property name="stopped" value="${mgr.context.path}:stopped"/>

        <list url="${mgr.url}"
            outputproperty="ctx.status"
            username="${mgr.username}"
            password="${mgr.password}">
        </list>

        <condition property="context.running">
            <contains string="${ctx.status}" substring="${running}"/>
        </condition>
        <condition property="context.stopped">
            <contains string="${ctx.status}" substring="${stopped}"/>
        </condition>
        <condition property="context.notInstalled">
            <and>
                <isfalse value="${context.running}"/>
                <isfalse value="${context.stopped}"/>
            </and>
        </condition>
        <condition property="context.deployable">
            <or>
                <istrue value="${context.notInstalled}"/>
                <and>
                    <istrue value="${context.running}"/>
                    <istrue value="${mgr.update}"/>
                </and>
                <and>
                    <istrue value="${context.stopped}"/>
                    <istrue value="${mgr.update}"/>
                </and>
            </or>
        </condition>
        <condition property="context.undeployable">
            <or>
                <istrue value="${context.running}"/>
                <istrue value="${context.stopped}"/>
            </or>
        </condition>
    </target>

警告:即便它沒有多少意義,而且老是一個壞主意,不止一次調用Catalina任務,嚴重地設置Ant任務依賴鏈可能致使在同一Ant運行中屢次調用一個任務,甚至若是沒有打算。當您捕獲該任務的輸出時應該謹慎行事,由於這可能會致使意想不到的結果:

  • 當在一個屬性中捕獲時,你會發現它只有第一次調用的輸出,由於Ant屬性是不可變的,一旦設置它們就不能改變,
  • 當在一個文件中捕獲時,每次運行都會覆蓋它,除非使用該屬性,不然只會查找最後一次調用輸出append="true",在這種狀況下,您會看到每一個任務調用的輸出附加到文件中。

註釋

注意:本評論部分收集您關於改進Apache Tomcat文檔的建議。

若是您遇到問題並須要幫助,請閱讀 查找幫助頁面,並在tomcat-users 郵件列表上提出您的問題 。這裏不要問這樣的問題。這不是問答部分。

Apache評論系統在這裏解釋。評論可能會被咱們的版主刪除,若是它們被執行或被認爲是無效的/脫離主題。

目前,此頁面的評論功能已被禁用。

相關文章
相關標籤/搜索