본문 바로가기
Java/기초

[Java] jConsole로 원격에서 실행중인 JVM 모니터링하기

by EricJeong 2020. 2. 14.

서버 환경

  • Naver Cloud Platform(nCloud) Compact Server
  • ubuntu 16
  • docker (openJDK-8 베이스 이미지로 만든 프로젝트가 올라갑니다)

프로젝트

  • Spring boot 2.2
  • maven
  • JDK 8

모니터링 환경

  • Windows10 PRO
  • Oracle JDK 8
  • jConsole

 

도커 이미지 작성

도커 이미지를 만들 때 참조하는 DockerFile을 다음과 같이 작성했습니다.

 

FROM ascdc/jdk8
ADD delfood.jar delfood.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java",\
"-Dcom.sun.management.jmxremote.port=[접근할 포트]",\
"-Dcom.sun.management.jmxremote.rmi.port=[접근할 포트]",\
"-Dcom.sun.management.jmxremote.ssl=false",\
"-Dcom.sun.management.jmxremote.authenticate=false",\
"-Dcom.sun.management.jmxremote=true",\
"-Djava.rmi.server.hostname=[서버 공인 IP]",\
"-jar",\
"./delfood.jar", \
"--spring.datasource.password=$password", \
"--spring.datasource.username=$username", \
"--spring.datasource.url=$datasource", \
"--spring.redis.host=$redishost"

 

외부에서 실행중인 JVM에 접근하기 위해서는 -jar 위쪽에 있는 옵션들이 필요합니다.

 

"-Djava.rmi.server.hostname=[서버 공인 IP]

해당 jar파일을 실행하는 서버의 Public IP를 적어주시면 됩니다.

 

"-Dcom.sun.management.jmxremote.authenticate=false"

위 옵션을 false로 지정해야 아이디, 패스워드나 키 파일을 사용하지 않아도 모니터링을 할 수 있습니다.

 

"-Dcom.sun.management.jmxremote.port=[접근할 포트]"
"-Dcom.sun.management.jmxremote.rmi.port=[접근할 포트]"

이 부분에 있는 접근할 포트는 자유롭게 사용해도 좋지만 두 포트가 모두 같아야 합니다. 저는 85번 포트를 사용하였습니다.

 

 

[java.net.MalformedURLException: Local host name unknown:...] 이 발생한다면?

 

가끔 이 IP를 인식하지 못하는 오류가 발생하는데 서버의 /etc/hosts 파일에 아래와 같은 내용을 추가해주시면 됩니다.

[서버 공인 IP]   [호스트 이름]

 

호스트 이름을 모르겠다면 다음 명령어로 알 수 있습니다.

echo hostname

 

hosts파일을 수정했다면 다음과 같은 모양이 됩니다.

 

 

 

 

 

 

 

도커 이미지 실행

도커 이미지를 실행시킬 때는 포트를 열어주는 작업이 필요합니다.

docker run -d --name delfood_boot -p 80:80 -p 85:85 [이미지:태그]

80번 포트는 서비스 포트입니다. 모니터링과는 관계 없습니다.

85번포트가 제가 아까 지정한 모니터링 포트입니다. 해당 포트를 열어주어야 jConsole로 접근할 수 있습니다.

 

docker ps 명령으로 정상적으로 실행되었는지 확인한 후 원격에서 jConsole로 접근해보겠습니다.

 

jConsole 실행

 

위 JVM옵션을 모두 적용했다면 Username, Password 없이 JVM에 접근할 수 있습니다. 아래와같이 입력 후 Connect 버튼을 눌러주세요.

 

 

 

 

아래와 같이 Secure connection failed가 나오는 것은 SSL 없이 연결하기 떄문입니다. Insecure connection버튼을 눌러주세요.

 

 

 

아래와 같은 화면이 나온다면 성공적으로 접속한 것입니다.

 

댓글