为了监控服务器上tomcat的内存使用情况,用本地jconsole远程连接linux中的tomat。有不需要输入用户名密码 和 需要输入用户名密码 两种配置。
一、不需要输入用户名密码
1、在tomcat安装目录下的/bin/catalina.sh中添加JAVA_OPTS参数设置:
1. JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:+UseConcMarkSweepGC" 2. JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.21.55" 3. JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
第一行的JAVA_OPTS是配置jvm参数用的。与jconsole远程无关。但是因为配了这个参数,遇到一点问题,参看 注意1。
第二行的JAVA_OPTS是配置远程hostname。
第三行的JAVA_OPTS配置远程的端口号和是否开启认证以及是否开启ssl验证。不需要要输入用户名密码的配置是把 authenticate 配置为false。
二、需要输入用户名密码
1、在tomcat安装目录下的/bin/catalina.sh中添加JAVA_OPTS参数设置:
1. JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:+UseConcMarkSweepGC" 2. JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.21.55" 3. JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false" 4. JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=/usr/local/java/jdk1.8.0_151/jre/lib/management/jmxremote.access -Dcom.sun.management.jmxremote.pwd.file=/usr/local/java/jdk1.8.0_151/jre/lib/management/jmxremote.password"
第三行的JAVA_OPTS中配置 -Dcom.sun.management.jmxremote.authenticate=true。
第四行的JAVA_OPTS配置了认证的权限和用户名密码。两个参数指定的路径需要配对。jconsole远程登录的时候,输入ip:端口号即可,不用输入用户名密码。
2、进入jdk安装目录下的/jre/lib/management。
(1)编辑jmxremote.access文件,页面最后的几行解开注释。
(2)编辑jmxremote.password文件,页面最后两行解开注释。它们是两套用户名密码。当-Dcom.sun.management.jmxremote.authenticate=true的时候,可以用这两套来登录。 这两套用户名的权限不一样。monitorRole只能读,controlRole能读写。
若此目录下没有jmxremote.password,而有jmxremote.password.template。它们是一样的。上一步第四行配置指向它也可以。
(3)设置jmxremote.access和jmxremote.password两个文件的权限为600。命令为:
chmod 600 jmxremote.access jmxremote.password
三、 配置结束,启动tomcat,用本地jconsole远程连接:
运行窗口中输入jconsole,界面中选远程连接。输入ip:端口号。ip为linux的ip,端口号为第一步中第三行JAVA_OPTS中配置的端口号,这里是9004。这是使用用户名密码连接的方式。还可不使用用户名密码登录。
登录界面:
两种方式连接成功图:
注意1:
若你的jdk是1.8及以上版本,配置jvm参数时,不能使用-XX:PermSize=64M -XX:MaxPermSize=256m,因为从jdk1.8起,永久区Perm已经被元空间Metaspace取代。设置参数改为了:MaxMetaspaceSize。详细了解:( http://caoyaojun1988-163-com.iteye.com/blog/1969853 )
注意2:
-Djava.rmi.server.hostname=192.168.21.55,这个hostname要配置为tomcat所在机器的ip地址。
总结:
在趟坑,解决问题的过程中。最重要的收获就是,想知道问题出在哪儿的时候,就去看日志。
看日志,看日志,看日志,重要的事情说三遍。
/*************************************问题系列**********************************************/
问题系列:
在解决的过程中遇到的问题以及使用的命令,顺带记录下来吧。若你我某天又遇到这个问题想不起来的时候还可以参考参考。
在修改配置后,启动tomcat的阶段,就因为对linux不熟,而出现了一系列问题。
在成功的前一刻才翻到一个同样趟了很多坑的道友的文章,传送门在此:(http://www.linuxidc.com/Linux/2015-02/113420.htm)
有一篇比较简洁的介绍jmxRemote与jconsole通过jmxremote连接tomcat的文章: (https://geekflare.com/enable-jmx-tomcat-to-monitor-administer/)
启动不了1:
查看日志:转到/usr/local/tomcat/logs目录下,用tail -f catalina.out命令。
检查到端口占用,原来两个tomcat端口配重了。
编辑/usr/local/tomcat/conf/server.xml,修改端口,重新启动。
启动不了2:
查看日志:看到新增的配置有几个问号。比如,第一行端口号9004后边有'?',删掉它,再启动。
启动不了3:
出现ignoring option MaxPermSize=256m;support was removed in 8.0等
这就是文章上面提到的注意1 中的内容。去掉maxPermSize和PermSize两个参数设置,继续启动。
启动不了4:
还有问题:Unrecongnized option: -
检查catalina.sh,有参数配置不小心 -Dcom.sun.management.jmxremote.authenticate=false 的 -和后边的字母之间多了一个空格,致使参数不完整了。删掉空格,重新启动。
启动不了5:
Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: nodename.domainname: nodename.domainname: Name or service not known
无法识别的主机名:nodename.domainname:
这个主机名是我在/etc/hostname文件中配置的,经查询,/etc/hostname和/etc/hosts两个文件的作用一致。linux是CentOS7.0,默认的有/etc/hosts文件。因此我又把/etc/hostname文件给删掉了。在/etc/hosts和/etc/sysconfig/network中配置了主机名。关于主机名的配置请参照(https://jingyan.baidu.com/article/574c52192a1d8d6c8d9dc1ce.html ) 想了解/etc/hosts的作用,请进传送门( http://os.51cto.com/art/200803/68170.htm )
配置好hostname之后,再启动tomcat。终于启动成功了。