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-script 或 manager-jmx角色其中任何一个的用户访问Manager应用程序(例如用于测试纯文本或JMX接口),之后必须关闭浏览器的所有窗口以终止会话。如果您不关闭浏览器并访问其他站点,您可能会成为CSRF攻击的受害者。
- 建议永远不要授予manager-script 或 manager-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 Manager documentation
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
您必须提供以下参数:
- 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 Set command
现在你可以查询一个MBean,它是时候去挖掘Tomcat的内部了! set命令的一般形式是:
http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE
所以你需要提供3个请求参数:
- set:完整的bean名称
- att:您要更改的属性
- 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,我尝试设置调试等于’cow’:
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”属性,在这种情况下,您将看到附加到文件的每个任务调用的输出。