在许多生产环境中,具有部署新Web应用程序或取消部署现有Web应用程序的功能非常有用,而无需关闭并重新启动整个容器。另外,即使您尚未声明它reloadable
在Tomcat服务器配置文件中,也可以请求现有应用程序重新加载自身。
为了支持这些功能,Tomcat包含一个Web应用程序(默认情况下安装在上下文路径中/manager
),该应用程序支持以下功能:
- 从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]
夹中安装 上下文配置文件 。这里是一个例子:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1" />
</Context>
如果您将Tomcat配置为支持多个虚拟主机(网站),则需要为每个虚拟主机配置一个管理器。
有三种方法可以使用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的目录)的值。
使用允许互联网上的任何人执行服务器上的Manager应用程序的默认设置来运送Tomcat是相当不安全的。因此,Manager应用程序随附的要求是,任何尝试使用它的用户都必须使用具有与其关联的manager-xxx角色之一(角色名称取决于所需功能)的用户名和密码进行身份验证。此外,$CATALINA_BASE/conf/tomcat-users.xml
分配给这些角色的默认用户文件()中没有用户名。因此,默认情况下完全禁用对Manager应用程序的访问。
您可以web.xml
在Manager Web应用程序的文件中找到角色名称。可用的角色是:
- 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-script或manager-jmx 角色授予具有manager-gui角色的用户。
请注意,JMX代理接口实际上是Tomcat的低级别根类管理接口。如果他知道要调用哪些命令,可以做很多事情。启用manager-jmx角色时应谨慎 。
要允许访问Manager Web应用程序,您必须创建一个新的用户名/密码组合,并将其中一个manager-xxx角色与其关联 ,或者将manager-xxx角色添加 到某个现有用户名/密码组合。由于本文档的大部分描述了使用文本界面,本示例将使用角色名称管理器脚本。具体如何配置用户名/密码取决于 您使用的Realm实施方式:
- UserDatabaseRealm加上MemoryUserDatabase或MemoryRealm - UserDatabaseRealm和MemoryUserDatabase配置为默认值
$CATALINA_BASE/conf/server.xml
。MemoryUserDatabase和MemoryRealm都默认读取一个XML格式的文件$CATALINA_BASE/conf/tomcat-users.xml
,这个文件可以用任何文本编辑器编辑。该文件包含<user>
每个用户的XML ,可能如下所示:
它定义了这个人用来登录的用户名和密码,以及他或她所关联的角色名称。您可以将manager-script角色添加到<user username="craigmcc" password="secret" roles="standard,manager-script" />
roles
一个或多个现有用户的逗号分隔 属性,和/或使用该指定角色创建新用户。 - DataSourceRealm或JDBCRealm - 您的用户和角色信息存储在通过JDBC访问的数据库中。将管理员脚本角色添加到一个或多个现有用户,和/或按照您的环境的标准程序创建一个或多个分配了此角色的新用户。
- JNDIRealm - 您的用户和角色信息存储在通过LDAP访问的目录服务器中。将管理员脚本角色添加 到一个或多个现有用户,和/或按照您的环境的标准程序创建一个或多个分配了此角色的新用户。
当您第一次尝试发布下一节中介绍的管理员命令之一时,您将面临使用BASIC认证登录的挑战。您输入的用户名和密码无关紧要,只要它们标识拥有角色管理器脚本的用户数据库中的有效用户即可。
除了密码限制之外,还可以通过添加或来限制远程IP地址或主机对Manager Web应用程序的访问权限。详情请参阅阀门文档 。以下是通过IP地址限制对本地主机的访问的示例:RemoteAddrValve
RemoteHostValve
<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/foo
Tomcat服务器目录 中的Web应用程序部署为名为的Web应用程序上下文/footoo
。
http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo
在本例中,/path/to/bar.war
Tomcat服务器上的“.war”文件被部署为名为的Web应用程序上下文 /bar
。请注意,没有path
参数,因此上下文路径默认为不带“.war”扩展名的Web应用程序归档文件的名称。
http://localhost:8080/manager/text/deploy?war=file:/path/to/bar.war
从主机应用程序库部署目录或战争
部署位于您的Host appBase目录中的Web应用程序目录或“.war”文件。路径和可选版本源自目录或war文件名。
在此示例中,位于 foo
Tomcat服务器的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,然后在/examples
Web应用程序中执行一个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
您必须提供以下参数:
get
:完整的bean名称att
:您想要获取的属性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个请求参数:
set
:完整的bean名称att
:你想改变的属性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 | 当您希望避免任何管理器命令处理错误终止蚂蚁执行时使用此属性。默认为true 。false 如果要捕获错误输出,则必须将其设置为,否则在捕获任何内容之前执行将终止。 该属性只对管理命令执行起作用,任何错误或缺少的命令属性仍将导致Ant执行终止。 | 没有 |
它们还支持嵌入<redirector>
在其中您可以指定其完整的属性集元素,但是input
,inputstring
并且 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评论系统在这里解释。评论可能会被我们的版主删除,如果它们被执行或被认为是无效的/脱离主题。
目前,此页面的评论功能已被禁用。