您的位置:首页 > 运维架构 > Tomcat

VisualVM远程监控配置+Tomcat apr 安装+Tomcat 启动脚本

2013-12-19 21:51 691 查看
最近要上线一个项目,需要在 Linux 服务器上安装 Tomcat 并进行一系列配置,以实现三个目标:通过 VisualVM 远程监控、Tomcat 使用 apr 模式、Tomcat 自启动。

作为一个 Linux 菜鸟,之前只是简单体验过 Linux 的操作,很多功能都是浅尝辄止。如今要在短期内完成这些目标,不得不说一把辛酸泪啊,其中的艰辛不言而喻。当然,主要是自己的功力不足,还需深入。这一周以来,查看了很多网上的资料,有很多雷同内容,而且并没有做出进一步的解释,按照这些步骤配置怎么也不成功,肯定有很多细节没有注意到,于是只好自己慢慢摸索。在结合了众多资料以及自我探索后,在当前环境下终于都配置成功了,在此把过程记录在这里,权当自己的学习日记了。里面有些内容可能很简单,高手勿喷。

一 . 测试环境:

1、服务器:VirtualBox 虚拟机下 CentOS6.4 x86

2、客户机:Windows7 x64

3、JDK:jdk1.7.0_45

4、Tomcat:apache-tomcat-7.0.47

5、监控工具:VisualVM1.3.6(这是从官网另外下载的,也可以使用 JDK 自带的,在 J***A_HOME/bin 目录下)

二 . 环境准备及说明

1、安装好 VirtualBox 虚拟机以及 CentOS 系统,值得注意的是,虚拟机的网络连接方式一定要选择“桥接”,否则远程监控的时候会连不上;(因为这个浪费了不少时间o(╯□╰)o)

2、安装好 Linux 下的 JDK、Tomcat 并配置好相关环境变量,我的机器里 J***A_HOME=/usr/local/jdk1.7.0_45 CATALINA_HOME=/usr/local/apache-tomcat-7.0.47;

3、VisualVM 下载好相关插件,我只下载了 VisualGC 和 MBeans;

4、建议配置远程监控时,先关闭服务器防火墙,远程连接配置成功后,再进行防火墙的相关配置并开启,这里客户机 IP 假设为 11.22.33.44;

5、任何新建文件在使用前,都应先赋权限

三 . 配置 VisualVM 远程监控 —— Jstatd 模式

VisualVM 远程监控可以用两种模式,分别为 Jstatd 和 JMX ,其中 Jstatd 能自动检测被监控服务器上的所有 J***A 应用程序,而且能使用 VisualGC ,但是由很多其他插件无法使用,如 MBeans;而 JMX 可以使用很多 VisualVM 提供的插件,当 Jstatd 和 JMX 同时启用时,在 JMX 连接下也能看到 VisualGC ,所以推荐同时使用。

配置 Jstatd 相对比较简单,一定要先把防火墙关掉!!!(在这里又浪费了不少时间,菜鸟伤不起 o(╯□╰)o)

1、在 /usr/local/jdk1.7.0_45/bin 目录下新建文件,命名为 jstatd.all.policy(名字可以自己起,后缀一定要是 .policy),该文件是启动 jstatd 时所采用的安全策略文件,若没有指定安全策略,会出现“Could not create remote objectaccess denied”错误;

2、在新建的 jstatd.all.policy 文件下添加如下内容:

grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};

& 注:这里的 java.home 不一定是 J***A_HOME 目录,而是 JRE 目录;

3、给 jstatd.all.policy 文件赋权限,我用的是 chmod 755 jstatd.all.policy ;

4、在 /etc/hosts 文件中设置 localhost IP 地址和 hostname 的映射,设置完后用 hostname -i查看,要和本机真实 IP 地址一致(用ifconfig 查看);

5、在终端执行以下命令启动 jstatd :

jstatd -J-Djava.security.policy = /usr/local/jdk1.7.0_45/bin/jstatd.all.policy
& 注:这里最好如上述命令指明绝对路径,否则可能由于找不到该安全策略文件,仍然报“Could not create remote objectaccess denied”错;

6、是否启动成功可以通过在终端输入 jps 命令查看,若有 Jstatd 则表示已经启动成功;

7、启动 jstatd 时还可以开启日志功能,同时可以通过 -p 参数指定端口(默认为1099):

-J-Djava.rmi.server.logCalls=true
& 注:未启用日志功能时,即便 jstatd 开启成功,在终端也不会有任何反应(开始以为卡了。。。默哀),此外,jstatd 开启时需要监听两个端口,除了默认的1099 或者指定的端口外,还需要监听一个,这个端口是随机的,而且建立连接时优先用随机的那个端口,我也没弄清楚到底是怎么回事,所以才建议先关闭防火墙;

8、上述配置均在服务器上,接下来在 VisualVM 中建立远程连接,右击“远程” -> 添加远程主机 -> 键入主机 IP -> 确定,若先前配置成功,应该能看到 Jstatd 连接,若在启动 jstatd 时自定义了端口号,则需要在添加远程主机时,在“高级设置”中指定对应端口;

9、添加防火墙白名单,在 /etc/sysconfig/iptables 中添加如下条目:

-A INPUT -p tcp -m state --state NEW -m tcp -s 11.22.33.44 -j ACCEPT
& 注:Jstatd 采用的是 TCP 协议,这里允许来自 11.22.33.44 上的所有访问通过,添加在 22 端口后面,保存后终端执行 service iptables restart重启防火墙,重启 jstatd 服务后,在 VisualVM 中能看到,至此 Jstatd 模式配置完毕;

10、安全策略还有其他配置方式,比如将 permission java.security.AllPermission;
添加到 /usr/local/jdk1.7.0_45/jre/lib/security/java.policy 中,或是采用如下的 jstatd.sh 文件:

#!/bin/sh
policy=${HOME}/.jstatd.all.policy
[ -r ${policy} ] || cat >${policy} <<'POLICY'
grant codebase "file:${java.home}/../lib/tools.jar" {
  permission java.security.AllPermission;
};
POLICY

jstatd -J-Djava.security.policy=${policy}
#-J-Djava.rmi.server.logCalls=true

& 注:不建议将安全策略添加到 java.policy 中。

四 . 配置 VisualVM 远程监控 —— JMX 模式

JMX 模式的配置相对麻烦一点,具体如下:

1、在/usr/local/apache-tomcat-7.0.47/conf/server.xml中找到Listener相关部分,在后面加上如下语句:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
& 注:这里的 10001 端口就是之后 JMX 连接需要提供的端口;

2、在/usr/local/apache-tomcat-7.0.47/bin/catalina.sh中添加如下语句:

CATALINA_OPTS="-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false"
& 注:这行参数的意思是:使用指定的 jmxremote.password 和 jmxremote.access 控制访问权限,并禁用 ssl 连接。此外,这里还可以使用J***A_OPTS 代替CATALINA_OPTS,如果使用则一定要在其前面加上“export”,否则Tomcat 7 不识别 J***A_OPTS 参数。另外这里的 $CATALINA_HOME 最好换成绝对路径,否则在后面应用
Tomcat 启动脚本启动时,会因为找不到 jmxremote.password 和jmxremote.access 这两个文件而启动失败。还有,网上说 CATALINA_OPTS 和 J***A_OPTS 这两个参数没有什么区别,配任何一个都可以,实际上在 catalina.sh 文件的注释里面已经讲得很清楚了,CATALINA_OPTS 是只针对于 Tomcat 自身,有很多限制,而 J***A_OPTS 则使用范围更广,可以配一些 CATALINA_OPTS 里没有的参数,这里因为只需要监控 Tomcat
所以选择 CATALINA_OPTS。

3、到/usr/local/jdk1.7.0_45/jre/lib/management 下找到 jmxremote.access jmxremote.password.template 文件,并复制到/usr/local/apache-tomcat-7.0.47/conf/ 文件夹下,注意将 jmxremote.password.template
的“.template”去掉。别忘了分别给两个文件赋权限 chmod 600。然后分别打开两个文件做如下修改:

jmxremote.password:注释掉所有原本信息,在最后添加“Username password”,即 VisualVM 的登录用户名和密码;

jmxremote.access:注释掉所有原本信息,在最后添加“Username readwrite”,即控制相应登录用户的权限;

4、防火墙设置(由于先前配置 Jstatd 的时候已经设置好了,故这里可以略过);

5、到 http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.47/bin/extras/ 下载 catalina-jmx-remote.jar文件,并放入/usr/local/apache-tomcat-7.0.47/lib
中;

6、在 VisualVM 中右击刚才建立的远程电脑,添加 JMX 连接,这里需要输入端口号,即刚才配置监听的 10001
端口,直接在冒号后面加就行,直接点确定后,若弹出输入用户名密码的对话框,则说明已经配置成功。如果同时开着 Jstatd,则在 JMX 连接里,也可以看到 VisualGC 的内容。

五 . Tomcat 安装 apr

在 Linux 中,Tomcat 默认是以 bio 模式启动,如果需要更多的并发,则需要启用 apr 模式。可以通过 /usr/local/apache-tomcat-7.0.47/logs/catalina.out日志文件来查看Tomcat 的启动模式。安装 apr 需要通过如下步骤:

1、安装或更新GCC:yum install gcc;

2、安装 libtool:yum install libtool;

3、安装 apr-devel:yum -y install apr apr-devel(安装完后,会在/usr/bin/ 目录下出现apr-1-config);

4、解压 /usr/local/apache-tomcat-7.0.47/bin 目录下的 tomcat-native.tar.gz

5、进入/usr/local/apache-tomcat-7.0.47/bin/tomcat-native-1.1.29-src/jni/native 目录,在终端执行以下命令:

./configure --with-apr=/usr/bin/apr-1-config --with-java-home=$J***A_HOME --with-ssl=yes --prefix=$CATALINA_HOME

& 注:若不需要 ssl 可以去掉 --with-ssl=yes 参数,配置 ssl 需要另外安装 openssl-devel。

6、执行 make 命令;

7、执行 make install 命令;

8、出现如下信息后,说明 lib 编译安装成功:

----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/apache-tomcat-7.0.47/lib
9、在 catalina.sh 中设置环境变量,指定 Tomcat 启动的 lib,添加如下内容:

CATALINA_OPTS="-Djava.library.path=/usr/local/apache-tomcat-7.0.47/lib"
& 注:因为之前 CATALINA_OPTS 已经有参数了,这个直接添加在后面就行;

10、启动 Tomcat ,在 catalina.out 文件中出现如下信息,说明 apr 安装成功

Dec 22, 2013 10:22:42 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.3.9.
Dec 22, 2013 10:22:42 PM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Dec 22, 2013 10:22:44 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-apr-8080"]
Dec 22, 2013 10:22:44 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-apr-8009"]
Dec 22, 2013 10:22:44 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3899 ms

& 注:如果在 catalina.out 出现“SEVERE: Failed to initialize the SSLEngine.”错误,是因为没有启动或配置 SSLEngine,如果不需要
SSLEngine,在 service.xml 文件中将其关闭即可,如下:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />


11、在 VisualVM 中,也可以通过 JMX 连接“线程”中看到 Tomcat 已经使用 apr 模式启动了。

六 . Tomcat 启动脚本

1、在 /etc/rc.d/init.d 目录下,创建名为 tomcat 的文件,内容为后述启动脚本内容;

2、为该文件赋权限;

3、在终端执行以下命令:

chkconfig --add tomcat
& 注:add 前面有两个“-”,该命令将 tomcat作为服务添加到 chkconfig中,如果出现“service tomcat does not support chkconfig”,一般是脚本内容有问题。需要注意脚本注释部分必须有 chkconfigdescription这两个关键字,其中 chkconfig 指定该脚本的默认运行级别(即在哪些条件下开机启动)、启动优先级和关闭优先级。运行级别总共有7个,分别为:

等级0表示:表示关机

等级1表示:单用户模式

等级2表示:无网络连接的多用户命令行模式

等级3表示:有网络连接的多用户命令行模式

等级4表示:没有用

等级5表示:带图形界面的多用户模式

等级6表示:重新启动

一般设置2345就行;

4、在终端执行 chkconfig --list tomcat 命令,查看 tomcat 服务是否添加成功,出现如下内容,则说明添加成功:

tomcat 0:off 1:off 2:on 3:on 4:on 5:on 6:off

5、可以执行 chkconfig --level 2345 tomcat on 修改运行级别,上一步的结果是已经修改后的。

6、启动脚本内容如下:

#!/bin/bash
#
#Tomcat Server
#
#chkconfig: 345 80 20
#description: Tomcat --Start --Stop --Restart --Status
#

export TOMCAT_HOME=/usr/local/apache-tomcat-7.0.47
export J***A_HOME=/usr/local/jdk1.7.0_45
TOMCAT_USER=tomcatadmin
RETVAL=0

checkrun(){
    ps aux|grep "org.apache.catalina.startup.Bootstrap start"|grep -v "grep"|wc -l > /tmp/tomcat_process_count.txt
    read line </tmp/tomcat_process_count.txt
#注意“[”和“]”左右都有空格,否则报错
    if [ $line -gt 0 ];then    
        RETVAL=1;
        return $RETVAL;
    else
        RETVAL=0;
        return $RETVAL;
    fi
}

start(){
    checkrun
    if [ $RETVAL -eq 0 ];then
#        cd $TOMCAT_HOME/bin 有时候运行start启动不了Tomcat,尝试将相对路径改成绝对路径
#        sh startup.sh
        su - $TOMCAT_USER -lc $TOMCAT_HOME/bin/startup.sh
#创建锁文件
        touch /var/lock/subsys/tomcat    
        echo "----------> Tomcat Start ----------[OK]"
    else
        echo "----------> Tomcat is Already Running"
    fi
}

stop(){
    checkrun
    if [ $RETVAL -eq 1 ];then
        su - $TOMCAT_USER -lc $TOMCAT_HOME/bin/shutdown.sh
        while [ $RETVAL -eq 1 ]
        do
            sleep 5
            checkrun
        done
#删除锁文件
        rm -f /var/lock/subsys/tomcat    
        echo "----------> Tomcat Stop ----------[OK]"
    else
        echo "----------> Tomcat is Not Running"
    fi
}

status(){
    checkrun
    if [ $RETVAL -eq 1 ];then
        echo -n "----------> Tomcat is Running: PID = "
        ps aux|grep "org.apache.catalina.startup.Bootstrap start"|grep -v "grep" |awk '{print $2}'
    else
        echo "----------> Tomcat is Stopped"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        stop
        start
        ;;
*)
    echo $"Usage:$0 {start|stop|status|restart}"
    exit 1
esac
exit 0


& 注:若脚本出现问题,可以尝试删除其中的中文注释,同时注意脚本的编码格式,若直接复制,有可能会出现无法预知的错误,导致脚本启动失败。此外,注意修改其中的部分环境配置为本机实际配置,其中的TOMCAT_USER 为 tomcat 的启动用户,该用户必须要在/etc/passwd 和 /etc/group 中。

7、至此,已经可以通过 service tomcat start | stop | restart | status 等命令操作 tomcat 了,而且在启动 Linux 的时候 Tomcat 也会作为服务自动启动。(脚本这块也费了很久,因为不熟悉 bash 的编程语法,这个脚本是参考了网上的一个脚本,自己做了简单的修改)

七 . 结束语

真心不容易啊,这一周都是在高压力下度过的,任务时间紧加上我这个小菜鸟的水平实在不怎么样,好不容易都搞定。虽然这个过程让人十分纠结,不过这其中也学到了不少东西,之前虽然也看过 Linux 的一部分东西,但是都没有去仔细实践过,真的自己经历了之后,才会发现这个过程的艰辛。再接下去要做的就是对 JVM 的调优了,希望项目上线的时候能顺顺利利。

备注一下:如果用 Xmanager 远程连接服务器,则默认启动 id 要设为 5,并且 hosts 文件中要有 127.0.0.1 这个地址;如果用 Xming 连接,则默认启动 id 要设为 3。

PS:写这篇东西也费不少时间 ~~~~(>_<)~~~~

转载请注明出处:/article/3650268.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: