zoukankan      html  css  js  c++  java
  • abbix通过JMX监控Tomcat(被监控端安装Tomat的服务器防火墙策略iptables配置)

    原文地址:http://jaychang.iteye.com/blog/2214830

    一、目前的环境

    被监控端192.168.153.191

    /usr/local/tomcat

    下载了catalina-jmx-remote.jar放到了tomcat安装目录的lib目录下,现在为止这个jar包没有派上用场。

    /usr/local/jdk1.7.0_79

    tomcat的bin目录添加了一个setenv.sh脚本(可以写成一行,这个百度下能找到)

    CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=192.168.153.191"  
    CATALINA_OPTS="${CATALINA_OPTS} -Djavax.management.builder.initial="  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"

    按照平常的思维: 按理说只要在iptables里开放一个12345端口就可以了

    Zabbix_Server及Zabbix_Java_Gateway端192.168.153.181

    安装目录就不说明了,一般可以在/usr/local/zabbix_server,/usr/local/zabbix_java_gateway

    主要是想说明两个配置文件

    zabbix_server.conf

    ListenPort=10051  
    LogFile=/tmp/zabbix_server.log  
    DBName=zabbix  
    DBUser=zabbix  
    DBPassword=zabbix  
    DBPort=3306  
    JavaGateway=127.0.0.1  
    JavaGatewayPort=10052  
    StartJavaPollers=5 

     zabbix_java_gateway的配置文件(zabbix_java_gateway安装目录/zabbix_java/sbin/setting.sh)

    LISTEN_IP="0.0.0.0"  
    LISTEN_PORT=10052  
    PID_FILE="/tmp/zabbix_java.pid"  
    START_POLLERS=5 

    说明

    1)Zabbix_Server与Zabbix_Java_Gateway在一台机器上IP地址为192.168.153.181

    被监控的机器上,装了tomcat ,IP地址为192.168.153.191

    两台机器上的系统都为CentOS 6.5

    2)已经通过前篇文章在被监控的机器上(192.168.153.191),配置好了JMX,防火墙(iptable)开放了12345端口。

    # Firewall configuration written by system-config-firewall  
    # Manual customization of this file is not recommended.  
    *filter  
    :INPUT ACCEPT [0:0]  
    :FORWARD ACCEPT [0:0]  
    :OUTPUT ACCEPT [0:0]  
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
    -A INPUT -p icmp -j ACCEPT  
    -A INPUT -i lo -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT  
    -A INPUT -j REJECT --reject-with icmp-host-prohibited  
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited  
    COMMIT  

    二、存在问题

    telnet 192.168.153.191 12345 是可以连上的,但是jconsole连不上,zabbix web页面上hosts项显示也是连不上

    三、寻找问题原因

    从来没遇到过这样的奇葩情况,开始一路google,baidu。找了十几篇文章,都搞不定。有些文章指出使用(org.apache.catalina.mbeans.JmxRemoteLifecycleListener 这个类在catalina-jmx.remote.jar包中,在server.xml中配置一个Listener,我没试过,这个我想估计是解决的一个方法)。

    偶然看到小日本的一篇文章让我茅塞顿开,文章网址:http://www.checksite.jp/jconsole-jmx-tomcat/

    配置如下:

     setenv.sh文件内容

     設定内容 は以下になります。この設定で、リモートノードからJMXを使って(認証は行わずに)Tomcat の Java VM を監視できるようになります。

    1
    2
    3
    4
    5
    6
    7
    8
    # cat setenv.sh
    #!/bin/sh
     
    export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
                          -Dcom.sun.management.jmxremote.port=10080
                          -Dcom.sun.management.jmxremote.ssl=false
                          -Dcom.sun.management.jmxremote.authenticate=false"
    #

    portは「10080」としていますが、環境に合致したポート番号を使っても問題ありません。
    以下のように実行権限を与えておきます。

    iptable的配置如下:

    リモートノードからJMXを使って接続できるようにする為に、先ほど setenv.sh で指定したJMXポートに対する接続をFireWallで開放します。

    私の環境では、iptables を使っているので、iptables での設定を以下に記載しておきます。

    # iptables --list --line-number (←番号確認)
    # iptables --insert INPUT (番号) -p tcp -s (ソースIP) --dport 10080:65535 -j ACCEPT
    # iptables --list --line-number (←追加確認)
    # /sbin/service iptables save (←ファイルへ保存)
    # cat /etc/sysconfig/iptables (←保存ファイルを確認)

    看来被监控JMX开启的监听端口肯定不止一个啊!马上改下被监控端的iptables

    # Firewall configuration written by system-config-firewall  
    # Manual customization of this file is not recommended.  
    *filter  
    :INPUT ACCEPT [0:0]  
    :FORWARD ACCEPT [0:0]  
    :OUTPUT ACCEPT [0:0]  
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
    -A INPUT -p icmp -j ACCEPT  
    -A INPUT -i lo -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 12345:65535 -j ACCEPT  
    -A INPUT -j REJECT --reject-with icmp-host-prohibited  
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited  
    COMMIT  

    结果还真TM连上了!有图有真相

    但总感觉,不需要开那么多端口吧。。。于是想用二分法来试验,到底是从哪个端口到哪个端口。试了几个,感觉这个方法要找到这个临界端口的话,太麻烦了,感觉思路不对(猜根本就不是这么回事)。

    偶然间敲了个命令:netstat -anlp(敲两次命令之间重启过tomcat,不过这里为什么显示的ip是192.168.153.19跟192.168.153.18,应该是192.168.153.191跟192.168.153.181,不过这个先不管!也许是虚拟机的问题,不管它,忽略!)

    PS:192.168.153.2是我的windows宿主机

    应验了上面的猜测,确实不是这么回事啊!

     重启tomcat后

     再重启tomcat

     从以上3个图看,得出结论,被监控端会开启两个端口,一个端口是12345(在被监控端tomcat安装目录的bin子目录下的setenv.sh文件中已经指明了CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"),另一个端口应该是动态随机的(因此无法知道JMX会监听哪个端口),这是一个比较头痛的问题!

    怪不得小日本会这么写iptables的策略。

    四、解决办法

    1) 临时方案

    将上述3张图,显示的33022或48289或36479,端口开放出来,但这种方式,重启tomcat,或重启服务器后就不行了,是下下策。

    2)开放很多端口

    一种办法就是在被监控端的iptables策略写成下面的方式。

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 12345:65535 -j ACCEPT

    这个方法重启tomcat,重启服务器,都没问题,但是开放了太多端口。

    3)终极方案

           就是要用到catalina-jmx-remote.jar (强烈推荐这种方案)

           下载catalina-jmx-remote.jar

           不同版本Tomcat有不同的catalina-jmx-remote.jar,在tomcat的下载页(我用的tomcat版本是7.0.62)面http://tomcat.apache.org/download-70.cgi,找到以下JMX Remote jar,把这个文件放到tomcat安装目录的lib子目录下

          修改Tomcat安装目录conf子目录下的server.xml配置文件

    省略...  
    <Server port="8005" shutdown="SHUTDOWN">  
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />  
      <!-- Security listener. Documentation at /docs/config/listeners.html  
      <Listener className="org.apache.catalina.security.SecurityListener" />  
      -->  
      <!--APR library loader. Documentation at /docs/apr.html -->  
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
      <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->  
      <Listener className="org.apache.catalina.core.JasperListener" />  
      <!-- Prevent memory leaks due to use of particular java/javax APIs-->  
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />  
      <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
              rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12346" />  
    省略...  

      修改Tomcat安装目录bin子目录下的之前的脚本文件setenv.sh

    CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=192.168.153.191"  
    CATALINA_OPTS="${CATALINA_OPTS} -Djavax.management.builder.initial="  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"  
    #CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.port=12345"#端口配置不用了  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"  
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"  

    修改/etc/sysconfig/iptables 防火墙策略

    # Firewall configuration written by system-config-firewall  
    # Manual customization of this file is not recommended.  
    *filter  
    :INPUT ACCEPT [0:0]  
    :FORWARD ACCEPT [0:0]  
    :OUTPUT ACCEPT [0:0]  
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
    -A INPUT -p icmp -j ACCEPT  
    -A INPUT -i lo -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT  
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 12346 -j ACCEPT  
    -A INPUT -j REJECT --reject-with icmp-host-prohibited  
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited  
    COMMIT  

       注意:与server.xml配置里的org.apache.catalina.mbeans.JmxRemoteLifecycleListener监听器所配置的端口一致

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
              rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12346" /> 

     然后,重启被监控机器上(192.168.153.191)的tomcat,在windows宿主机上用jconsole.jar测试是否可以连接,结果连接成功了!

    zabbix_server请求zabbix_java_gateway去连接JMX可能有一定延迟,所以需要等一会儿,JMX标志要过一会才会显示会绿色


    zabbix web监控页面hosts项的192.168.153.191  的 JMX的标志也变绿了。大功告成!

  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/dyh004/p/9295426.html
Copyright © 2011-2022 走看看