1 Overview
由于项目需要, 笔者开发了一个基于JMX的监控程序。这个监控程序本身也提供了JMX远程服务,并且在开发过程中一直使用jconsole来管理这个监控程序。本打算在将监控程序部署到生产环境后,通过设置NAT(目前还不能通过VPN接入到生产环境)以便仍然可以通过jconsole来管理这个监控程序。但是发现为RMI使用的端口设置好NAT之后,jconsole仍然无法连接到监控程序。经过调查,发现RMI实际上使用了两个端口,一个是可以在程序中指定的(用于客户端下载stub,默认是1099);另外一个是随机选择的(用于方法调用)。虽然可以通过指定一个RMISocketFactory来配置那个本是随机选择的端口,但是被监控程序监控的那个程序无法修改,因此作罢。最终采用了在监控服务器上部署jManage的方案,替代jconsole通过NAT接入到生产环境的方案。
jManage(http://www.jmanage.org/)是个基于WEB和命令行的开源JMX客户端程序,提供了一个集中式的控制台来监控和管理应用程序。此外jManage还提供了报警、图表、安全等特性。目前的最新版本是2.0 RC。
2 Instanllation
如果使用jManage 2.0,那么需要使用1.5以上版本的JDK(jManage 1.x 需要使用1.4以上版本的JDK)。
首先将jmanage-XXX.jar解压到安装目录,并为所有脚本加上可执行的属性,例如 chmod +x *.sh。 然后进入到bin目录中,执行keygen来修改admin用户的密码,这个密码也是启动jManage的密码(默认是123456)。默认情况下,jManage使用9090端口,也可以通过修改jetty-config.xml文件来指定其它端口。 接下来执行bin目录中的startup,然后就可以通过访问http://localhost:9090来进行确认是否成功启动。
3 Configuration
3.1 Connecting to applications
在使用jManage管理和监控应用程序之前,首先需要在jManage中添加应用程序的信息。
1 在jManage的主页面中点击"Add Application"。
2 选择应用程序的类型,对于普通的Java程序来说,应该选择"JSR160 Application"。jManage同样也支持MX4J。
3 指定应用程序名和连接参数,例如:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi。
4 添加了应用程序后,点击应用程序名,然后再点击"Find More Objects"来浏览所有的MBeans。
3.2 Cluster Configuration
1 在jManage的主页面中点击"Add Application Cluster"。
2 指定集群名称,并选择需要添加到集群的应用程序名,点击"Save"。
4 Security
jManage采用的对称加密算法对admin用户的密码进行了加密。加密后的密码保存在config目录的jmanage-key文件中。在用户登录过程中,jManage在3次(在jmanage.properties中配置)失败的尝试后锁定该用户。所有的用户信息保存在config/jmanage-users.xml文件中,用户的密码经过散列处理(默认采用SHA-1散列算法,在jmanage.properties中配置,也可以使用SHA-256)。
一个用户可以被赋予一个或者多个角色。角色在jmanage-user-roles.xml.文件中定义,jManage预定义了两个角色:Administrator和User。Administrator角色具有完全的访问权限;User具有只读权限。acl-config.properties文件中定义了ACEs (Access Control Entities),可以在用户级别和角色级别上进行授权。
默认情况下,jManage只使用http连接,可以通过解除JMANAGE_HOME/config/jetty-config.xml文件中HTTPS listener的注释来启用SSL,例如:
<!--- HTTPS listener -->
<Call name="addListener">
<Arg>
<New class="org.mortbay.http.SunJsseListener">
<Set name="Port">
<SystemProperty name="jetty.port" default="9091"/>
</Set>
<Set name="MinThreads">5</Set>
<Set name="MaxThreads">255</Set>
<Set name="MaxIdleTimeMs">30000</Set>
<Set name="LowResourcePersistTimeMs">5000</Set>
<Set name="Keystore"><SystemProperty name="jmanage.root"/>/config/keystore</Set>
<Set name="Password">password</Set>
<Set name="KeyPassword">password</Set>
</New>
</Arg>
</Call>
需要注意的是,JMANAGE_HOME/config/jmanage.properties中的"jmanage.url"也要更新。
5 FAQ
Q: 怎样解除对admin账户的锁定?
A: 编辑 JMANAGE_HOME/config/jmanage-users.xml, 设置 status="A" and lockCount="0".
Q: 怎样在启动jManage时无需键入密码?
A1: > startup.sh 123456
如果不考虑安全因素,那么可以使用此方法。
A2: > nohup ./startup.sh < password 2>&1 > ../logs/startup.log &
其中password是保存了密码的文件(应该确保只有经过授权的人才能查看文件的内容)。
Q: 为什么jManage在发送报警邮件时出错?
A: 如果错误内容如下:
SEVERE: Error sending alert email. Error: Could not connect to SMTP host: localhost, port: 25;
那么需要修改jmanage.properties文件,指定SMTP服务器的地址,例如:
email.host=localhost
Q: 怎样定制警报发送方式?
A: 目前jManage支持email和控制台警报两种方式,然而可以通过扩展alert framework来定制报警方式:
1. 编写一个实现org.jmanage.core.alert.AlertDelivery接口的类。
2. 将这个类注册到JMANAGE_HOME\config\system\alert-config.xml
3. 编辑 addAlert.jsp,在下拉列表中添加一个新类型。需要注意的是,这个类型字符串要和 alert-config.xml中的类型字符串一致。在未来版本中,jManage会读取 alert-config.xml文件的内容而无需再编辑addAlert.jsp。