2009-08-12 35 views
55

Tôi đang cố gắng kết nối với một cá thể JMX tomcat từ xa bằng cách sử dụng jConsole. Nhưng không thể kết nối thành công. Bất kỳ ý tưởng?Kết nối cá thể JMX từ xa tomcat bằng cách sử dụng jConsole

tôi bao gồm các tùy chọn sau đây trong tomcat xa catalina.sh: "Nhưng không thể kết nối thành công"

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" 
+0

Bạn chạy một phiên bản đóng gói của Tomcat hoặc bạn đã cài đặt nó bằng tay? Một điều nữa, bạn có thể dán toàn bộ lỗi không? –

+0

Câu hỏi tương tự: https://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work – Vadzim

Trả lời

2

Chính xác những gì bạn có ý nghĩa gì khi bạn nói? Có thông báo lỗi không? Thử bật tính năng ghi nhật ký trong jconsole và xem điều đó có giúp gỡ lỗi nó hay không.

Để bật logging jconsole, chỉnh sửa một tập tin có tên logging.properties trong thư mục mà bạn sẽ chạy jconsole trong, thêm:

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 

Sau đó, bắt đầu jconsole với:

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

Joe, tôi nhận được ngoại lệ sau đây. Bỏ qua lỗi ghi nhật ký đề xuất vấn đề là gì \t tại com.sun.jmx.remote.util.ClassLogger.finer (ClassLogger.java:130) \t tại com.sun.jmx.remote.util.ClassLogger.trace (ClassLogger. java: 88) \t tại javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:245) \t tại javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:227) \t tại mặt trời .tools.jconsole.ProxyClient.tryConnect (ProxyClient.java:334) \t tại sun.tools.jconsole.ProxyClient.connect (ProxyClient.java:296) \t tại sun.tools.jconsole.VMPanel $ 2.run (VMPanel. java: 280) – Niger

+0

Nỗi buồn y, tôi đã có lỗi đánh máy trong văn bản logging.properties. Tôi đã chỉnh sửa bài đăng của mình, hãy thử tạo lại tệp đó và xem liệu bạn có thể nhận được một số thông tin gỡ lỗi hay không. –

+0

Không, chúng tôi không thể xem nhật ký. Điều này tạo ra các bản ghi ở đâu? –

63

tôi có một vấn đề tương tự, nếu không giống nhau. Tôi có thể kết nối với máy chủ JMX nếu tôi bắt đầu jconsole cục bộ trên máy.

Dường như máy chủ RMI không nghe trên ip chính xác. Vì vậy, như đã được đề xuất trong this related question, tôi đã thêm như sau:

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

để JAVA_OPTS là tốt, và sau đó nó làm việc.

+0

Cảm ơn rất nhiều. Đó là những gì tôi cần. – Conor

+1

Làm việc cho tôi Tôi chỉ cần thiết lập ip máy chủ để 127.0.0.1 và nó làm việc cho tôi trên máy địa phương của tôi. – rado

+0

Chúng tôi có thêm điều này vào JAVA_OPTS của máy chủ hoặc máy địa phương JAVA_OPTS không? –

8

chuỗi nào bạn đang sử dụng làm url kết nối JMX. Tôi không có nghĩa là để chỉ ra rõ ràng nhưng JConsole có một giao diện khủng khiếp và với tôi đòi hỏi một url quá phức tạp trước khi nó sẽ kết nối với một ứng dụng jmx từ xa. Mine trông như thế này:

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

Thay đổi /etc/hosts trên Linux, nơi tôi thay thế địa chỉ localhost liên quan đến tài khoản của tôi vào máy ip, giải quyết vấn đề này đối với tôi.

35

Tôi đã thu thập thông tin trải rộng trên mạng, được tìm thấy với các gợi ý từ các thành viên khác.

Hầu hết các cơn đau gây ra bởi JMX là (imo) thực tế là JMX sẽ mở một cổng mạng được cấp phát động thứ hai. Tường lửa (như iptables) sẽ chặn điều này.

Giải pháp cho tomcat trên linux:

sử dụng tomcat 6.0.24 hoặc mới hơn tải catalina-jmx-remote.jar từ extras tomcat apache (sử dụng trình duyệt trên trang tải tomcat) sao chép nó trong $ CTALINA_HOME \ lib

Điều này cho phép bạn thiết lập cả hai cổng được sử dụng bởi JMX

chỉnh sửa server phần trong server.xml của bạn

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

đặt một số biến môi trường (ví dụ: trong 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" 

này kích hoạt kiểm soát truy cập cho JMX

jmxremote.truy cập sẽ trông giống như

monitorRole readonly 
controlRole readwrite 

cuối jmxremote.password sẽ

monitorRole tomcat 
controlRole tomcat 

(chỉ không gian đơn giản)

tomcat khởi động lại.

Bây giờ cấu hình tường lửa trên máy chủ (ví dụ như 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 

và/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 restart

Xong!

Bây giờ hãy sử dụng VisualVM hoặc JConsole trên máy trạm của bạn để thiết lập kết nối với rmiRegistryPortPlatform, 9840 trong mẫu của chúng tôi.

Nếu không có thêm tường lửa giữa trạm làm việc và máy chủ thì nó sẽ hoạt động.

+0

+1 trawled ở khắp mọi nơi cho thông tin này, hoạt động tuyệt vời – Aitch

+3

+1 cảm ơn! làm việc tuyệt vời! Tôi chỉ cần thêm một dòng khác: '-Djava.rmi.server.hostname = '. –

+0

Nếu nó cũng là '-Dcom.sun.management.jmxremote.port = 9840' trong tomcat.conf? –

0

Vâng, tôi đã có vấn đề này trong một hộp Linux (máy ảo) và tôi cố định nó bằng cách sử dụng tài sản -Djava.rmi.server.hostname nhưng có một điều tôi không thể hiểu được. Máy của tôi có 5 máy chủ tomcat, tất cả chúng đều có kích hoạt jmx trong các cổng liên tiếp (8008.8018,8028 ...) và chỉ một trong số chúng có vấn đề này khi kết nối với JMX. Không có tường lửa, không có thuộc tính -Djava.rmi.server.hostname trong bất kỳ tomcat nào.

Vì vậy, tôi hiểu vấn đề nhưng tôi không thể hiểu tại sao 4 trong số tomcats của tôi hoạt động và 1 trong số chúng không .

P.D: Tiếng Anh của tôi rất kém, tôi biết. Lời xin lỗi của tôi.

0

BẢO VỆ: Bạn cần sửa (như có số đã biết) các cổng RMI Registry và JMX/RMI Server. Bạn làm điều này bằng cách đặt jar-file trong lib-dir và cấu hình một người nghe đặc biệt. (Và ofcourse cờ thông thường để kích hoạt 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> \ 

Xem: JMX xa Vòng đời Listener tại http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

2

nếu bạn đang làm việc trên linux, chỉnh sửa các tập tin catalina.sh thêm:

   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 

hoặc sửa đổi tệp/etc/profile dưới dạng gốc và chạy lại tệp (nguồn/etc/profile)

nếu bạn đang làm việc trên các cửa sổ và bạn đang bắt đầu tomcat từ thứ dòng lệnh e, sử dụng biến môi trường CATALINA_OPTS

nếu bạn đang làm việc trên cửa sổ và bạn đang khởi động tomcat làm dịch vụ, bạn sẽ cần sử dụng tiện ích dịch vụ giám sát để định cấu hình tham số khởi tạo dịch vụ (không phải setenv.bat , catalina.bat hoặc env-vars sẽ hoạt động). cho rằng bạn sẽ cần tên dịch vụ xuất hiện được liệt kê trong services.msc (ví dụ jasperreportsTomcat). Sau đó, bạn sẽ cần mở một bảng điều khiển với tư cách quản trị viên và thực thi (ví dụ): tomcat6w.exe // MS // jasperreportsTomcat

bằng lệnh này sẽ xuất hiện biểu tượng khay nơi bạn có thể mở bảng điều khiển. Trong tab "Java", bạn có thể sửa đổi các tùy chọn jmx. Hãy cẩn thận để không thêm dấu cách trắng theo sau và sử dụng ký hiệu "[enter]" để tách riêng từng dòng tùy chọn.

-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 

Hy vọng nó giúp

1

tôi có một cái gì đó cho tất cả các bạn, để hoàn thành việc điều tra toàn bộ sự việc này. Có một thủ thuật, nó xảy ra rằng công cụ profiler kết nối với jvm bằng cách sử dụng một cổng, nhưng jvm tiếp tục cuộc trò chuyện bằng cách sử dụng một cổng ngẫu nhiên khác. Nếu jvm đang chạy bên trong một máy từ xa (ví dụ: máy chủ ứng dụng web tomcat) và máy từ xa có bảo vệ chống lại các kết nối gửi đi và đến, bạn phải đặt thuộc tính hệ thống java com.sun.management.jmxremote.rmi.port với cùng giá trị của thuộc tính có tên com.sun.management.jmxremote.port

Nguồn: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error Và cũng kiểm tra này: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

Hope đóng góp guys!

Và chúc bạn may mắn!

1

Kiểm tra xem máy chủ của bạn có bị tường lửa hay không. JMX dựa trên RMI, mở hai cổng khi nó khởi động. Một là cổng đăng ký, mặc định là 1099 và có thể được chỉ định bởi tùy chọn com.sun.management.jmxremote.port. Cái kia là để trao đổi dữ liệu, và là ngẫu nhiên, đó là nguyên nhân gây ra vấn đề. Một tin tốt là, từ JDK6, cổng ngẫu nhiên này có thể được xác định bởi tùy chọn com.sun.management.jmxremote.rmi.port.

thêm dòng trong bạn {} 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" 
10

Cố gắng với Java 8

1. Thêm phần này vào java của bạn kịch bản tomcat khởi động:

-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 

ví dụ: thêm vào 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. Thực hiện điều này trên máy tính của bạn.

3. Bắt đầu jconsole trên máy tính của bạn

jconsole localhost:1616 

4. Hãy vui vẻ!

  • P.S.: trong bước 2, sử dụng ssh-L bạn chỉ định rằng cổng 1616 trên máy chủ lưu trữ cục bộ (máy khách) sẽ được chuyển tiếp đến phía từ xa.
  • P.S.2 .: bạn có thể chỉ định cùng một cổng cho JMX và RMI cuộc hội thoại
+0

cảm ơn đã có thể chạy rmiregistry và rmicomm trong cùng một cổng. Điều này làm việc mà không có tomcat/conf/server.xml JMXRemoteLifecycleListener. Có vấn đề gì cần lưu ý nếu không sử dụng người nghe đó? – Whome

+0

@Whome Xin lỗi, tôi đã bỏ lỡ nhận xét của bạn. Không, theo kinh nghiệm của tôi không có dấu hiệu phản đối. – freedev

3

Enable JMX trong Tomcat8, thử nghiệm thành công trong POC tôi

1/Tải catalina-jmx-remote.jar từ trang web của apache và đặt trong $CATALINA_HOME/lib.

2/Chụp server.xml/setenv.sh sao lưu. Tận dụng những thay đổi để server.xml như liệt kê dưới đây

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

3/Hãy thay đổi để $CATALINA_BASE/bin/setenv.sh như -

[...] 

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/Tạo hai tập tin này như - $touch $CATALINA_BASE/conf/jmxremote.password chứa:

quản trị letmein

$touch $CATALINA_BASE/conf/jmxremote.access chứa:

quản trị readwrite

$ chmod 600 jmxremote.password 

5/tomcat Khởi động lại và thử nghiệm trên công cụ jconsole :)

$echo|telnet 10.105.14.90 10001 
Các vấn đề liên quan