問題背景
Tomcat經常崩潰crash,想看看JVM內存使用情況,就想到了用Jconsole監控,以前只是監控本地的JVM,這次要監控遠程的,遇到了不少問題。
經過幾個小時的努力,參考了眾多網友的資料之后,才最終解決了這個問題。
比較坑爹的是,網上的資料,竟然沒有一個是:完美無缺的,沒有一篇文章提到了“jmxremote.access”這個文件的重要性。
第一階段
找到了2種配置,是否需要輸入密碼。
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=60001"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
authenticate為false,jconsole連接遠程jvm時,就不需要輸入用戶名和密碼。
否則,要配置密碼文件和密碼。
可以指定密碼文件的位置
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/root/soft/jdk7/jre/lib/management/jmxremote.password"
我把這些配置放在了catalish.sh中。
第二階段
上面的配置遇到了一個問題,如果是第一次啟動正常,但是當shutdown時,提示端口號被占用了。
問題原因是,在關閉Tomcat時,也執行了Catalish中的jmxremote的端口號。
解決辦法:在catalish.sh文件中,判斷是否為啟動命令,如果是start,就設置變量,否則,就不設置。
相關腳本:
JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"
101
if [ "$1" = "start" ];then
102 echo "set console";
103 # JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"
104 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=60001 -Djava.rmi.server.hostname=42.96.84.84";
105 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false";
106 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false";
107 # JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/root/soft/jdk7/jre/lib/management/jmxremote.password"
108 else
109 echo "no startup";
110 fi;
111
第三階段
上面的設置之后,可能還連接不上,需要配置“java.rmi.server.hostname”為機器的ip,比如我的是“42.96.84.84”。
然后,重啟Tomcat,在本地Jconsole連接遠程JVM,只輸入“42.96.84.84:60001”。
第四階段
登錄使用密碼,搞了幾個小時,尼瑪。
注意問題
1.-Dcom.sun.management.jmxremote.authenticate=true
2.-Dcom.sun.management.jmxremote.pwd.file 指定正確的密碼文件
3.用戶名及密碼(參考jmxremote.password文件) monitorRole只能讀,controlRole能讀寫
配置中的安全原因出錯,由於密碼是以明文的方式保存在:jmxremote.password中,所以對此文件只能有所有者都讀取,其他人都不能讀取。
權限需要注意,600,所有者有rw權限。
4.用戶和權限其實是存在jmxremote.access中。
千萬要注意啊,網上的絕大部分資料,都沒有提到這個文件的真正作用。
我是在嘗試了若干小時之后,才發現這個文件的作用,竟然是如此的大。
有點類似於SVN配置,用戶名-權限,用戶名-密碼,2個配置文件。
fansunion readonly
admin readwrite \
create javax.management.monitor.*,javax.management.timer.* \
unregister
jmxremote.password內容
fansunion 12345
admin 12345
"用戶名及密碼(參考jmxremote.password文件) monitorRole只能讀,controlRole能讀寫",給我很大的啟發。
為什么monitorRole和controlRole,這2個角色的權限還不一樣呢,默認注釋的password文件中,沒有看出有啥區別呀。
於是,我才去jmxremote.access文件看了看,最終找到了問題的症結。
至此,不使用密碼和使用用戶名及密碼,“admin”-“12345”成功登錄42.96.84.84上的Tomcat使用的JVM。
注意:本文中的ip、用戶名、密碼,僅供參考,你懂的。
參考資料
1.入門參考
3.給我很大的啟發,解決用戶名和密碼登錄問題
http://www.linuxidc.com/Linux/2015-02/113415.htm
http://www.linuxidc.com/Linux/2015-02/113415.htm
