在配置JMX遠(yuǎn)程訪問(wèn)的時(shí)候,設(shè)置jmxremote.password文件權(quán)限,修改該文件時(shí)添加寫(xiě)權(quán)限,chmod +w jmxremote.password ,放開(kāi)角色信息那倆行的注釋,保存,再使用chmod 0400 jmxremote.password
這樣就是它正確的權(quán)限設(shè)置
jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template復(fù)制,去掉.template后綴
?
轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/l1028386804/article/details/51547408
2016年5月的最后一天,今天我將和大家分享Java中如何使用JMX來(lái)監(jiān)控Tomcat的各種狀態(tài)。好了,不多說(shuō)了,我們直接進(jìn)入主題
一、激活Tomcat的JMX遠(yuǎn)程配置
要通過(guò)JMX遠(yuǎn)程監(jiān)控Tomcat,首先需要激活Tomcat的JMX遠(yuǎn)程配置。
① 修改腳本
先修改Tomcat的啟動(dòng)腳本,windows下為bin/catalina.bat(linux下為catalina.sh),添加以下內(nèi)容,8999是jmxremote使用的端口號(hào),第二個(gè)false表示不需要鑒權(quán):
?
[plain]?view plaincopy
set?JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote?-Dcom.sun.management.jmxremote.port=8999?-Dcom.sun.management.jmxremote.ssl=false?-Dcom.sun.management.jmxremote.authenticate=false??set?CATALINA_OPTS=%CATALINA_OPTS%?%JMX_REMOTE_CONFIG%?? 要注意以上語(yǔ)句的位置不能太后面,可以加在【if "%OS%" == "Windows_NT" setlocal】一句后的大段的注釋后面。
?
參考官方說(shuō)明:
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote
http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html#Enabling_JMX_Remote
http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html#Enabling_JMX_Remote
http://tomcat.apache.org/tomcat-9.0-doc/monitoring.html#Enabling_JMX_Remote
② 鑒權(quán)
上面的配置是不需要鑒權(quán)的,如果需要鑒權(quán)則添加的內(nèi)容為:
?
[plain]?view plaincopy
set?JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote?-Dcom.sun.management.jmxremote.port=8999?-Dcom.sun.management.jmxremote.ssl=false?-Dcom.sun.management.jmxremote.authenticate=true?-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password?-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access??set?CATALINA_OPTS=%CATALINA_OPTS%?%JMX_REMOTE_CONFIG%?? ③ 復(fù)制并修改授權(quán)文件
$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,將兩個(gè)文件復(fù)制到$CATALINA_BASE/conf目錄下
◆ 修改$CATALINA_BASE/conf/jmxremote.access 添加內(nèi)容:
???? monitorRole readonly
???? controlRole readwrite
◆ 修改$CATALINA_BASE/conf/jmxremote.password 添加內(nèi)容:
???? monitorRole chenfeng
???? controlRole chenfeng
注意: 如果進(jìn)行了以上步驟導(dǎo)致Tomcat啟動(dòng)不了,那么很可能是密碼文件的權(quán)限問(wèn)題
需要修改jmxremote.password文件的訪問(wèn)權(quán)限,只有運(yùn)行Tomcat的用戶才能擁有訪問(wèn)權(quán)限 :
????? Windows的NTFS文件系統(tǒng)下,選中文件,點(diǎn)右鍵 -->“屬性”-->“安全”--> 點(diǎn)“高級(jí)”--> 點(diǎn)“更改權(quán)限”--> 去掉“從父項(xiàng)繼承....”--> 彈出窗口中選“刪除”,這樣就刪除了所有訪問(wèn)權(quán)限。再選“添加”--> “高級(jí)”--> “立即查找”,選中你的用戶(或用戶組,如果選用戶不行那就選用戶組),例administrator,點(diǎn)“確定",“確定"。來(lái)到權(quán)限項(xiàng)目窗口,勾選“完全控制”,點(diǎn)“確定”,OK了。
官方的提示:
????? The password file should be read-only and only accessible by the operating system user Tomcat is running as.
?
④驗(yàn)證配置
重新啟動(dòng)Tomcat,在Windows命令行輸入“netstat -a”查看配置的端口號(hào)是否已打開(kāi),如果打開(kāi),說(shuō)明上面的配置成功了。
⑤ 使用jconsole測(cè)試JMX
運(yùn)行$JAVA_HOME/bin目錄下的jconsole.exe,打開(kāi)J2SE監(jiān)視和管理控制臺(tái),然后建立連接,如果是本地的Tomcat則直接選擇然后點(diǎn)擊連接,如果是遠(yuǎn)程的,則進(jìn)入遠(yuǎn)程選項(xiàng)卡,填寫(xiě)地址、端口號(hào)、用戶名、口令即可連接。。Mbean屬性頁(yè)中給出了相應(yīng)的數(shù)據(jù),Catalina中是tomcat的,java.lang是jvm的。對(duì)于加粗的黑體屬性值,需雙擊一下才可看內(nèi)容。
二、使用JMX監(jiān)控Tomcat示例代碼
?
[java]?view plaincopy
String?jmxURL?=?"service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";??JMXServiceURL?serviceURL?=?new?JMXServiceURL(jmxURL);????Map?map?=?new?HashMap();??String[]?credentials?=?new?String[]?{?"monitorRole",?"tomcat"?};??map.put("jmx.remote.credentials",?credentials);??JMXConnector?connector?=?JMXConnectorFactory.connect(serviceURL,?map);??MBeanServerConnection?mbsc?=?connector.getMBeanServerConnection();????ObjectName?threadObjName?=?new?ObjectName("Catalina:type=ThreadPool,name=http-8080");??MBeanInfo?mbInfo?=?mbsc.getMBeanInfo(threadObjName);????String?attrName?=?"currentThreadCount";??MBeanAttributeInfo[]?mbAttributes?=?mbInfo.getAttributes();??System.out.println("currentThreadCount:"?+?mbsc.getAttribute(threadObjName,?attrName));?? 三、完整的示例代碼文件
?
?
[java]?view plaincopy
import?java.lang.management.MemoryUsage;??import?java.text.SimpleDateFormat;??import?java.util.Date;??import?java.util.Formatter;??import?java.util.HashMap;??import?java.util.Iterator;??import?java.util.Map;??import?java.util.Set;????import?javax.management.MBeanAttributeInfo;??import?javax.management.MBeanInfo;??import?javax.management.MBeanServerConnection;??import?javax.management.ObjectInstance;??import?javax.management.ObjectName;??import?javax.management.openmbean.CompositeDataSupport;??import?javax.management.remote.JMXConnector;??import?javax.management.remote.JMXConnectorFactory;??import?javax.management.remote.JMXServiceURL;??public?class?JMXTest?{????????????public?static?void?main(String[]?args)?{??????????try?{????????????????String?jmxURL?=?"service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";????????????????JMXServiceURL?serviceURL?=?new?JMXServiceURL(jmxURL);????????????????Map?map?=?new?HashMap();??????????????String[]?credentials?=?new?String[]?{?"monitorRole",?"tomcat"?};??????????????map.put("jmx.remote.credentials",?credentials);??????????????JMXConnector?connector?=?JMXConnectorFactory.connect(serviceURL,??????????????????????map);??????????????MBeanServerConnection?mbsc?=?connector.getMBeanServerConnection();????????????????????????????ObjectName?threadObjName?=?new?ObjectName(??????????????????????"Catalina:type=ThreadPool,name=http-8080");??????????????MBeanInfo?mbInfo?=?mbsc.getMBeanInfo(threadObjName);????????????????String?attrName?=?"currentThreadCount";????????????MBeanAttributeInfo[]?mbAttributes?=?mbInfo.getAttributes();??????????????System.out.println("currentThreadCount:"??????????????????????+?mbsc.getAttribute(threadObjName,?attrName));????????????????????????????for?(int?j?=?0;?j?<?mbsc.getDomains().length;?j++)?{??????????????????System.out.println("###########"?+?mbsc.getDomains()[j]);??????????????}??????????????Set?MBeanset?=?mbsc.queryMBeans(null,?null);??????????????System.out.println("MBeanset.size()?:?"?+?MBeanset.size());??????????????Iterator?MBeansetIterator?=?MBeanset.iterator();??????????????while?(MBeansetIterator.hasNext())?{??????????????????ObjectInstance?objectInstance?=?(ObjectInstance)?MBeansetIterator??????????????????????????.next();??????????????????ObjectName?objectName?=?objectInstance.getObjectName();??????????????????String?canonicalName?=?objectName.getCanonicalName();??????????????????System.out.println("canonicalName?:?"?+?canonicalName);??????????????????if?(canonicalName??????????????????????????.equals("Catalina:host=localhost,type=Cluster"))?{??????????????????????????????????????????System.out.println("Cluster?MBeans?Details:");??????????????????????System.out??????????????????????????????.println("=========================================");??????????????????????????????????????????String?canonicalKeyPropList?=?objectName??????????????????????????????.getCanonicalKeyPropertyListString();??????????????????}??????????????}??????????????????????????ObjectName?runtimeObjName?=?new?ObjectName("java.lang:type=Runtime");??????????????System.out.println("廠商:"??????????????????????+?(String)?mbsc.getAttribute(runtimeObjName,?"VmVendor"));??????????????System.out.println("程序:"??????????????????????+?(String)?mbsc.getAttribute(runtimeObjName,?"VmName"));??????????????System.out.println("版本:"??????????????????????+?(String)?mbsc.getAttribute(runtimeObjName,?"VmVersion"));??????????????Date?starttime?=?new?Date((Long)?mbsc.getAttribute(runtimeObjName,??????????????????????"StartTime"));??????????????SimpleDateFormat?df?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");??????????????System.out.println("啟動(dòng)時(shí)間:"?+?df.format(starttime));????????????????Long?timespan?=?(Long)?mbsc.getAttribute(runtimeObjName,?"Uptime");??????????????System.out.println("連續(xù)工作時(shí)間:"?+?JMXTest.formatTimeSpan(timespan));??????????????????????????????????????ObjectName?heapObjName?=?new?ObjectName("java.lang:type=Memory");??????????????MemoryUsage?heapMemoryUsage?=?MemoryUsage??????????????????????.from((CompositeDataSupport)?mbsc.getAttribute(heapObjName,??????????????????????????????"HeapMemoryUsage"));??????????????long?maxMemory?=?heapMemoryUsage.getMax();????????????long?commitMemory?=?heapMemoryUsage.getCommitted();????????????long?usedMemory?=?heapMemoryUsage.getUsed();??????????????System.out.println("heap:"?+?(double)?usedMemory?*?100??????????????????????/?commitMemory?+?"%");??????????????MemoryUsage?nonheapMemoryUsage?=?MemoryUsage??????????????????????.from((CompositeDataSupport)?mbsc.getAttribute(heapObjName,??????????????????????????????"NonHeapMemoryUsage"));??????????????long?noncommitMemory?=?nonheapMemoryUsage.getCommitted();??????????????long?nonusedMemory?=?heapMemoryUsage.getUsed();??????????????System.out.println("nonheap:"?+?(double)?nonusedMemory?*?100??????????????????????/?noncommitMemory?+?"%");????????????????ObjectName?permObjName?=?new?ObjectName(??????????????????????"java.lang:type=MemoryPool,name=Perm?Gen");??????????????MemoryUsage?permGenUsage?=?MemoryUsage??????????????????????.from((CompositeDataSupport)?mbsc.getAttribute(permObjName,??????????????????????????????"Usage"));??????????????long?committed?=?permGenUsage.getCommitted();????????????long?used?=?heapMemoryUsage.getUsed();????????????System.out.println("perm?gen:"?+?(double)?used?*?100?/?committed??????????????????????+?"%");??????????????????????????ObjectName?managerObjName?=?new?ObjectName(??????????????????????"Catalina:type=Manager,*");??????????????Set<ObjectName>?s?=?mbsc.queryNames(managerObjName,?null);??????????????for?(ObjectName?obj?:?s)?{??????????????????System.out.println("應(yīng)用名:"?+?obj.getKeyProperty("path"));??????????????????ObjectName?objname?=?new?ObjectName(obj.getCanonicalName());??????????????????System.out.println("最大會(huì)話數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"maxActiveSessions"));??????????????????System.out.println("會(huì)話數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"activeSessions"));??????????????????System.out.println("活動(dòng)會(huì)話數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"sessionCounter"));??????????????}????????????????????????????ObjectName?threadpoolObjName?=?new?ObjectName(??????????????????????"Catalina:type=ThreadPool,*");??????????????Set<ObjectName>?s2?=?mbsc.queryNames(threadpoolObjName,?null);??????????????for?(ObjectName?obj?:?s2)?{??????????????????System.out.println("端口名:"?+?obj.getKeyProperty("name"));??????????????????ObjectName?objname?=?new?ObjectName(obj.getCanonicalName());??????????????????System.out.println("最大線程數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"maxThreads"));??????????????????System.out.println("當(dāng)前線程數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"currentThreadCount"));??????????????????System.out.println("繁忙線程數(shù):"??????????????????????????+?mbsc.getAttribute(objname,?"currentThreadsBusy"));??????????????}????????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}??????}????????public?static?String?formatTimeSpan(long?span)?{??????????long?minseconds?=?span?%?1000;????????????span?=?span?/?1000;??????????long?seconds?=?span?%?60;????????????span?=?span?/?60;??????????long?mins?=?span?%?60;????????????span?=?span?/?60;??????????long?hours?=?span?%?24;????????????span?=?span?/?24;??????????long?days?=?span;??????????return?(new?Formatter()).format("%1$d天?%2$02d:%3$02d:%4$02d.%5$03d",??????????????????days,?hours,?mins,?seconds,?minseconds).toString();??????}??} ?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。