2009年1月14日星期三

centos-java6-tomcat5配置

在上个月的一篇博客里面提到要更新服务器,最后定到两个候选对象,debian和Centos.
后来装了一下CentOs之后觉得它作为服务器来说,确实不错,它的安装是最快的。其实作为一个服务器来说,很多东西是必须而且不要自己再去定义的,比如SSHD,iptables等等,如果用debian,那么这些东西还要自己安装,在源慢的情况之下,那么装debian就比较费时间了。虽然它有DVD下载,但是它包含的软件包实在太多,有三张DVD,也不知道自己在服务器中用到那张的;而Centos专注于服务器应用,它那一张DVD,基本就能应付了。所以从安装方面来讲,Centos还是比较好的。
另外,Centos的图形配置工具也很值得推荐,比如system-config-securitylevel等等.
对于centos5,有一点不爽就是Java,它自带的Java是GCJ1.4.2,这个肯定是要换的。很多年没有用redhat的东西,当时用redhat的时候都还没有YUM呢,所以也都忘了有jpackage这个东西,对于在redhat之类的Linux上用Java,jpackage这个东西还是不能少的,关于Java的设定,在CentOS的wiki上有一个howto,google到了,自己找到并且编译了sun-jdk-1.6.0,才满足了我的需要,当然,如果愿意直接用sun提供的self-extrac安装包也可以,我原来是以为用jpackage源rpm包自己重新编译的能够解决一些依赖问题,但是不知道为什么,tomcat5还是依赖java-gcj-1.4.2,这让我非常不爽,不知道我用CentOs的经验太少还是怎么的。所以干脆也就不用它的tomcat5的包了,改用直接下载的tomcat5的tar包。其实对于用做服务器,我尽量用服务器自己带的软件包,而不想自己加的软件包更不用提自己手工编译了,因为这样涉及到很多配置的问题。而对于tomcat的这个也是如此,自己下载tomcat包的一个优点是系统会很干净,就加一个第三方包就可以了,也没有依赖的问题,唯一不爽的就是它的自自动。关于它的自启动,有这样几种方法:
(1) 直接把start.sh放到rc.local里面,这样是最省事的方法,但是带来的问题就是是用root启动的,并且不能用启动脚本灵活的控制其起停。
(2) 自己编写脚本,在start,stop函数中调用start.sh,stop.sh来控制tomcat起停,这样也很简单,但是也存在(1)中的问题,并且没有pid创建等等,故不能实现status的功能,可以做到灵活控制启动停止了,但是还是没有做到用non-root启动的目的。在网上找的脚本编写得并不好,由于启动tomcat需要比较多的延时,所以如果不注意控制,很可能发现自动不了,或者不能重启,停止了java还是不退出等等问题。
(3) 可以把catalina.sh放到init.d里面,因为catalina.sh本身就有start,stop之类的调用方法了,当然,为了适应chconfig的要求,这个脚本要做相应的修改,添加用数字表示的启动停止顺序等,缺点同(2)
(4) 使用tomcat带的jsvc,这样可以做到non-root用户,启动到特权端口上,这个是很多人的选择,并且jsvc里面带了启动脚本实例。
(5) 使用su - user -c script方法以其他用户运行tomcat的catalina.sh,这样可以以non-root用户运行tomcat,但是不能使用特权端口。这个也需要自己编写脚本来实现自启动,为这个我专门花了两个小时把CentOS自带的tomcat5的脚本改到合适单独安装tomcat的情况,经过测试不会遇到2的问题,CentOS这个启动脚本考虑问题很周全,建议自己安装tomcat的用户根据需要自己改改。可惜blogger不能贴附件,否则我就传上来。我的需要是使用nginx做前端的反向代理,所以方案5适合我的需要。

另外,经过一天的学习和配置,对CentOS理解越多,还是觉得它在服务器环境来讲确实很不错的,完全没有我担心额外软件包的问题。关于源:mirror.be10.com这个源比较快,在cn99源down掉了之后,比我遇到的任何debian,ubuntu源都快。源也是我挑选发行版的一个重要原因。还有就是epel这个comunity的rpm库也很重要,我原来以为用nginx之类的不包含在centOS发行中的软件包需要自己编译的,google了一下之后,发现还有epel这样一个软件库,由于centos和rhel二进制兼容,因此就不用担心软件包的问题了,基本上需要的软件包在epel里面都有。安装和使用也特别简单。
tomcat5启动脚本:
#!/bin/bash
#
# tomcat5 This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat5
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.4 and JSP 2.0
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#

# commented out until the RHEL and FC daemon functions converge
# Source the function library
#if [ -r "/etc/rc.d/init.d/functions" ]; then
#. /etc/rc.d/init.d/functions
#fi

NAME="$(basename $0)"
unset ISBOOT
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
NAME="${NAME:3}"
ISBOOT="1"
fi

# For SELinux we need to use 'runuser' not 'su'
if [ -x "/sbin/runuser" ]; then
SU="/sbin/runuser"
else
SU="su"
fi

#tomcat setting
TOMCAT_CFG="/etc/tomcat/tomcat5.conf"
if [ -r "$TOMCAT_CFG" ]; then
. ${TOMCAT_CFG}
fi

SHUTDOWN_WAIT=30
# Define which connector port to use
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"

# Path to the tomcat launch script
TOMCAT_SCRIPT="${CATALINA_HOME}/bin/catalina.sh"

# Tomcat program name
TOMCAT_PROG="$NAME"

# Define the tomcat username
TOMCAT_USER="${TOMCAT_USER:-tomcat}"

# Define the tomcat log file
TOMCAT_LOG="${TOMCAT_LOG:-/var/log/tomcat/catalina.out}"

RETVAL="0"

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function checkpid() {
local i
for i in $* ; do
if [ -d "/proc/${i}" ]; then
return 0
fi
done
return 1
}

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_failure() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"FAILED"
echo -n " ]"
echo -ne "\r"
return 1
}

# remove when the RHEL and FC daemon functions converge
# (pulled from /etc/rc.d/init.d/functions)
function echo_success() {
echo -en "\\033[60G"
echo -n "[ "
echo -n $"OK"
echo -n " ]"
echo -ne "\r"
return 0
}

function parseOptions() {
options=""
#if GLOBAL VARIABLE is set, TOMCAT_CFG is optional
if [ -r "${TOMCAT_CFG}" ]; then
options="$options $(
awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
$TOMCAT_CFG
)"
fi
TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT"
}

# See how we were called.
function start() {
echo -n "Starting ${TOMCAT_PROG}: "
if [ -f "/var/lock/subsys/${NAME}" ] ; then
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$NAME process already running"
return -1
else
echo "lock file found but no process running for"
echo "pid $kpid, continuing"
fi
fi
fi
export CATALINA_PID="/var/run/${NAME}.pid"
touch $CATALINA_PID
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >> $TOMCAT_LOG 2>&1
#$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT run" #for testing
RETVAL="$?"
if [ "$RETVAL" -eq 0 ]; then
echo_success
touch /var/lock/subsys/${NAME}
else
echo_failure
fi
echo
return $RETVAL
}

function status() {
RETVAL="1"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
if checkpid $kpid 2>&1; then
echo "$0 is already running (${kpid})"
RETVAL="0"
else
echo "lock file found but no process running for pid $kpid"
fi
else
pid="$(pgrep -u tomcat java)"
if [ -n "$pid" ]; then
echo "$0 running (${pid}) but no PID file exists"
RETVAL="0"
else
echo "$0 is stopped"
fi
fi
return $RETVAL
}

function stop() {
local STOP_VERBOSE="false"
echo -n "Stopping $TOMCAT_PROG: "
if [ -f "/var/lock/subsys/${NAME}" ]; then
$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop" >> $TOMCAT_LOG 2>&1
RETVAL="$?"
if [ "$RETVAL" -eq "0" ]; then
count="0"
if [ -f "/var/run/${NAME}.pid" ]; then
read kpid < /var/run/${NAME}.pid
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nwaiting for processes $kpid to exit"
fi
sleep 1
let count="${count}+1"
done
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
if [ "$STOP_VERBOSE" = "true" ]; then
echo -n -e "\nkilling processes which didn't stop"
echo -n -e "after "
echo -n "$SHUTDOWN_WAIT seconds"
fi
kill -9 $kpid
fi
echo_success
if [ "$count" -gt "0" ]; then
echo -n -e "\n"
fi
fi
rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid
else
echo_failure
fi
fi
}


# See how we were called.
case "$1" in
start)
parseOptions
start
;;
stop)
parseOptions
stop
;;
restart)
parseOptions
stop
sleep 2
start
;;
condrestart)
if [ -f "/var/run/${NAME}.pid" ]; then
parseOptions
stop
start
fi
;;
status)
status
;;
version)
parseOptions
"${JAVA_HOME}/bin/java" \
-classpath "${CATALINA_HOME}/server/lib/catalina.jar" \
org.apache.catalina.util.ServerInfo
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart|status|version}"
exit 1
esac

exit $RETVAL

没有评论: