1、Introduction

在许多生产环境中,具有部署新Web应用程序或取消部署现有Web应用程序的功能非常有用,而且无需关闭并重新启动整个容器。此外,即使您尚未在Tomcat服务器配置文件中声明应用为reloadable,也可以让现有应用程序重新加载。

为了支持这些功能,Tomcat包括一个Web应用程序(默认安装在上下文路径上)/manager)支持以下功能:

  • 通过上传的WAR文件来部署新的Web应用程序。
  • 在指定的上下文路径上部署新的Web应用程序。
  • 列出当前部署的Web应用程序,以及这些Web应用程序当前处于活动状态的会话。
  • 重新加载现有的Web应用程序,以反映/WEB-INF/classes 或 /WEB-INF/lib目录内容的变化.
  • 列出OS和JVM属性值。
  • 列出可用的全局JNDI资源,这些资源可以在<Context>元素节点下的<ResourceLink>节点中使用。
  • 启动已停止的应用程序(从而使其再次可用)。
  • 停止现有应用程序(以使其变得不可用),但不要取消部署它。
  • 取消部署已部署的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。

有三种方法可以使用Manager应用程序.

  • 作为具有用户界面的应用程序,您可以在浏览器中使用。这是一个示例:http://localhost:8080/manager/html .你可以把localhost替换成你的网站的URL
  • 仅使用HTTP请求的最小版本,适用于系统管理员设置的脚本。命令作为请求URI的一部分给出,响应采用简单文本的形式,可以很容易地进行解析和处理。
  • 一组方便的任务定义Ant(1.4或更高版本)构建工具。

2、配置Manager Application Access

下面的描述使用变量名$ CATALINA_BASE来引用解析大多数相对路径的基目录。如果尚未通过设置CATALINA_BASE目录为多个实例配置Tomcat,则$ CATALINA_BASE将设置为$ CATALINA_HOME的值,即已安装Tomcat的目录。

使用默认设置的Tomcat是非常不安全的,这些设置允许Internet上的任何人在您的服务器上执行Manager应用程序。因此,Manager应用程序需要有manager角色的用户使用用户名和密码进行权限验证。此外,默认用户文件中没有用户名($CATALINA_BASE/conf/tomcat-users.xml)分配给这些角色。因此,默认情况下完全禁用对Manager应用程序的访问。

您可以在Manager Web应用程序的web.xml文件中找到角色名称。可用的角色是:

  • manager-gui- 访问HTML界面。
  • manager-status- 仅访问“服务器状态”页面。
  • manager-script- 访问本文档中描述的工具友好的纯文本界面,以及“服务器状态”页面。
  • manager-jmx- 访问JMX代理接口和“服务器状态”页面。

HTML接口受到CSRF(跨站点请求伪造)攻击的保护,但文本和JMX接口无法受到保护。这意味着当使用Web浏览器访问Manager应用程序时,允许访问文本和JMX界面的用户必须小心谨慎。为了保持CSRF保护:

  • 如果使用Web浏览器使用具有manager-scriptmanager-jmx角色其中任何一个的用户访问Manager应用程序(例如用于测试纯文本或JMX接口),之后必须关闭浏览器的所有窗口以终止会话。如果您不关闭浏览器并访问其他站点,您可能会成为CSRF攻击的受害者。
  • 建议永远不要授予manager-scriptmanager-jmx角色给拥有manager-gui角色的用户.

注意,JMX代理接口实际上是Tomcat的低级根类管理接口。如果有人知道JMX的命令,那么他可以做很多事情。启用时应该谨慎配置manager-jmx 角色.

要启用对Manager Web应用程序的访问,您必须创建新的用户并关联一个manager-xxx角色,或添加一个manager-xxx角色给某些现有的用户。由于本文档的大部分内容都描述了使用文本界面,因此本示例将使用角色名称manager-script。具体如何配置用户取决于哪个你使用哪种(Realm)实现方式:

  • UserDatabaseRealm plus MemoryUserDatabase, or MemoryRealm — 该配置是tomcat的默认配置,在$CATALINA_BASE/conf/server.xml里配置. 该配置默认情况下读取$CATALINA_BASE/conf/tomcat-users.xml,该文件可以使用任何文本编辑器进行编辑。该文件包含XML节点<user>可以看成一个单独的用户,可能看起来像这样: <user username="craigmcc" password="secret" roles="standard,manager-script" />  它定义了此人用于登录的用户名和密码,以及与其关联的角色名称。你可以在roles属性添加manager-script角色(以逗号分隔)来为用户添加更多角色。
  • DataSourceRealm or JDBCRealm- 您的用户和角色信息存储在通过JDBC访问的数据库中。添加manager-script根据环境的标准过程,为一个或多个现有用户创建角色,和/或创建一个或多个已分配此角色的新用户。
  • JNDIRealm- 您的用户和角色信息存储在通过LDAP访问的目录服务器中。添加manager-script根据环境的标准过程,为一个或多个现有用户创建角色,和/或创建一个或多个已分配此角色的新用户。

第一次尝试操作Manager时,您将使用BASIC身份验证登录。您输入的用户名和密码无关紧要,只要该用户有manager-script这个角色就可以.

除了密码限制之外,还可以限制对Manager Web应用程序的访问IP地址或者通过添加一个主机RemoteAddrValve 或者 RemoteHostValve。以下是通过IP地址限制对localhost的访问的示例:

<Context privileged="true">

        <Valve className="org.apache.catalina.valves.RemoteAddrValve"

               allow="127\.0\.0\.1"/>

</Context>

3、HTML用户友好界面

Manager Web应用程序的用户友好HTML界面位于

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

正如上面已经提到的,你需要拥有manager-gui角色。有一个单独的文档,提供有关此接口的帮助。看到:

HTML接口受到CSRF(跨站点请求伪造)攻击的保护。每次访问HTML页面都会生成一个随机令牌,该令牌存储在您的会话中,并包含在页面上的所有链接中。如果您的下一个操作没有正确的令牌值,则该操作将被拒绝。如果令牌已过期,您可以从主页面重新开始。

4、支持的Manager命令

Manager应用程序可以使用的所有命令都在单个请求URI中指定,如下所示:

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

{host} 和 {port}表示运行Tomcat的主机名和端口号,{command}表示您要执行的Manager命令,以及{parameters}表示特定于该命令的查询参数。在下面的插图中,根据您的安装自定义主机和端口。

这些命令通常由HTTP GET请求执行。/deploy命令可以使用HTTP PUT执行。

4.1、Common Parameters

大多数命令接受以下一个或多个查询参数:

  • path- 您正在处理的Web应用程序的上下文路径(包括前导斜杠)。要选择ROOT Web应用程序,请指定“/”。 NOTE:无法在Manager应用程序本身上执行管理命令。 NOTE:如果未明确指定path参数,则将使用Context naming 的config参数的规则,或者,如果config参数不存在,则为war的参数。
  • version- 此Web应用程序的版本。如果在需要路径的任何地方使用并行部署,则必须指定除路径之外的版本,并且路径和版本的组合必须是唯一的,而不仅仅是路径。 NOTE:如果未明确指定路径,则忽略version参数。
  • war- Web应用程序归档(WAR)文件的URL,或包含Web应用程序的目录的路径名,或上下文配置“.xml”文件。您可以使用以下任何格式的网址:
  • file:/absolute/path/to/a/directory.
  • file:/absolute/path/to/a/webapp.war
  • file:/absolute/path/to/a/context.xml
  • directory
  • webapp.war

每个命令都会返回一个响应text/plain格式(即没有HTML标记的纯ASCII),使人和程序都能轻松阅读。响应的第一行将从OK / FAIL开始,指示请求的命令是否成功。如果失败,第一行的其余部分将包含遇到的问题的描述。一些命令包括如下所述的附加信息行。

国际化说明- Manager应用程序在资源包中查找其消息字符串,因此可能已为您的平台翻译了字符串。以下示例显示了消息的英文版本。

4.2、远程部署新的应用程序存档(WAR)

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

使用HTTP PUT请求通过上面的URL进行部署war文件,这个请求会将war包安装到appBase对应的虚拟主机的目录,并启动。稍后可以通过/undeploy命令使该应用程序取消部署(并删除相应的WAR文件)。

该命令由HTTP PUT请求执行。

.WAR文件可以包括Tomcat特定的部署配置,方法是在/META-INF/context.xml文件中配置Context节点.

URL参数包括:

  • update:设置为true时,将首先取消部署任何现有更新。默认值设置为false。
  • tag:指定标记名称,这允许将部署的webapp与标记或标签相关联。如果取消部署Web应用程序,则可以在需要时仅使用标记重新部署它。
  • config :格式的上下文配置“.xml”文件的URLfile:/absolute/path/to/a/context.xml。这必须是Web应用程序上下文配置“.xml”文件的绝对路径,该文件包含Context配置元素。

NOTE- 这个命令与/undeploy命令逻辑相反 .

如果安装和启动成功,您将收到如下响应:

OK - Deployed application at context path /foo

否则,响应将以FAIL开始并包含一条错误消息。可能的问题原因包括:

  • 应用程序已经存在于path / foo中 所有当前运行的Web应用程序的上下文路径必须是唯一的。因此,您必须使用此上下文路径取消部署现有Web应用程序,或为新应用程序选择其他上下文路径。将update参数设置值为true可以避免这个错误。在这种情况下,将在执行部署之前对现有应用程序执行取消部署。
  • 遇到异常 尝试启动新的Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。

5、从本地路径部署新应用程序

部署并启动新Web应用程序到指定path(任何其他Web应用程序不得使用它)。这个命令与/undeploy命令逻辑相反.

此命令由HTTP GET请求执行。可以使用许多不同的方法来使用deploy命令。

5.1、部署以前部署的Web应用程序

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

这可以用于部署先前部署的Web应用程序,该应用程序已使用tag属性。请注意,Manager webapp的工作目录将包含以前部署的WAR;删除它会使部署失败。

5.2、按URL部署目录或WAR

部署位于Tomcat服务器上的Web应用程序目录或“.war”文件。如果不指定path,则路径和版本派生自目录名称或war文件名。该war参数指定一个URL(包括file:scheme)用于目录或Web应用程序归档(WAR)文件。

在此示例中,Web应用程序位于/path/to/foo目录中,在Tomcat服务器上部署为名为/footoo的Web应用程序.

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

在此示例中/path/to/bar.war文件在Tomcat服务器上部署为名为/bar的Web应用程序。请注意,没有path参数,因此上下文路径默认用bar.war解压后的名称。

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

5.3、从主机appBase部署目录或war

部署位于Host appBase目录中的Web应用程序目录或“.war”文件。路径和可选版本派生自目录或war文件名。

在此示例中,Web应用程序位于名为foo的子目录中,在Tomcat服务器的Host appBase目录中部署为名为foo的Web应用程序。请注意,使用的上下文路径是Web应用程序目录的名称。

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

在此示例中bar.war位于Tomcat服务器上的Host appBase目录中,将其部署为名为/bar的Web应用程序上下文.

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

5.4、使用Context配置“.xml”文件进行部署

如果Host的 deploy标志设置为true,则可以使用Context配置“.xml”文件和可选的“.war”文件或Web应用程序目录来部署Web应用程序。上下文path使用上下文“.xml”配置文件部署Web应用程序时不使用。

Context配置“.xml”文件可以包含Web应用程序的有效XML,就像它在Tomcat中配置一样server.xml配置文件。这是一个例子:

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

</Context>

When the optional 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

5.5、Deployment Notes

如果主机配置了unpackWARs = true并且您部署了war文件,则war将被解压缩到Host appBase目录中的目录中。

如果应用程序war或目录安装在Host appBase目录中,并且Host配置了autoDeploy = true,或者Context路径必须与没有“.war”扩展名的目录名或war文件名匹配。

为了在不受信任的用户可以管理Web应用程序时的安全性,可以将Host deployXML标志设置为false。这可以防止不受信任的用户使用配置XML文件部署Web应用程序,还可以防止他们部署位于其主机appBase之外的应用程序目录或“.war”文件。

5.6、Deploy Response

如果安装和启动成功,您将收到如下响应:

OK - Deployed application at context path /foo

否则,响应将从FAIL开始并包含一条错误消息。可能的问题原因包括:

  • 应用程序已经存在于path / foo中 所有当前运行的Web应用程序的上下文路径必须是唯一的。因此,您必须使用此上下文路径取消部署现有Web应用程序,或为新应用程序选择其他上下文路径。设置update值为true避免这个错误。在这种情况下,将在执行部署之前对现有应用程序执行取消部署。
  • 文档库不存在或不是可读目录。
  • 遇到异常 尝试启动新的Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。
  • 指定了无效的应用程序URL。 您指定的目录或Web应用程序的URL无效。此类网址必须以file:,WAR文件的URL必须以“.war”结尾。
  • 指定了无效的上下文路径 上下文路径必须以斜杠字符开头。要引用ROOT Web应用程序,请使用“/”。
  • 上下文路径必须与目录或WAR文件名匹配: 如果应用程序war或目录安装在Host appBase目录中,并且Host配置了autoDeploy = true,则Context路径必须与没有“.war”扩展名的目录名或war文件名匹配。
  • 只能安装Host Web应用程序目录中的Web应用程序 如果Host deployXML标志设置为false,则尝试在Host appBase目录之外部署Web应用程序目录或“.war”文件时,将发生此错误。

5.7、列出当前部署的应用程序

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

列出上下文路径,当前状态(running or stopped),以及所有当前部署的Web应用程序的活动会话数。启动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

5.8、重新加载现有应用程序

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

发信号通知现有应用程序关闭并重新加载。当Web应用程序上下文不可重新加载并且您已更新了/WEB-INF/classes目录中的类或属性文件时,或在/WEB-INF/lib文件夹添加或更新jar文件时 ,这个功能很有用.

如果此命令成功,您将看到如下响应:

OK - Reloaded application at context path /examples

否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括:

  • 遇到异常 尝试重新启动Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。
  • 指定了无效的上下文路径 上下文路径必须以斜杠字符开头。要引用ROOT Web应用程序,请使用“/”。
  • path / foo没有上下文 您指定的上下文路径上没有已部署的应用程序。
  • 未指定上下文路径 The path参数是必需的。
  • 在路径/ foo上部署的WAR不支持重新加载 目前,应用程序重新加载(以获取类或更改web.xml直接从WAR文件部署Web应用程序时,不支持file)。它仅在从解压缩目录部署Web应用程序时才有效。如果您使用的是WAR文件,则应该undeploy and then deploy or deploy with the update再次参数应用程序来获取您的更改。

列出OS和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

or

OK - Listed global resources of type xxxxx

每个资源后跟一行。每行由冒号字符(“:”)分隔的字段组成,如下所示:

  • 全球资源名称- 此全局JNDI资源的名称,将在其中使用global attribute of a <ResourceLink> element.
  • 全球资源类型- 此全局JNDI资源的完全限定Java类名。

如果发生错误,响应将以响应开始FAIL并包含一条错误消息。可能的问题原因包括:

  • 遇到异常 尝试枚举全局JNDI资源时遇到异常。检查Tomcat日志以获取详细信息。
  • 没有可用的全局JNDI资源 您运行的Tomcat服务器已配置为没有全局JNDI资源。

Session Statistics

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

显示Web应用程序的默认会话超时,以及在实际超时时间的一分钟范围内的当前活动会话数。例如,重新启动Tomcat然后执行其中一个JSP示例/examples网络应用程序,你可能得到这样的东西:

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

Expire 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

Actually /sessions and /expire是同一命令的同义词。区别在于存在idle parameter.

启动现有应用程序

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

发出停止的应用程序信号以重新启动,并使其自身再次可用例如,如果应用程序所需的数据库暂时不可用,则停止和启动很有用。通常最好停止依赖此数据库的Web应用程序,而不是让用户不断遇到数据库异常。

如果此命令成功,您将看到如下响应:

OK - Started application at context path /examples

否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括:

  • 遇到异常 尝试启动Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。
  • 指定了无效的上下文路径 上下文路径必须以斜杠字符开头。要引用ROOT Web应用程序,请使用“/”。
  • path / foo没有上下文 您指定的上下文路径上没有已部署的应用程序。
  • 未指定上下文路径 The path参数是必需的。

停止现有的应用程序

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

发信号通知现有应用程序使其自身不可用,但将其部署。应用程序停止时进入的任何请求都将看到HTTP错误404,此应用程序将在列表应用程序命令中显示为“已停止”。

如果此命令成功,您将看到如下响应:

OK - Stopped application at context path /examples

否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括:

  • 遇到异常 尝试停止Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。
  • 指定了无效的上下文路径 上下文路径必须以斜杠字符开头。要引用ROOT Web应用程序,请使用“/”。
  • path / foo没有上下文 您指定的上下文路径上没有已部署的应用程序。
  • 未指定上下文路径 The path参数是必需的。

取消部署现有应用程序

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

WARNING- 此命令将删除其中存在的任何Web应用程序工件appBase此虚拟主机的目录(通常为“webapps”)。这将删除应用程序.WAR(如果存在),应用程序目录来自解压缩形式的部署或.WAR扩展以及来自的XML上下文定义$CATALINA_BASE/conf/[enginename]/[hostname]/目录。如果您只想让应用程序停止服务,您应该使用/stop command instead.

发信号通知现有应用程序正常关闭自身,并将其从Tomcat中删除(这也使得此上下文路径可供以后重用)。此外,如果文档根目录中存在,则将其删除appBase此虚拟主机的目录(通常为“webapps”)。这个命令与逻辑相反/deploy command.

如果此命令成功,您将看到如下响应:

OK - Undeployed application at context path /examples

否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括:

  • 遇到异常 尝试取消部署Web应用程序时遇到异常。检查Tomcat日志以获取详细信息。
  • 指定了无效的上下文路径 上下文路径必须以斜杠字符开头。要引用ROOT Web应用程序,请使用“/”。
  • 没有名为/ foo的上下文 没有已指定名称的已部署应用程序。
  • 未指定上下文路径 The 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 Connector / Ciphers诊断列出了当前为每个连接器配置的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

 ...

连接器SSL / TLS证书链信息

http://localhost:8080/manager/text/sslConnectorCerts

SSL Connector / Certs诊断列出了当前为每个虚拟主机配置的证书链。

响应将如下所示:

OK - Connector / Certificate Chain information

Connector[HTTP/1.1-8080]

SSL is not enabled for this connector

Connector[HTTP/1.1-8443]-_default_-RSA

[

[

 Version: V3

 Subject: CN=localhost, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US

 Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

 ...

连接器SSL / TLS可信证书信息

http://localhost:8080/manager/text/sslConnectorTrustedCerts

SSL Connector / Certs诊断列出了当前为每个虚拟主机配置的可信证书。

响应将如下所示:

OK - Connector / Trusted Certificate information

Connector[HTTP/1.1-8080]

SSL is not enabled for this connector

Connector[AJP/1.3-8009]

SSL is not enabled for this connector

Connector[HTTP/1.1-8443]-_default_

[

[

 Version: V3

 Subject: CN=Apache Tomcat Test CA, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US

 ...

重新加载TLS配置

http://localhost:8080/manager/text/sslReload?tlsHostName=name

重新加载TLS配置文件(证书和密钥文件,这不会触发重新解析server.xml)。要为所有主机重新加载文件,请不要指定tlsHostName parameter.

OK - Reloaded TLS configuration for [_default_]

Thread Dump

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 Info

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:

...

Save Configuration

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

如果指定不带任何参数,则此命令将服务器的当前配置保存到server.xml。如果需要,现有文件将重命名为备份。

如果指定了path与已部署的Web应用程序的路径匹配的参数,然后该Web应用程序的配置将保存到中的适当命名的context.xml文件中xmlBase对于当前的主持人。

要使用该命令,必须存在StoreConfig MBean。通常使用。配置StoreConfigLifecycleListener.

如果命令不成功,响应将以响应开始FAIL并包含一条错误消息。

Server Status

从以下链接中,您可以查看有关服务器的状态信息。任何一个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和请求的表。表中列出了所有现有线程。以下是可能的线程阶段列表:

If you are using /status/all命令,将提供有关每个已部署的Web应用程序的其他信息。

使用JMX代理Servlet

什么是JMX代理Servlet

JMX代理Servlet是一个轻量级代理,用于获取和设置tomcat内部。 (或者通过MBean公开的任何类)它的用法不是非常用户友好,但UI对于集成命令行脚本以监视和更改tomcat的内部非常有用。您可以使用代理执行两项操作:获取信息和设置信息。为了让您真正了解JMX代理Servlet,您应该对JMX有一个大致的了解。如果您不知道JMX是什么,那么请准备好混淆。

JMX Query command

采取以下形式:

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

Where 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 Get command

JXMProxyServlet还支持“get”命令,您可以使用该命令获取特定MBean属性的值。一般形式的get command is:

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 Set command

现在你可以查询一个MBean,它是时候去挖掘Tomcat的内部了! set命令的一般形式是:

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

所以你需要提供3个请求参数:

  1. set:完整的bean名称
  2. att:您要更改的属性
  3. val: The new value

如果一切正常,那么它会说OK,否则将显示错误消息。例如,假设我们希望立即启动调试ErrorReportValve。以下将调试设置为10。

http://localhost:8080/manager/jmxproxy/

?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost

&att=debug&val=10

我的结果是(YMMV):

Result: ok

如果我传入一个错误的值,这就是我所看到的。这是我使用的URL,我尝试设置调试等于&#39;cow&#39;:

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 command

The invokecommand允许在MBean上调用方法。该命令的一般形式是:

http://webserver/manager/jmxproxy/

?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS

例如,要打电话给findConnectors() method of the Service use:

http://localhost:8080/manager/jmxproxy/

?invoke=Catalina%3Atype%3DService&op=findConnectors&ps=

使用Ant执行Manager命令

除了通过HTTP请求执行Manager命令的能力之外,如上所述,Tomcat包含一组方便的任务定义Ant(1.4或更高版本)构建工具。要使用这些命令,必须执行以下设置操作:

  • 从中下载Ant的二进制分发版https://ant.apache.org。你必须使用版本1.4 or later.
  • 将Ant分发安装在方便的目录中(在这些说明的其余部分中称为ANT_HOME)。
  • Add the $ANT_HOME/bin directory to your PATH环境变量。
  • 在Tomcat用户数据库中至少配置一个用户名/密码组合,其中包含manager-script role.

要在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.xmlfile被定义为可替换属性,因此您可以从命令行覆盖它们的值。例如,您可能会认为将真实管理员密码包含在您的帐户中会带来安全风险build.xml文件的源代码。要避免这种情况,请省略password属性,并从命令行指定它:

ant -Dpassword=secret deploy

任务输出捕获

Using Ant version 1.6.2或者以后,Catalina任务提供了在属性或外部文件中捕获其输出的选项。它们直接支持以下子集<redirector> type attributes:

AttributeDescriptionRequiredoutput要写入输出的文件的名称。如果错误流也未重定向到文件或属性,则它将显示在此输出中。Noerror应重定向命令标准错误的文件。NologError当您希望在Ant的日志中看到错误输出并且您将输出重定向到文件/属性时,将使用此属性。错误输出将不包含在输出文件/属性中。如果你重定向错误error or errorProperty属性,这将没有任何效果。Noappend是否应附加或覆盖输出和错误文件。默认为false.Nocreateemptyfiles是否应该创建输出和错误文件,即使是空的。默认为true.Nooutputproperty应存储命令输出的属性的名称。除非将错误流重定向到单独的文件或流,否则此属性将包含错误输出。Noerrorproperty应存储命令标准错误的属性的名称。No

还可以指定一些其他属性:

AttributeDescriptionRequiredalwaysLog当您希望查看正在捕获的输出时,将使用此属性,该属性也显示在Ant的日志中。除非您正在捕获任务输出,否则不得使用它。默认为false. 此属性将直接受支持<redirector> in Ant 1.6.3Nofailonerror当您希望避免任何管理器命令处理错误终止ant执行时,将使用此属性。默认为true。它必须设置为false,如果要捕获错误输出,否则执行将在捕获任何内容之前终止。此属性仅作用于管理器命令执行,任何错误或缺少的命令属性仍将导致Ant执行终止。No

他们也支持嵌入式<redirector>您可以在其中指定其完整属性集的元素,但是input, inputstring and inputencoding即使被接受,也不会被使用,因为它们在这种情况下没有任何意义。参考ant manual for details on <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>

WARNING:即使它没有多大意义,并且总是一个坏主意,不止一次调用Catalina任务,严重设置Ant任务取决于链可能导致在同一个Ant运行中多次调用任务,即使不是打算。当您从该任务捕获输出时,应该谨慎行事,因为这可能会导致意外情况:

  • 当在一个属性中捕获时,你会在其中找到来自的输出first调用,因为Ant属性是不可变的,一旦设置它们就无法更改,
  • 在文件中捕获时,每次运行都会覆盖它,你只会在其中找到last呼叫输出,除非你使用append="true"属性,在这种情况下,您将看到附加到文件的每个任务调用的输出。