【问题标题】:Tomat: start/stop/reload application by JMX? How to manage application's start/stop/restart by program?Tomcat:通过 JMX 启动/停止/重新加载应用程序?如何按程序管理应用程序的启动/停止/重启?
【发布时间】:2019-05-08 03:38:38
【问题描述】:

背景:
我的任务是通过JMX 部署在tomcat、jboss、weblogic 或websphere 中的start/stop/reload 应用程序。 (大家可能知道上面提到的Web应用服务器已经有管理页面来实现它,我们只是想将这四大Web服务器管理员的start/stop/reload功能通过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

【问题讨论】:

    标签: tomcat jmx


    【解决方案1】:

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

    发送 POST 请求

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

    使用 org.apache.catalina.filters.CSRF_NONCE 参数保护 /manager 页面免受 CSRF 攻击。如果删除,则会收到错误 403 以及解释:

    HTML 界面受到 CSRF 保护,但文本和 JMX 界面没有。维护 CSRF 保护:

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

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

    通过 JMX 停止应用
    首先,您使用-Dcom.sun.management.jmxremote.authenticate=false 禁用了身份验证,您可能想要更改它。 jconsole 可用于通过 JMX 控制 tomcat,方法是连接到位于 &lt;ip address&gt;:9000 地址的远程应用程序。
    然后,要停止应用程序使用Catalina -&gt; WebModule MBean,你会看到几个可用的操作,找到stop() 并使用它:

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

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

    另外,the role for JMX accessmanager-jmx

    注意这里的安全问题!

    【讨论】:

    • 解决方法不行,我还是403 Access Denied。
    • 使用您的实际配置在您的问题中添加一个 UPDATE 部分。
    • 嗨,Luis,请参阅原始问题的更新部分。这是我目前的tomcat配置。
    • @user84592 您是否尝试使用有效的 CRSF 令牌发送 POST?
    最近更新 更多