tomcat编译打包

编译环境

ubuntu 9  Linux ubuntu 2.6.28-11-server 
sudo strings /lib/libc.so.6 |grep GLIBC
...
GLIBC_2.9
目录:/usr/loca/src <!--more--> ###  下载包系统上的最新的tomcat版本

1.下载、安装apr

cd /usr/loca/src
sudo  wget http://apache.fayea.com//apr/apr-1.5.2.tar.gz
sudo tar -xzf apr-1.5.2.tar.gz
cd apr-1.5.2
./configure --prefix=/usr/local/apr
sudo make
sudo make install

2.下载、安装apr-util

cd /usr/local/src
sudo wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
sudo tar -xzf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --with-apr=/usr/local/apr
sudo make 
sudo make install

3.下载、安装openssl

cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
sudo tar -zxf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
./config --prefix=/usr/local/openssl -fPIC
sudo make
sudo make install
/usr/local/openssl/bin/openssl version
(OpenSSL 1.0.2k  26 Jan 2017)

确认版本信息是1.0.2k

4.下载、安装tomcat7

cd /usr/local/src
sudo wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.75/bin/apache-tomcat-7.0.75.tar.gz
sudo tar -zxf apache-tomcat-7.0.75.tar.gz
export CATALINA_HOME=/usr/local/src/apache-tomcat-7.0.75
cd apache-tomcat-7.0.75/bin
sudo tar -xzf tomcat-native.tar.gz
cd tomcat-native-1.2.10-src
./configure --with-apr=/usr/local/apr \
--with-ssl=/usr/local/openssl \
--with-java-home=$JAVA_HOME \
--prefix=$CATALINA_HOME
sudo make
sudo make install

安装完后你将会发现在 $CATALINA_HOME/lib 目录里多出 libtcnative 之类的库

ls $CATALINA_HOME/lib|grep libtcnative*
libtcnative-1.a
libtcnative-1.la
libtcnative-1.so
libtcnative-1.so.0
libtcnative-1.so.0.2.10

5.将aprlib全部复制到$CATALINA_HOME/lib

cd /usr/local/apr/lib
sudo cp -r * $CATALINA_HOME/lib

$CATALINA_HOME/bin 目录里编辑(没有的话则新建)setenv.sh 文件(这个文件用于添加 Tomcat 启动参数),增加如下两行:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

6.复制scripts和setenv.sh

将老版本的tomcat目录下的scripts文件夹全部复制到新版本

将老版本的tomcat的bin目录下面的setenv.sh复制过来

setenv.sh

LOG_BASE="/data/weblog/tomcat"
JAVA_HOME=/usr/local/java;
JRE_HOME=/usr/local/java/jre;
CATALINA_HOME=/usr/local/tomcat;
TOMCAT_USER=www-data
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib;
export LD_LIBRARY_PATH;

DNS=$(echo $CATALINA_BASE|awk -F'/' '{print $(NF)}')
LOG_DIR="$LOG_BASE/$DNS"
[ ! -d $LOG_DIR ] && mkdir -p $LOG_DIR
if [ ! -e $CATALINA_BASE/logs ]
then
        ln -s $LOG_DIR $CATALINA_BASE/logs
elif [ "$(readlink $CATALINA_BASE/logs)" != "$LOG_DIR" ]
then
        mv $CATALINA_BASE/logs $CATALINA_BASE/logs.bak.$(date +%F)
        ln -s $LOG_DIR $CATALINA_BASE/logs
fi

chown -R $TOMCAT_USER:$TOMCAT_USER $LOG_DIR $CATALINA_BASE/logs
CATALINA_OUT=$CATALINA_BASE/logs/catalina.log
CATALINA_PID=$CATALINA_BASE/run/tomcat.pid
JSVC_OPTS='-jvm server';
JAVA_OPTS="-Xms1024m -Xmx2048m -Duser.timezone=Asia/Shanghai -Xmn512m -XX:PermSize=192m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 "

7.以 Daemon 方式运行 Tomcat

cd /usr/local/src
cd apache-tomcat-7.0.75/bin
sudo tar -zxf commons-daemon-native.tar.gz
cd commons-daemon-1.0.15-native-src/unix
sudo ./configure --with-java=$JAVA_HOME
sudo make
#你会发现当前目录产生一个名字为  jsvc 的可执行文件,把这个文件复制到 $CATALINA_HOME/bin 目录即可。
sudo cp jsvc ../..

至此新版tomcat包打包完成

公司服务器有tomcat启动脚本 /etc/init.d/tomcat (以daemon方式启动)

#!/bin/bash
JVMAGENT="jvm_agent_aHR0cDovL3dxLnN5c29wLmR1b3dhbi5jb20v.war"
JVMAGENT_DIR="/data/webapps/jvmagent"

if [ $# -ne 2 ]  && [ $# -ne 1 ]
then
	echo "Usage: /etc/init.d/tomcat (all|xxx.yy.com)  (start|stop|restart)"
    exit 1
fi

if [ $# -eq 1 ] || [ "$1" = "all" ]
then
	for WEBAPPSDNS in $(/bin/ls /data/webapps/|grep -vE "bbb.yy.com|dragon|jvmagent")
	do
		if [ -d /data/webapps/${WEBAPPSDNS} -a "${WEBAPPSDNS}" != "" ];then
			[ -f ${JVMAGENT_DIR}/${JVMAGENT} ] || (mkdir -p ${JVMAGENT_DIR} && cd ${JVMAGENT_DIR} && wget http://wq.sysop.duowan.com/${JVMAGENT} > /dev/null 2>&1)
			[ -L /data/webapps/${WEBAPPSDNS}/.${JVMAGENT} ] || ln -s ${JVMAGENT_DIR}/${JVMAGENT} /data/webapps/${WEBAPPSDNS}/.${JVMAGENT}
		fi
	done

	[ $# -eq 1 ] && ACTION=$1 || ACTION=$2
	for DNS in $(/bin/ls -d /data/services/tomcat_base/*/ |awk -F'/' '{print $(NF-1)}')
	do
		$0 $DNS $ACTION
	done
	exit 0
fi

CATALINA_HOME=/usr/local/tomcat
CATALINA_BASE=/data/services/tomcat_base/$1
PID_FILE="$CATALINA_BASE/run/tomcat.pid"
[[ $( sed -r '/[[:space:]]*<!--/,/-->[[:space:]]*$/d' $CATALINA_BASE/conf/server.xml | egrep '^[[:space:]]*<Connector.*port=.*protocol="HTTP/1.1"|^[[:space:]]*<Connector.*port=.*protocol="org.apache.coyote.http11.Http11NioProtocol"' ) =~ (.*)port=\"(.*)\"\ protocol=(.*) ]]
PORT="${BASH_REMATCH[2]}"
[[ ".$PORT" == "." ]] || [[ "$PORT" -le 8080 ]] ||[[ "$PORT" -gt 8100 ]] &&  { echo -e "\nPORT in  conf server.xml WRONG.\n";exit 3; }

case "$2" in
start)
	if [ ! -f $PID_FILE ] || ! ps -p $(cat $PID_FILE) >/dev/null 2>&1 && ! netstat -tln|awk '{print $4}'|cut -d: -f 2|grep -wq $PORT
	then
    	/usr/local/tomcat/bin/daemon.sh --catalina-base  $CATALINA_BASE start
		STATUS=$?
		sleep 5
		netstat -tln|awk '{print $4}'|cut -d: -f 2|grep -wq $PORT && STATUS=0
		[ $STATUS -eq 0 ] && touch $CATALINA_BASE/run/auto_restart_when_stop
		if [ "$1" != "bbb.yy.com" -o "$1" != "dragon" -o "$1" != "jvmagent" ];then
			[ -f ${JVMAGENT_DIR}/${JVMAGENT} ] || (mkdir -p ${JVMAGENT_DIR} && cd ${JVMAGENT_DIR} && wget http://wq.sysop.duowan.com/${JVMAGENT} > /dev/null 2>&1)
			[ -L /data/webapps/$1/.${JVMAGENT} ] || ln -s ${JVMAGENT_DIR}/${JVMAGENT} /data/webapps/$1/.${JVMAGENT}
		fi
	else
		echo -en "\n Tomcat $1 already running!\n\n"
		STATUS=254
	fi
    ;;
stop)
    /usr/local/tomcat/bin/daemon.sh --catalina-base  $CATALINA_BASE stop
	sleep 5
	netstat -tln|awk '{print $4}'|cut -d: -f 2|grep -wq $PORT && kill $(ss -tlnp|grep  -w $PORT|awk -F',' '{print $(NF-1)}')
	sleep 3
	! netstat -tln|awk '{print $4}'|cut -d: -f 2|grep -wq $PORT  && /bin/rm -f $CATALINA_BASE/run/auto_restart_when_stop && STATUS=0 || STATUS=2
    ;;
force-stop)
	PID=$(cat $PID_FILE)
	kill -9 $PID $(ps --no-headers --format='ppid' $PID) &&	/bin/rm -f $CATALINA_BASE/run/auto_restart_when_stop 
	test $? -eq 0 && STATUS=0 || STATUS=3
	;;
restart)
	$0 $1 stop
	STATUS=$?
	if [ $STATUS -eq 0 ] || [ $STATUS -eq 255 ]
	then
		sleep 5
    	$0 $1 start
		STATUS=$?
	fi
    ;;
status)
	if [ ! -f $PID_FILE ] 
	then
		echo "tomcat pid file not exsit, $1 not running."
		exit 1
	elif [ ! ps -p $(cat $PID_FILE) >/dev/null 2>&1 ]
	then
		echo "tomcat pid file exsist, but process not exits, $1 not running."
		echo "removing tomcat pid file: $PID_FILE"
		rm -fv $PID_FILE
		exit 1
	else
		exit 0
	fi
	;;

*)
	echo "Usage: /etc/init.d/tomcat (all|xxx.yy.com) (start|stop|force-stop|restart|status)"
	exit 1
esac

case $STATUS in
0)
	echo "DONE."	
	;;
1)
	echo -en "\nFAILED TO START TOMCAT $1 ! STATUS= $STATUS \n\n"
	;;
2)
	echo -en "\nFAILED TO STOP TOMCAT $1 ! STATUS= $STATUS \n\n"
	;;
3)
	echo -en "\nFAILED TO FORCE STOP TOMCAT $1 ! STATUS= $STATUS \n\n"
	;;
esac

exit $STATUS

在包系统安装或升级tomcat (安装不会删除老版本,删除老的tomcat版本后,会停止tomcat实例,所以卸载老版本后需要在包系统启动; 升级则会删除老版本并且重启实例)

现在重新启动 Tomcat 服务就会自动应用上 APR 连接器了,检验的方法也很简单,查看 Tomcat 的日志输出文件(位于 $CATALINA_HOME/logs)catalina.log,如果发现有如下标有红色字的行即表示 APR 已经应用成功:

sudo /etc/init.d/tomcat bbb.yy.com restart
cd /data/weblog/tomcat/bbb.yy.com
cat cat catalina.log|grep -C 5 apr

INFO: Deployment of web application directory /data/webapps/bbb.yy.com/ROOT has finished in 73 ms
Mar 10, 2017 12:19:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8081"]
Mar 10, 2017 12:19:56 PM org.apache.catalina.connector.MapperListener findDefaultHost
WARNING: Unknown default host [localhost] for connector [Connector[HTTP/1.1-8081]]
Mar 10, 2017 12:19:56 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8021"]
Mar 10, 2017 12:19:56 PM org.apache.catalina.connector.MapperListener findDefaultHost
WARNING: Unknown default host [localhost] for connector [Connector[AJP/1.3-8021]]
Mar 10, 2017 12:19:56 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1798 ms

潜龙发布的tomcat项目,CATALINA_BASE是/data/services/tomcat_base/$DNS,里面也有setenv.sh CATALINA_HOME是/usr/local/tomcat(这是个软链接,链接至最新的tomcat版本)