Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password

在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w jmxremote.password ,放开角色信息那俩行的注释,保存,再使用chmod 0400 jmxremote.password

这样就是它正确的权限设置

jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template复制,去掉.template后缀

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51547408

2016年5月的最后一天,今天我将和大家分享Java中如何使用JMX来监控Tomcat的各种状态。好了,不多说了,我们直接进入主题

一、激活Tomcat的JMX远程配置

要通过JMX远程监控Tomcat,首先需要激活Tomcat的JMX远程配置。

① 修改脚本

先修改Tomcat的启动脚本,windows下为bin/catalina.bat(linux下为catalina.sh),添加以下内容,8999是jmxremote使用的端口号,第二个false表示不需要鉴权:

[plain] view plain copy

  1. 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
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

要注意以上语句的位置不能太后面,可以加在【if "%OS%" == "Windows_NT" setlocal】一句后的大段的注释后面。

参考官方说明:

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

② 鉴权

上面的配置是不需要鉴权的,如果需要鉴权则添加的内容为:

[plain] view plain copy

  1. 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
  2. set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

③ 复制并修改授权文件

$JAVA_HOME/jre/lib/management下有jmxremote.access和jmxremote.password的模板文件,将两个文件复制到$CATALINA_BASE/conf目录下
◆ 修改$CATALINA_BASE/conf/jmxremote.access 添加内容:
     monitorRole readonly
     controlRole readwrite
◆ 修改$CATALINA_BASE/conf/jmxremote.password 添加内容:
     monitorRole chenfeng
     controlRole chenfeng
注意: 如果进行了以上步骤导致Tomcat启动不了,那么很可能是密码文件的权限问题
需要修改jmxremote.password文件的访问权限,只有运行Tomcat的用户才能拥有访问权限 :
      Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户(或用户组,如果选用户不行那就选用户组),例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。
官方的提示:
      The password file should be read-only and only accessible by the operating system user Tomcat is running as.

④验证配置

重新启动Tomcat,在Windows命令行输入“netstat -a”查看配置的端口号是否已打开,如果打开,说明上面的配置成功了。

⑤ 使用jconsole测试JMX

运行$JAVA_HOME/bin目录下的jconsole.exe,打开J2SE监视和管理控制台,然后建立连接,如果是本地的Tomcat则直接选择然后点击连接,如果是远程的,则进入远程选项卡,填写地址、端口号、用户名、口令即可连接。。Mbean属性页中给出了相应的数据,Catalina中是tomcat的,java.lang是jvm的。对于加粗的黑体属性值,需双击一下才可看内容。

二、使用JMX监控Tomcat示例代码

[java] view plain copy

  1. String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";
  2. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
  3. Map map = new HashMap();
  4. // 用户名密码,在jmxremote.password文件中查看
  5. String[] credentials = new String[] { "monitorRole", "tomcat" };
  6. map.put("jmx.remote.credentials", credentials);
  7. JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
  8. MBeanServerConnection mbsc = connector.getMBeanServerConnection();
  9. // 端口最好是动态取得
  10. ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");
  11. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
  12. // tomcat的线程数对应的属性值
  13. String attrName = "currentThreadCount";
  14. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
  15. System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));

三、完整的示例代码文件

[java] view plain copy

    1. import java.lang.management.MemoryUsage;
    2. import java.text.SimpleDateFormat;
    3. import java.util.Date;
    4. import java.util.Formatter;
    5. import java.util.HashMap;
    6. import java.util.Iterator;
    7. import java.util.Map;
    8. import java.util.Set;
    9. import javax.management.MBeanAttributeInfo;
    10. import javax.management.MBeanInfo;
    11. import javax.management.MBeanServerConnection;
    12. import javax.management.ObjectInstance;
    13. import javax.management.ObjectName;
    14. import javax.management.openmbean.CompositeDataSupport;
    15. import javax.management.remote.JMXConnector;
    16. import javax.management.remote.JMXConnectorFactory;
    17. import javax.management.remote.JMXServiceURL;
    18. /**
    19. * @author liuyazhuang
    20. * @date 2016-05-31
    21. */
    22. public class JMXTest {
    23. /**
    24. * main方法
    25. * @param args
    26. */
    27. public static void main(String[] args) {
    28. try {
    29. String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";
    30. JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
    31. Map map = new HashMap();
    32. String[] credentials = new String[] { "monitorRole", "tomcat" };
    33. map.put("jmx.remote.credentials", credentials);
    34. JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
    35. map);
    36. MBeanServerConnection mbsc = connector.getMBeanServerConnection();
    37. // 端口最好是动态取得
    38. ObjectName threadObjName = new ObjectName(
    39. "Catalina:type=ThreadPool,name=http-8080");
    40. MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
    41. String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
    42. MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
    43. System.out.println("currentThreadCount:"
    44. + mbsc.getAttribute(threadObjName, attrName));
    45. // heap
    46. for (int j = 0; j < mbsc.getDomains().length; j++) {
    47. System.out.println("###########" + mbsc.getDomains()[j]);
    48. }
    49. Set MBeanset = mbsc.queryMBeans(null, null);
    50. System.out.println("MBeanset.size() : " + MBeanset.size());
    51. Iterator MBeansetIterator = MBeanset.iterator();
    52. while (MBeansetIterator.hasNext()) {
    53. ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator
    54. .next();
    55. ObjectName objectName = objectInstance.getObjectName();
    56. String canonicalName = objectName.getCanonicalName();
    57. System.out.println("canonicalName : " + canonicalName);
    58. if (canonicalName
    59. .equals("Catalina:host=localhost,type=Cluster")) {
    60. // Get details of cluster MBeans
    61. System.out.println("Cluster MBeans Details:");
    62. System.out
    63. .println("=========================================");
    64. // getMBeansDetails(canonicalName);
    65. String canonicalKeyPropList = objectName
    66. .getCanonicalKeyPropertyListString();
    67. }
    68. }
    69. // ------------------------- system ----------------------
    70. ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
    71. System.out.println("厂商:"
    72. + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
    73. System.out.println("程序:"
    74. + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
    75. System.out.println("版本:"
    76. + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
    77. Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
    78. "StartTime"));
    79. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    80. System.out.println("启动时间:" + df.format(starttime));
    81. Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
    82. System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));
    83. // ------------------------ JVM -------------------------
    84. // 堆使用率
    85. ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
    86. MemoryUsage heapMemoryUsage = MemoryUsage
    87. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
    88. "HeapMemoryUsage"));
    89. long maxMemory = heapMemoryUsage.getMax();// 堆最大
    90. long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
    91. long usedMemory = heapMemoryUsage.getUsed();
    92. System.out.println("heap:" + (double) usedMemory * 100
    93. / commitMemory + "%");// 堆使用率
    94. MemoryUsage nonheapMemoryUsage = MemoryUsage
    95. .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
    96. "NonHeapMemoryUsage"));
    97. long noncommitMemory = nonheapMemoryUsage.getCommitted();
    98. long nonusedMemory = heapMemoryUsage.getUsed();
    99. System.out.println("nonheap:" + (double) nonusedMemory * 100
    100. / noncommitMemory + "%");
    101. ObjectName permObjName = new ObjectName(
    102. "java.lang:type=MemoryPool,name=Perm Gen");
    103. MemoryUsage permGenUsage = MemoryUsage
    104. .from((CompositeDataSupport) mbsc.getAttribute(permObjName,
    105. "Usage"));
    106. long committed = permGenUsage.getCommitted();// 持久堆大小
    107. long used = heapMemoryUsage.getUsed();//
    108. System.out.println("perm gen:" + (double) used * 100 / committed
    109. + "%");// 持久堆使用率
    110. // -------------------- Session ---------------
    111. ObjectName managerObjName = new ObjectName(
    112. "Catalina:type=Manager,*");
    113. Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
    114. for (ObjectName obj : s) {
    115. System.out.println("应用名:" + obj.getKeyProperty("path"));
    116. ObjectName objname = new ObjectName(obj.getCanonicalName());
    117. System.out.println("最大会话数:"
    118. + mbsc.getAttribute(objname, "maxActiveSessions"));
    119. System.out.println("会话数:"
    120. + mbsc.getAttribute(objname, "activeSessions"));
    121. System.out.println("活动会话数:"
    122. + mbsc.getAttribute(objname, "sessionCounter"));
    123. }
    124. // ----------------- Thread Pool ----------------
    125. ObjectName threadpoolObjName = new ObjectName(
    126. "Catalina:type=ThreadPool,*");
    127. Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
    128. for (ObjectName obj : s2) {
    129. System.out.println("端口名:" + obj.getKeyProperty("name"));
    130. ObjectName objname = new ObjectName(obj.getCanonicalName());
    131. System.out.println("最大线程数:"
    132. + mbsc.getAttribute(objname, "maxThreads"));
    133. System.out.println("当前线程数:"
    134. + mbsc.getAttribute(objname, "currentThreadCount"));
    135. System.out.println("繁忙线程数:"
    136. + mbsc.getAttribute(objname, "currentThreadsBusy"));
    137. }
    138. } catch (Exception e) {
    139. e.printStackTrace();
    140. }
    141. }
    142. public static String formatTimeSpan(long span) {
    143. long minseconds = span % 1000;
    144. span = span / 1000;
    145. long seconds = span % 60;
    146. span = span / 60;
    147. long mins = span % 60;
    148. span = span / 60;
    149. long hours = span % 24;
    150. span = span / 24;
    151. long days = span;
    152. return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
    153. days, hours, mins, seconds, minseconds).toString();
    154. }
    155. }
时间: 2024-10-13 16:29:57

Error: Password file read access must be restricted: /etc/cassandra/jmxremote.password的相关文章

Oracle中password file的作用及说明 orapwd命令的使用

在数据库没有启动之前,数据库内建用户是无法通过数据库来验证身份的 口令文件中存放sysdba/sysoper用户的用户名及口令允许用户通过口令文件验证,在数据库未启动之前登陆从而启动数据库 如果没有口令文件,在数据库未启动之前就只能通过操作系统认证. 使用Rman,很多时候需要在nomount,mount等状态对数据库进行处理所以通常要求sysdba权限如果属于本地DBA组,可以通过操作系统认证登陆如果是远程sysdba登陆,需要通过passwordfile认证. 1.remote_login_

phpMyAdmin提示“Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)”的解决办法

一.错误内容 在用thinkPHP登陆phpMyAdmin时遇到以下错误 #1045 - Access denied for user 'root'@'localhost' (using password: NO) phpMyAdmin 试图连接到 MySQL 服务器,但服务器拒绝连接.您应该检查 config.inc.php 中的主机.用户名和密码,并且确定这些信息与 MySQL 服务器的管理员所给出的信息一致. 二.解决方法如下: 打开C:\wamp\apps\phpmyadmin4.1.1

Linux mysql 5.6: ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)

最近操作mysql 5.6, 出现了以下问题. 分享,感谢原著: 案例环境: 操作系统 :Red Hat Enterprise Linux Server release 5.7 (Tikanga) 64 bit 数据库版本 : Mysql 5.6.19 64 bit 案例介绍: 今 天开始学习mysql,遂先安装了Mysql 5.6.19 64bit 版本的数据库,结果安装成功了,但是使用root登录时遇到了ERROR 1045 (28000): Access denied for user '

Linux mysql 5.7: ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)

环境:mac10.12 来源:http://www.cnblogs.com/kerrycode/p/3861719.html 使用root登录时遇到了ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)错误. 如下所示 [[email protected] tmp]# rpm -ivh MySQL-server-5.6.19-1.rhel5.x86_64.rpm Preparing..

【转载】 ERROR 1045 (28000): Access denied for user [email&#160;protected] (using password: NO)

来自:http://www.jb51.net/LINUXjishu/10981.html 错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied for user的错误.删除user.user中值为NULL的,或更新NULL为test 1)delete from user where user is NULL 2)update user set user='test' where user is NULL.意外的情况: 如果上述方

ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)

在安装好的MySQL服务器上,配置了环境变量之后,发现用mysql无法登录,报如题的错误,实在没有办法,决定用安全模式对root用户修改密码: 首先在一个ssh窗口运行命令:mysqld_safe --user=mysql --skip-grant-tables --skip-networking& [[email protected] ~]# mysqld_safe --user=mysql --skip-grant-tables --skip-networking& 运行之后新打开一个

Mac Mysql mysql_secure_installation Error: Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

mysql由brew安装, 期间好像自动更新了一次 然后再次执行mysql_secure_installation, 输入root密码后报错, 重装mysql还是不行 Error: Access denied for user 'root'@'localhost' (using password: YES) 原因是之前安装的mysql配置文件没有彻底清除 参照 http://stackoverflow.com/questions/4359131/brew-install-mysql-on-mac

Mac下解决mysql ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

Maybe updating the package the updater overwrote the root password. To restore it: Stop mysqld deamons. $ sudo service mysqld stop Go to mysql/bin directory $ cd /usr/bin Start a mysql deamon with this option: $ sudo mysqld_safe --skip-grant-tables O

ERROR 1045 (28000): Access denied for user &#39;hive&#39;@&#39;localhost&#39; (using password: YES)

[[email protected] native]# mysql -uhive -pEnter password: ERROR 1045 (28000): Access denied for user 'hive'@'localhost' (using password: YES)[[email protected] native]# mysql -uroot -pEnter password: Welcome to the MySQL monitor.  Commands end with