서비스의 정상 동작 여부 및 상태를 모니터링 하는 것은 굉장히 중요하면서도 어려운 작업이다.

ps 로 해당 서비스 프로세스가 살아 있는지 확인하는 방법은 프로세스가 떠있지만 데드락이 걸렸거나 Hang on 상태라 정상 동작하지 않을 경우 전혀 도움이 되지 않는다.

특히 자바 기반의 서비스라면 JVM 의 메모리나 쓰레드 및 VM 내부의 정보를 알아야 정확한 모니터링이 가능할 수 있다.


JMX(Java Management Extensions) 를 사용하여 아파치 톰캣을 모니터링 하기 위한 설정 절차를 알아 보자.

설정

  • 사전에 톰캣 7이 설치되고 정상 동작해야 하며 다른 버전의 톰캣이라면 설정 방법이 다를 수도 있다.
  • 톰캣을 구동하는 서버의 IP 는 192.168.152.131 로 가정한다.


  1. catalina-jmx-remote.jar   라는 별도의 jar 파일이 하나 필요하다. 기본 설치 패키지에는 포함되어 있지 않으므로 톰캣 다운로드 사이트에서 다운로드 한후에 톰캣의 lib 폴더에 추가하자.

    7.x

    wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-7/v7.0.79/bin/extras/catalina-jmx-remote.jar
    CODE

    8.0

    wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-8/v8.0.45/bin/extras/catalina-jmx-remote.jar
    CODE


     

  2. bin/setenv.sh 를 만들고 다음 내용을 추가 한다.

    setenv.sh

    #!/bin/sh
     
    JMX_OPTS=" -Dcom.sun.management.jmxremote \
                     -Dcom.sun.management.jmxremote.authenticate=false \
                     -Djava.rmi.server.hostname=192.168.152.131 \
                    -Dcom.sun.management.jmxremote.ssl=false "
    CATALINA_OPTS=" ${JMX_OPTS} ${CATALINA_OPTS}"
    BASH

    line 4 - 일단 JMX가 동작하게 설정하는게 중요하므로 인증을 사용하지 않게 설정한다.  
    line 5 - 톰캣이 구동되는 서버의 IP 를 기술한다. 자신의 서버 IP 로 치환하자.
    line 6 - 연결에 SSL 을 사용하지 않는다. SSL 을 사용하게 하려면 설정할 게 많으므로 넘어가자.

  3. 톰캣의 conf/server.xml 을 열고 Server 항목에 다음 Listener 를 추가한다.

     <Server port="8005" shutdown="SHUTDOWN">
       ...
      <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
            rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>
    XML
  4. 방화벽을 사용한다면 9840, 9841 포트를 열어야 한다. RHEL이나 CentOS 를 사용한다면 lokkit 로 간단하게 설정할 수 있다.

    lokkit -p 9840:tcp  
    lokkit -p 9841:tcp  
    CODE
  5. 톰캣을 구동한다.


jconsole 로 연결

JMX 의 구현물을 많지만 간단하게 JDK 에 포함되어 있는 jconsole 을 사용하여 연결해 보자.

  1. jconsole 을 구동한다.
  2. Remote Process 를 클릭하고 하하하연결 설정
     
  3. 프로토콜이 SSL 이 아니면 다음과 같은 경고를 내보낸다. Insecure 를 선택하여 연결을 진행하자.
     
  4. 다음과 같이 JMX 관리 창이 뜨며 VM 관련한 다양한 정보를 모니터링할 수 있다.
     


인증 설정

이제 정상 동작 여부를 확인했으면 인증을 통해야 JMX 로 연결 가능하게 설정해 보자.

  1. bin/setenv.sh 를 다음과 같이 수정한다.

    setenv.sh

    #!/bin/sh
     
    JMX_OPTS=" -Dcom.sun.management.jmxremote \
                     -Dcom.sun.management.jmxremote.authenticate=true \
                     -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password  \
                     -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access  \
                     -Djava.rmi.server.hostname=192.168.152.131 \
                    -Dcom.sun.management.jmxremote.ssl=false "
    CATALINA_OPTS=" ${JMX_OPTS} ${CATALINA_OPTS}"
    BASH
  2. conf/jmxremote.access 와 conf/jmxremote.password 두 개의 파일을 생성해서 다음 내용을 추가한다. 
    계정명 권한의 의미로 monitorRole 가 계정이고 readonly 가 허용된 권한이다.

    jmxremote.access

    monitorRole readonly
    controlRole readwrite

    계정명 암호로 monitorRole 계정의 암호는 tomcat 이다.

    jmxremote.password
    monitorRole tomcat
    controlRole tomcat


    또는 다음 쉘 스크립트를 구동하자.

    echo -e "monitorRole readonly\ncontrolRole readwrite" > conf/jmxremote.access
    echo -e "monitorRole tomcat\ncontrolRole tomcat" > conf/jmxremote.password
    CODE
    위 설정은 예제이므로 실 환경에서는 계정과 암호를 다른 것으로 변경하자.
  3. 톰캣을 재구동한다.
  4. jconsole 을 구동하고 연결 정보에 위에서 설정한 계정과 암호를 입력한다.
     



Ref