正确配置zabbix jmx监控和防火墙规则
当我们在配置 zabbix 监控 apache-tomcat 运行状态的时候,发现按照官方文档提供的方式配置会遇到一些问题,这些问题与当前系统的环境有直接关联,如果你也会使用 zabbix 来监控 tomcat 的话,不妨看看下面描述的配置步骤中的若干步骤,以免踩上同样的坑。
基本知识
Java 通过 JMX(Java Management Extensions)来实现对 Java 应用的拓展管理和基本监控,而 zabbix 自2.0版本开始即提供了原生的 JMX 监控接口支持, 并内置了若干监控模板。监控 Java 应用需要监控端(zabbix)安装 zabbix-java-gateway 提供监控代理接口,被监控端(Tomcat)配置 JMX 拓展以支持监控。
遇到的坑
按照官方文档的描述,首先配置 Tomcat 增加 JMX 拓展。注意,很多文档在描述如何修改 Tomcat 环境变量的时候往往是直接修改 startup.sh 或者 catalina.sh 这两个脚本文件,这里我们不推荐这种方式,比较恰当的方式是在 setenv.sh 中增加额外的自定义环境变量设置,
在 bin/setenv.sh 中增加
被监控端的配置计算完成,如果该系统中未开启防火墙规则或者防火墙默认开放了所有端口,则按照此设置已经能够在监控端正确获取到监控数据,但是如果开启了防火墙且默认阻断了未经许可开放的端口,则需要增加额外的防火墙规则来开启监控端口的访问权限:
iptables -I INPUT -p tcp --dport 12345 -j ACCEPT
这个时候我们往往会认为一切 OK ,但是事情并非如此,下面我们下载一个调试工具来调试一下远程获取监控数据是否通畅
wget http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar
执行以下命令以检查是否可以获取到监控数据(10.0.0.2为 Tomcat 所在系统 IP)
java -jar cmdline-jmxclient-0.10.3.jar - 10.0.0.2:12345 java.lang:type=Memory HeapMemoryUsage
如果你的防火墙规则默认拒绝了未授权端口且使用了 REJECT,那么你有可能看到的错误会是如下
奇怪为什么我们已经添加了端口12345的允许规则,但是为什么还提示“No route to host”呢? 这是因为 JMX 不光开启了 12345 端口,还开启了另外两个端口,而在获取监控数据时会使用到其中一个,但不幸的是这两个端口是随机监听的,这就导致我们暂时没法通过固定的防火墙规则来开放该端口。这个时候我们需要使用另外一个替代方式来使该监听端口固定下来——使用 Tomcat 提供的额外组件 catalina-jmx-remote.jar
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.54/bin/extras/catalina-jmx-remote.jar -O lib/catalina-jmx-remote.jar
在 conf/server.xml 中增加
注意,此处的 rmiRegistryPortPlatform 取代了 com.sun.management.jmxremote.port 环境变量,此时应该将 bin/setenv.sh 中对应的端口配置项去掉,如果不去掉该环境变量会导致该环境变量以更高的优先级产生作用使得此处的配置无效,即便是使用了catalina-jmx-remote.jar 也会额外监听两个随机端口。
此时修改 bin/setenv.sh 为
重新启动 Tomcat ,修改防火墙规则为如下
参考链接:
https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/jmx_monitoring
http://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener