IT Share you

jConsole을 사용하여 원격 Tomcat JMX 인스턴스 연결

shareyou 2021. 1. 6. 08:10
반응형

jConsole을 사용하여 원격 Tomcat JMX 인스턴스 연결


jConsole을 사용하여 원격 tomcat JMX 인스턴스에 연결하려고합니다. 그러나 성공적으로 연결할 수 없습니다. 어떤 아이디어?

원격 Tomcat에 다음 옵션을 포함했습니다 catalina.sh.

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=9004 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false"

나는 똑같지는 않더라도 비슷한 문제가 있었다. 시스템에서 로컬로 jconsole을 시작하면 JMX 서버에 연결할 수 있습니다.

RMI 서버가 올바른 IP에서 수신하지 않는 것 같습니다. 따라서이 관련 질문 에서 제안한대로 다음을 추가했습니다.

-Djava.rmi.server.hostname=<host ip>

JAVA_OPTS잘, 다음으로 일했다.


다른 회원들의 힌트와 함께 인터넷에 퍼진 정보를 수집했습니다.

JMX로 인한 대부분의 고통은 JMX가 동적으로 할당 된 두 번째 네트워크 포트를 여는 것입니다. 방화벽 (iptables와 같은)이이를 차단합니다.

Linux에서 Tomcat에 대한 솔루션 :

apache tomcat extras에서 tomcat 6.0.24 이상 다운로드 catalina-jmx-remote.jar 사용 (톰캣 다운로드 페이지에서 찾아보기 사용) $ CTALINA_HOME \ lib에 복사

이를 통해 JMX에서 사용하는 두 포트를 모두 설정할 수 있습니다.

server.xml에서 서버 섹션 편집

<Server port="8005" ..>
  ...
  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

일부 환경 변수 설정 (예 : setenv.sh)

CATALINA_OPTS="
  -Djava.rmi.server.hostname=IP-TO-LISTEN
  -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
  -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
  -Dcom.sun.management.jmxremote.ssl=false"

이것은 JMX에 대한 액세스 제어를 활성화합니다.

jmxremote.access는 다음과 같습니다.

monitorRole readonly
controlRole readwrite

end jmxremote.password는

monitorRole tomcat
controlRole tomcat

(단순한 공간)

바람둥이를 다시 시작하십시오.

이제 서버에 방화벽을 구성하십시오 (예 : iptables).

/ etc / sysconfig / iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT

및 / etc / sysconfig / ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT

iptables 다시 시작

끝난!

이제 워크 스테이션에서 VisualVM 또는 JConsole을 사용하여 샘플에서 rmiRegistryPortPlatform, 9840에 대한 연결을 설정합니다.

워크 스테이션과 서버 사이에 방화벽이 더 이상 없으면 작동합니다.


Java 8로 시도

1. Java tomcat 시작 스크립트에 다음을 추가하십시오.

-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

예를 들어 bin / setenv.sh에 다음을 추가하십시오.

export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote.port=1616 \
-Dcom.sun.management.jmxremote.rmi.port=1616 \
-Dcom.sun.management.jmxremote.local.only=true \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false "

2. 이것을 컴퓨터에서 실행하십시오.

  • Windows 사용자 :

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux 및 Mac 사용자 :

    ssh user@remote-host -L 1616:remote-host:1616

3. jconsole컴퓨터에서 시작

jconsole localhost:1616

4. 즐거운 시간 보내세요!

  • 추신 : 2 단계에서 사용 ssh하고 -L로컬 (클라이언트) 호스트의 포트 1616이 원격 측으로 전달되도록 지정합니다.
  • PS2 .: JMX 및 RMI 대화에 대해 동일한 포트를 지정할 수 있습니다.

JMX 연결 URL로 어떤 문자열을 사용하고 있습니까? 명백한 것을 지적하려는 것은 아니지만 JConsole은 끔찍한 인터페이스를 가지고 있으며 원격 jmx 앱에 연결하기 전에 지나치게 복잡한 URL이 필요합니다. 내 모습은 다음과 같습니다.

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi

Tomcat8에서 JMX를 활성화하고 POC에서 성공적으로 테스트했습니다.

1 / catalina-jmx-remote.jarApache 웹 사이트에서 다운로드하고 $CATALINA_HOME/lib.

2 / 테이크 server.xml/ setenv.sh백업. server.xml아래와 같이 변경하십시오-

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

3 / $CATALINA_BASE/bin/setenv.sh좋아요로 변경 -

[...]

JVM_OPTS="[...] 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote=true "

4 / 다음 두 파일을 다음과 같이 만듭니다 $touch $CATALINA_BASE/conf/jmxremote.password.

관리자 letmein

$touch $CATALINA_BASE/conf/jmxremote.access 포함 :

관리자 읽기 쓰기

$ chmod 600 jmxremote.password

5 / tomcat을 다시 시작하고 jconsole 도구에서 테스트하십시오. :)

$echo|telnet 10.105.14.90 10001

"하지만 성공적으로 연결할 수 없습니다."라는 말은 정확히 무엇을 의미합니까? 오류 메시지가 있습니까? jconsole에서 로그인을 켜고 디버그에 도움이되는지 확인하십시오.

jconsole 로깅을 켜려면 jconsole을 실행할 디렉토리에서 logging.properties라는 파일을 편집하고 다음을 추가합니다.

handlers= java.util.logging.ConsoleHandler

.level=INFO

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

javax.management.level=FINEST
javax.management.remote.level=FINEST

그런 다음 다음을 사용하여 jconsole을 시작합니다.

jconsole -J-Djava.util.logging.config.file=logging.properties

Linux에서 작업하는 경우 catalina.sh 파일을 다음을 추가하여 수정하십시오.

                CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
            export CATALINA_OPTS

또는 / etc / profile 파일을 루트로 수정하고 파일을 다시 실행하십시오 (소스 / etc / profile).

if you are working on windows and you are starting tomcat from the command line, use the environment variable CATALINA_OPTS

if you are working on windows and you are starting tomcat as a service, you'll need to use the monitor service utility to configure the service initialization parameters (neither setenv.bat, catalina.bat or env-vars will work). for that you'll need the service name that appears listed in services.msc (for example jasperreportsTomcat). After, you'll need to open a console as administrator and execute (for example): tomcat6w.exe //MS//jasperreportsTomcat

with this command will appear a tray icon where you can open a panel. In the "Java" tab now you can modify the jmx options. Be careful to not add trailing whitespaces and use the "[enter]" symbol to separate each option line by line.

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.61.101
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Hope it helps


Check if your server is behind the firewall. JMX is base on RMI, which open two port when it start. One is the register port, default is 1099, and can be specified by the com.sun.management.jmxremote.port option. The other is for data communication, and is random, which is what cause problem. A good news is that, from JDK6, this random port can be specified by the com.sun.management.jmxremote.rmi.port option.

add the line in you {tomcat_dir}/bin/setenv.sh:

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

I got something for all of you, in order to complete the investigation of this whole thing. There is a trick, it happens that profiler tool connnects with the jvm using a port, but the jvm continues the conversation using another random port. If the jvm is running inside a remote machine (for example : a tomcat web-app server), and the remote machine has protection against outgoing and incoming connections, you must set the java system property com.sun.management.jmxremote.rmi.port to the same value of the property named com.sun.management.jmxremote.port

Source : https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error And also check this out : http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

Hope to contribute guys!

And good luck!


Well, I had this problem in a Linux box (virtual machine) and I fixed it using -Djava.rmi.server.hostname property but there's a thing I can't understand. My machine has 5 tomcat servers, all of them has jmx enabled in consecutive ports (8008,8018,8028...) and only one of them had this issue connecting JMX. No firewall, no -Djava.rmi.server.hostname property in any tomcat....

So the thing is that I understand the problem but I can't understand why 4 of my tomcats worked and 1 of them not.

P.D: My english is very poor, I know. My Apologies.


PROTIP: You need to fix (as in having a known number) the RMI Registry and JMX/RMI Server ports. You do this by putting jar-file in the lib-dir and configuring a special listener. (And ofcourse the usual flags for activating JMX

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.port=8999 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

See: JMX Remote Lifecycle Listener at http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html


Changing the /etc/hosts on linux, where I replaced the localhost address associated to my account to the machine ip, solved this problem for me.

ReferenceURL : https://stackoverflow.com/questions/1263991/connecting-remote-tomcat-jmx-instance-using-jconsole

반응형