Tomat:通过JMX启动/停止/重新加载应用程序?如何通过程序管理应用程序的启动/停止/重启?

时间:2019-05-08 03:38:38

标签: tomcat jmx

背景
我的任务是通过start/stop/reload JMX部署在tomcat,jboss,weblogic或websphere中的应用程序。 (一个人可能知道所提到的Web应用程序服务器已经具有管理器页面来实现它,我们只想通过start/stop/reload将所有这四个主要Web服务器管理员的JMX功能集中到一个页面中。)

与tomcat有关的问题:
我有一个名为JMXWebExample1-0.1的示例应用程序。我可以通过在提示的登录页面中输入tomcat/tomcat(username/password)来访问管理器页面,然后单击应用程序名称旁边的停止按钮,即可看到以下链接。

http://localhost:8080/manager/html/stop;jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3?path=/JMXWebExample1-0.1&org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423

链接包含jsessionid=49CDCBA3DDB3081BA3D6C5BCD9E4C8A3CSRF token org.apache.catalina.filters.CSRF_NONCE=59E98C1BA757DD3E7D9FDEA4504D3423

因此,当我调用http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1时,它总是为我提供403状态代码(访问被拒绝)。 问题是我如何停止类似于tomcat管理器页面的应用程序JMXWebExample1-0.1

启动tomcat之前的一些步骤
在tomcat启动之前,我需要执行以下步骤:
1)通过添加%CATALINA_OPTS%,

来启用JMX
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

2)tomcat-users.xml:我进行了以下配置:

<role rolename="manager-gui"/>
  <user username="tomcat" password="tomcat" roles="manager-gui"/>

3)E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml下的context.xml,我在下面的行中注释:

<Context antiResourceLocking="false" privileged="true" >

 <!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  -->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>


更新
E:\apache-tomcat-9.0.12\conf\tomcat-users.xml,登录时我使用tomcat

<role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="admin-script" />
  <role rolename="manager-gui"/>
  <role rolename="manager-status"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-jmx" />
  <user username="tomcat" password="tomcat" roles="manager-gui,manager-jmx"/>
  <user username="both" password="both" roles="tomcat,role1"/>
  <user username="role1" password="role1" roles="role1"/>
  <user username="all" password="all" roles="tomcat,role1,manager-script,manager-jmx" />

E:\apache-tomcat-9.0.12\webapps\manager\META-INF\context.xml中:

<Context antiResourceLocking="false" privileged="true" >

 <!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  -->
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow=".*" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>


调用命令:http://localhost:8080/manager/html/stop?path=/JMXWebExample1-0.1

1 个答案:

答案 0 :(得分:0)

首先,tomcat提供必须以不同方式访问的HTMLJMX接口。
您正在尝试使用html,因此您应该向

发送POST请求
  

http://localhost:8080/manager/html/stop?path=/sample&org.apache.catalina.filters.CSRF_NONCE=A2D857324A2C4F5F3EAE0DE2934502BA

/ manager页面使用org.apache.catalina.filters.CSRF_NONCE参数来防止CSRF。如果已删除,则会收到错误403和说明:

  

HTML界面受CSRF保护,但文本和JMX接口不受保护。要维持CSRF保护,请执行以下操作:

     

不应该授予具有manager-gui角色的用户manager-scriptmanager-jmx角色。

因此,如果要停止应用程序,请发送带有有效CSRF令牌的POST请求。

通过JMX停止应用
首先,您禁用了-Dcom.sun.management.jmxremote.authenticate=false的身份验证,您可能想要更改它。通过连接到jconsole地址的远程应用程序,<ip address>:9000可用于通过JMX控制tomcat。
然后,要停止使用Catalina -> WebModule MBean的应用程序,您将看到一些可用的操作,找到stop()并使用它:

enter image description here

最后,如the docs所示,我认为您应该更改验证模式或完全删除allow属性。注释掉阀门可能会禁用该功能。

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow=".*"/>

另外,the role for JMX accessmanager-jmx

请注意此处的安全性!