Tomcat7.0安装与配置

Linux系统 gongyj 1257℃ 已收录 0评论

Tomcat 的7引入了许多新功能,并对现有功能进行了增强。很多文章列出了 Tomcat 7 的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例。tomcat6 与 tomcat7 安装和配置基本一样,但是配置管理员等信息有些不一样,在 ${CATALINA_HOME}/conf/tomcat-users.xml 中用户角色和管理员角色都要加上 -gui,别的地方没什么区别。

tomcat7.png

Tomcat 7 的变化分为两个部分,分别是”TOMCAT 7 的新特性”和“TOMCAT 7 增强的功能“。
  TOMCAT 7 新特性 :
  1 、使用随机数去防止跨站脚本攻击。
  2 、改变了安全认证中的jessionid的机制,防止session攻击。
  3、 内存泄露的侦测和防止
  4 、在war文件外使用别名去存储静态内容。
  TOMCAT 7的增强功能:
  5、 对Servlet 3.0,JSP 2.2和JSP-EL 2.2的支持
  6 、更容易将Tomcat内嵌到应用去中去,比如JBoss
  7 、异步日志记录
根据 Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。
前面介绍了这么多的新特性,下面开始介绍 一下 Tomcat7 安装与配置。
一、准备工作

首先从官方网站下载你需要的 Tomcat 7 版本,还有 jdk 包,我们以 apache-tomcat-7.0.59.tar.gz 、jdk-7u79-linux-x64.gz 这2个版本为例。

接下来检查系统,卸载掉系统自带的 openjdk 包:

[root@vm ~]# rpm -qa |grep openjdk
java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64
java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64
[root@vm ~]# rpm -e java-1.6.0-openjdk --nodeps
[root@vm ~]# rpm -e java-1.7.0-openjdk --nodeps

二、安装 JDK

tar xf jdk-7u79-linux-x64.gz
mv jdk1.7.0_79/ /usr/local/

配置环境变量,在 etc/profile 文件下添加

#### JDK 7 ####
JAVA_HOME=/usr/local/jdk1.7.0_79
JAVA_BIN=/usr/local/jdk1.7.0_79/bin
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

然后加载查看一下配置是否正确

[root@vm ~]# source /etc/profile
[root@vm ~]# echo $JAVA_HOME
/usr/local/jdk1.7.0_79
[root@vm ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk1.7.0_79/bin
[root@vm ~]# echo $CLASSPATH
.:/usr/local/jdk1.7.0_79/lib:/usr/local/jdk1.7.0_79/jre/lib:/usr/local/jdk1.7.0_79/lib/dt.jar:/usr/local/jdk1.7.0_79/lib/tools.jar
[root@vm ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

通过以上信息,可以知道 JDK 配置正常。

三、安装 Tomcat

1、解压 Tomcat 7 到工作目录

Tomcat 无需编译,配置环境变量,解压好后就可以直接执行

tar xf apache-tomcat-7.0.59.tar.gz
mv apache-tomcat-7.0.59.tar.gz /usr/local/tomcat7

2、配置环境变量

修改 profile 文件:

#### Tomcat 7 ####
export TOMCAT_HOME=/usr/local/tomcat7
export CATALINA_HOME=/usr/local/tomcat7
export CATALINA_BASE=/usr/local/tomcat7
export CATALINA_TMPDIR=/usr/local/tomcat7/temp

3、安装 APR 库

cd /usr/local/tomcat7/bin/
tar xf tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native
yum install -y gcc apr-devel openssl-devel
./configure --with-apr=/usr/bin/apr-1-config \
                --with-java-home=$JAVA_HOME \
                --with-ssl=yes \
                --prefix=$CATALINA_HOME
make && make install
cd /usr/local/tomcat7/bin/
rm tomcat-native-1.1.32-src/ -fr
export LD_LIBRARY_PATH=/usr/local/tomcat7/lib

现在就可以像 Tomcat 6 那样运行了。

4、日志切割

vim /etc/logrotate.d/tomcat7
/usr/local/tomcat7/logs/catalina.out {
    copytruncate
    daily
    notifempty
    dateext
    rotate 15
    #compress
    missingok
    #create 0644 leye
    postrotate
       chmod +r /usr/local/tomcat7/logs/catalina.out
    endscript
}

四、Tomcat7 配置

1、修改 Tomcat 7 字符编码

修改编码为 UTF-8 ,与 Tomcat 6 一样,修改 ${CATALINA_HOME}/conf/server.xml 文件

找到 server.xml 下面几行

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

添加一个属性:URIEncoding,将该属性值设置为UTF-8

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />

2、Tomcat 的管理页面设置

管理页面权限的配置与 Tomcat 6 略有区别,rolename 不一样了,多个一个“-gui”,配置如下:

<tomcat-users>
  <role rolename="manager-gui"/>
  <user username="tomcat" password="s3cret" roles="manager-gui"/>
</tomcat-users>

如果配置不对,就会提示没有权限,不能登录。

3、Tomcat 7 修改版本信息

想要隐藏服务器Response Header中server信息和版本号,所需操作与 Tomcat 6 一样,要修改2部分内容。

(1)修改配置文件

在 Tomcat 的 server.xml ,只需在connector中添加server属性,就可以修改成任意值了:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443"
               server="IIS Server" />
[root@vm ~]# curl -I 127.0.0.1:8080
curl -I 127.0.0.1:8080
HTTP/1.1 200 OK
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Sat, 12 Sep 2015 14:23:43 GMT
Server: IIS Server

(2)修改源代码版本信息

Tomcat 名字和版本号在 /usr/local/tomcat7/lib/catalina.jar 中

cd /usr/local/tomcat7/lib
jar xf catalina.jar
vim org/apache/catalina/util/ServerInfo.properties
server.info=CHOPMOON/1.1
server.number=1.1
server.built=May 8 2013 12:18:30 UTC
jar cvf catalina.jar org/ META-INF/
rm -fr org/ META-INF/

4、Tomcat 7 配置自启动服务

在 Tomcat 6 中,我们介绍了三种用户的启动方式,在 Tomcat 7 也是如此,利用 /etc/rc.local , su 与 runuser 实现自启动功能。现在 Tomcat 的另一种启动方式 jsvc,该方法同样适用于 Tomcat 6 。

jsvc 是在 apache 的 commons-daemon 项目下开源项目,主要功能可以使一些运行在普通用户下的 java 进程获取一些 root 权限下的权利,通过 jsvc 你除了可以以 daemon 方式运行 Tomcat 之外,还能以普通用户身份让 Tomcat 打开小于 1024(比如 80 和 443)的网络端口。1024 以下端口都是是系统保留的端口,1024 以下的网络端口只能通过 root 权限打开,从 1024-65535 是普通用户使用的,所以 jsvc 方法还是很不错的。

实现原理

在自己的java代码中,实现start, init , stop,destroy的方法,将自己的编译打成jar文件,  通过调用jsvc 来启动。

jsvc 是一个源码是c的程序,通过fork出子进程去启动java,而进程成为控制进程,可以实现监视java子进程的目地。

改变启动 java 虚拟机的进程的用户 id 和用户组,通过调用 setgid,setuid 来改变当前进程的用户 id 和组。

Tomcat 安装完后就带有这个工具的源码 ${CATALINA_HOME}/bin/commons-daemon-native.tar.gz 。按照下列命令安装这个工具:

cd /usr/local/tomcat7/bin/
useradd -r -u 91 -s /bin/false tomcat
tar xf commons-daemon-native.tar.gz
cd commons-daemon-1.0.15-native-src/unix
yum install -y gcc autoconf libcap-devel
sh support/buildconf.sh
./configure --with-java=$JAVA_HOME
make
cp jsvc ../../
cd /usr/local/tomcat7/bin/
rm -fr commons-daemon-1.0.15-native-src

make 完之后,你会发现当前目录产生一个名字为  jsvc 的可执行文件,把这个文件复制到 $CATALINA_HOME/bin 目录即可。然后还要修改一下 $CATALINA_HOME/bin/setenv.sh 文件,默认没有这个文件,创建一个就可以了。添加几个参数,如下:

#!/bin/bash
# Service-specific configuration file for tomcat7

JAVA_HOME=/usr/local/jdk1.7.0_79
JAVA_BIN=$JAVA_HOME/bin
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_BIN
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

#### tomcat7 ####
TOMCAT_HOME=/usr/local/tomcat7
CATALINA_HOME=/usr/local/tomcat7
TOMCAT_USER=tomcat
#JAVA_OPTS='-server -Djava.net.preferIPv4Stack=true'
LOGGING_CONFIG="-Dnop"      #可以不记录管理页面日志
#LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
CATALINA_OPTS="-server -Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=384m"

然后修改 Tomcat 目录的用户属组,这几个目录有权限就可以了,也可以全部授权

cd /usr/local/tomcat7
chown tomcat.tomcat -R conf/ webapps/ logs/ work/ temp/

在 $CATALINA_HOME/bin 目录下有个脚本 daemon.sh 用于以 daemon(守护程序、服务)方式运行 Tomcat,这个脚本会调用 jsvc 启用 Tomcat。

执行 $CATALINA_HOME/bin/daemon.sh 后,Tomcat 7 就启动了,我们可以看到系统中有2个进程,父进程和子进程。

[root@vm ~]# ps -ef f 
root      30851      1  0 18:36 ?        Ss     0:00 jsvc.exec -java-home /usr/local/jdk1.7.0_79 -user tomcat -pidfile /usr/local/tomcat7/logs/catalina-daemon.pid -wait 10 -outfile /usr/local/tomcat7/logs/catalina-daemon.out -errfile &1 -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/commons-daemon.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap
tomcat    30852  30851  0 18:36 ?        Sl     0:14  \_ jsvc.exec -java-home /usr/local/jdk1.7.0_79 -user tomcat -pidfile /usr/local/tomcat7/logs/catalina-daemon.pid -wait 10 -outfile /usr/local/tomcat7/logs/catalina-daemon.out -errfile &1 -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/commons-daemon.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Djava.util.logging.config.file=/usr/local/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs= -Dcatalina.base=/usr/local/tomcat7 -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/tomcat7/temp org.apache.catalina.startup.Bootstrap

Tomcat 7 本身带的 daemon.sh 脚本可以用来启动和停止 tomcat7 守护进程,但是在试验中发现该脚本无法设置为自动启动,会提示错误信息:

[root@vm ~]# cp $CATALINA_HOME/bin/daemon.sh /etc/init.d/tomcat7
[root@vm ~]# chkconfig tomcat7 on
tomcat7 服务不支持 chkconfig

因此修改了此脚本如下:

vim /etc/init.d/tomcat7
#!/bin/bash
#
# Apache-Tomcat service script    This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Author:  Created by Gong Yijie <http://blog.chopmoon.com>
# Created Time: Fri May 29 10:30:29 CST 2015
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Release implementation for Servlet 3.0 and JSP 2.2
# Short-Description: start and stop tomcat
### END INIT INFO
#

## Source function library.
. /etc/rc.d/init.d/functions

prog=Tomcat7
CATALINA_HOME=/usr/local/tomcat7

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

# Set -pidfile
PID_FILE=/var/run/jsvc.pid
#test ".$CATALINA_PID" = . && CATALINA_PID="$CATALINA_BASE/logs/catalina-daemon.pid"

# Setup parameters for running the jsvc
#
test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat

# Set JAVA_HOME to working JDK or JRE
# JAVA_HOME=/var/local/jdk-1.7.0.22
# If not set we'll try to guess the JAVA_HOME
# from java binary if on the PATH
#
if [ -z "$JAVA_HOME" ]; then
    JAVA_BIN="`which java 2>/dev/null || type java 2>&1`"
    test -x "$JAVA_BIN" && JAVA_HOME="`dirname $JAVA_BIN`"
    test ".$JAVA_HOME" != . && JAVA_HOME=`cd "$JAVA_HOME/.." >/dev/null; pwd`
else
    JAVA_BIN="$JAVA_HOME/bin/java"
fi

# Only set CATALINA_HOME if not already set
test ".$CATALINA_HOME" = . && CATALINA_HOME=`cd "$DIRNAME/.." >/dev/null; pwd`
test ".$CATALINA_BASE" = . && CATALINA_BASE="$CATALINA_HOME"
test ".$CATALINA_MAIN" = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap

# If not explicitly set, look for jsvc in CATALINA_BASE first then CATALINA_HOME
if [ -z "$JSVC" ]; then
    JSVC="$CATALINA_BASE/bin/jsvc"
    if [ ! -x "$JSVC" ]; then
        JSVC="$CATALINA_HOME/bin/jsvc"
    fi
fi

# Set the default service-start wait time if necessary
test ".$SERVICE_START_WAIT_TIME" = . && SERVICE_START_WAIT_TIME=10

# Add on extra jar files to CLASSPATH
test ".$CLASSPATH" != . && CLASSPATH="${CLASSPATH}:"
CLASSPATH="$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar"

test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina.out"
test ".$CATALINA_TMP" = . && CATALINA_TMP="$CATALINA_BASE/temp"

# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
  CLASSPATH="$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar"
else
  CLASSPATH="$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar"
fi

# Set juli LogManager config file if it is present and an override has not been issued
if [ -z "$LOGGING_CONFIG" ]; then
  if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then
    LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
  else
    # Bugzilla 45585
    LOGGING_CONFIG="-Dnop"
  fi
fi

#test ".$LOGGING_MANAGER" = . && LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"


start() {
    echo -n $"Starting $prog: "
    "$JSVC" $JSVC_OPTS \
    -java-home $JAVA_HOME \
    -user $TOMCAT_USER \
    -pidfile $PID_FILE \
    -wait "$SERVICE_START_WAIT_TIME" \
    -outfile $CATALINA_OUT \
    -errfile '&1' \
    -classpath $CLASSPATH \
    $LOGGING_CONFIG $JAVA_OPTS $CATALINA_OPTS \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMP" \
    $CATALINA_MAIN 2>/dev/null
    RETVAL=$?
    if [ ! -f $PID_FILE ];then
        failure && echo
        exit 1
    fi
    chmod +r $CATALINA_HOME/logs/catalina.out
    PROCESS_ID=`ps aux |grep jsvc.exec |grep -v "grep\|root"| awk '{print $2}'`
    [ "$PROCESS_ID" = "`cat $PID_FILE`" ] && success || failure

    #[ $RETVAL = 0 ] && success || failure
    echo
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    #exit $?
    #echo "Tomcat was successsfully started !"
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    "$JSVC" $JSVC_OPTS \
    -stop \
    -pidfile $PID_FILE \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMP" \
    $CATALINA_MAIN 2>/dev/null 
    RETVAL=$?
    #exit $?
    #echo "Tomcat was successfully stopped!"
    [ $RETVAL = 0 ] && success || failure
    echo
    return $RETVAL
}

version() {
    "$JSVC" \
    -java-home "$JAVA_HOME" \
    -pidfile "$PID_FILE" \
    -classpath "$CLASSPATH" \
    -errfile "&2" \
    -version \
    -check \
    $CATALINA_MAIN
    if [ "$?" = 0 ]; then
      "$JAVA_BIN" \
      -classpath "$CATALINA_HOME/lib/catalina.jar" \
      org.apache.catalina.util.ServerInfo
    fi
    exit $?
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status -p $PID_FILE tomcat7
    ;;
  version)
    version 
    ;;
  *)
    echo "Unknown command: \`$1'"
    echo "Usage: $0 ( commands ... )"
    echo "commands:"
    echo "  start             Start Tomcat"
    echo "  stop              Stop Tomcat"
    echo "  restart           Stop Tomcat then Start Tomcat"
    echo "  status            What status of the Tomcat"
    echo "  version           What version of commons daemon and Tomcat"
    echo "                    are you running?"
    exit 1
  ;;
esac

exit $?

赋予执行权限后,我们用 chkconfig 命令就可以设置 jsvc 开机自启动了。

写到这里,本来已经很完美的解决了所有问题,但是新的问题有随之而来,那就先来说一下产生这种问题的背景吧。

从前操作系统曾是 Windows 的天下,如今开源、免费的 Linux 市场份额越来越高,尤其是在服务器领域,好多服务器都迁移到了 Linux 下运行。Linux操作系统在短短的几年之内得到了非常迅猛的发展,这与Linux具有的良好特性是分不开的,运行稳定,系统资源占用小,低成本。因此越来越多的人开始学习 Linux,程序员也是如此。从系统角度考虑,我认为程序员可以分为三类:

一是对 Linux 系统一窍不通,完全不会,还停留在 Windows 平台上开发程序;

二是对 Linux 系统一知半解的人,只会基本的运用或是会搭建一些简单的服务应用,没有深入的了解系统的 Linux 爱好者;

三是精通 Linux 的人,可以对 Linux 完全掌控,管理部署各种服务,开发一些应用,优化系统性能与安全,甚至开发和修改系统内核等底层服务。

对于第二类的程序员来说,系统的性能与安全配置都不甚了解,只知道超级管理员权(root)用户权限是最高的,用起来不太安全,普通用户权限比较小,受到一定限制,用起来安全。因此,通常会在系统上建个建个普通用户来做为日常操作的用户,这样做无可厚非,也是正确的。于是乎,有些程序员就把服务放在用户的 home 目录下来运行,因为登录用户后,当前目录就是在这里,觉得非常方便,慢慢的就成了习惯。

例如程序员把 Tomcat 放到用户的 home 目录运行,来开发自己的程序,认为这样是理所当然的。为了自己程序的通用性,在别的机器上,用户名可能不一样,造成程序运行时找不到目录而出错。解决思路也有了,检测当前用户的 home 目录的路径,然后使用相对路径就可以了,貌似这是很完美的解决的方案,非常不错。殊不知,普通用户虽然权限很低,但和系统用户相比权限还是略高,普通用户可以登录 shell 执行系统命令,如果系统有些未知的漏洞,被黑客利用了,普通用户通过 shell 提权会造成很严重的后果。

看似完美的方案,却有很大的隐患,系统用户虽然不是绝对安全,但对于运行服务来说,比普通用户可靠多了。那么修改服务吧,让系统用户来运行服务吧,如上边的启动方法与用户设置。但是,到这里问题就来了,因为程序使用的相对路径,通过检测当前用户的 home 目录来定位的,可是系统用户都是不能登录系统的,所以默认是没有 home 目录,那程序肯定就会报错了。系统用户默认是没有 home 目录,但创建的时候可以指定

useradd -r -u 91 -d /usr/local/tomcat7 -s /bin/false tomcat

看似问题解决了,实际上却没有,因为 jsvc 有2个进程,父进程是 root ,所以用户的 home 目录会被识别成 /root 。到了这里,我很想对成员说:“回去修改你的代码,改成 Tomcat 的环境变量 $CATALINA_HOME,你代码中的方法不行!”遗憾的是程序员不归我管,而且程序是经由多人开发的,他都不知道该怎么修改,要修改哪个些文件。现实中有很多无奈,那我们就用 runuser 方法来启动系统吧!

Tomcat 7 和以前已经不太一样了,就是 rpm 包中也没有先前的 SysVinit(System V init)的那种启动脚本了,只有 systemd 的启动方式,那我们就自己写一个吧与 Tomcat 6 的差不多。

创建系统用户时,指定 home 目录,然后创建一个环境变量文件:

vim /usr/local/tomcat7/bin/setenv.sh
#!/bin/bash
# Service-specific configuration file for tomcat7

JAVA_HOME=/usr/local/jdk1.7.0_79
JAVA_BIN=$JAVA_HOME/bin
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_BIN
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

#### tomcat7 ####
TOMCAT_HOME=/usr/local/tomcat7
CATALINA_HOME=/usr/local/tomcat7
CATALINA_BASE=/usr/local/tomcat7
CATALINA_TMPDIR=$CATALINA_HOME/temp
JAVA_ENDORSED_DIRS=$CATALINA_HOME/endorsed
export TOMCAT_HOME CATALINA_HOME CATALINA_BASE CATALINA_TMPDIR JAVA_ENDORSED_DIRS

#export LANG=zh_CN.gb18030

TOMCAT_USER=tomcat
SHUTDOWN_WAIT="30"

JAVACMD=$JAVA_BIN/java

#JAVA_OPTS='-server -Djava.net.preferIPv4Stack=true'
LOGGING_CONFIG="-Dnop"      
LOGGING_MANAGER="org.apache.juli.ClassLoaderLogManager"
CATALINA_OPTS="-server -Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=384m"

接着编写一个子进程脚本

vim /usr/local/tomcat7/bin/tomcat7
#!/bin/bash
. /usr/local/tomcat7/bin/setenv.sh

CATALINA_PID="/var/run/tomcat7.pid"

#JAVA_OPTS="${JAVA_OPTS} -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory"

# CLASSPATH munging
CLASSPATH="${CLASSPATH}:${CATALINA_HOME}/bin/bootstrap.jar"
CLASSPATH="${CLASSPATH}:${CATALINA_HOME}/bin/tomcat-juli.jar"

if [ "$1" = "start" ]; then
  ${JAVACMD} $JAVA_OPTS $CATALINA_OPTS \
    -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    -Djava.util.logging.manager="$LOGGING_MANAGER" \
    org.apache.catalina.startup.Bootstrap start \
    >> ${CATALINA_BASE}/logs/catalina.out 2>&1 &
    if [ ! -z "$CATALINA_PID" ]; then
      echo $! > $CATALINA_PID
    fi
elif [ "$1" = "start-security" ]; then
  ${JAVACMD} $JAVA_OPTS $CATALINA_OPTS \
    -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    -Djava.security.manager \
    -Djava.security.policy=="${CATALINA_BASE}/conf/catalina.policy" \
    -Djava.util.logging.config.file="${CATALINA_BASE}/conf/logging.properties" \
    -Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager" \
    org.apache.catalina.startup.Bootstrap start \
    >> ${CATALINA_BASE}/logs/catalina.out 2>&1 &
    if [ ! -z "$CATALINA_PID" ]; then
      echo $! > $CATALINA_PID
    fi
elif [ "$1" = "stop" ]; then
  ${JAVACMD} $JAVA_OPTS $CATALINA_OPTS\
    -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap stop \
    >> ${CATALINA_BASE}/logs/catalina.out 2>&1
elif [ "$1" = "version" ]; then
  ${JAVACMD} -classpath ${CATALINA_HOME}/lib/catalina.jar \
    org.apache.catalina.util.ServerInfo
else
  echo "Usage: $0 {start|start-security|stop|version}"
  exit 1
fi

赋予执行权限

chmod +x /usr/local/tomcat7/bin/tomcat7

最后创建系统自启动脚本

vim /etc/init.d/tomcat7
#!/bin/bash
#
# Apache-Tomcat service script    This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 81 22
#
### BEGIN INIT INFO
# Author:  Created by Gong Yijie <http://blog.chopmoon.com>
# Created Time: Fri May 29 10:30:29 CST 2015
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Release implementation for Servlet 3.0 and JSP 2.2
# Short-Description: start and stop tomcat
### END INIT INFO
#

CATALINA_HOME=/usr/local/tomcat7

## Source function library.
#. /etc/rc.d/init.d/functions
# Source LSB function library.
if [ -r /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
else
    exit 1
fi

DISTRIB_ID=`lsb_release -i -s 2>/dev/null`

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 -s /bin/sh"
else
    SU="/bin/su -s /bin/sh"
fi

# Get the tomcat config (use this for environment specific settings)
TOMCAT_CFG="${CATALINA_HOME}/bin/setenv.sh"
if [ -r "$TOMCAT_CFG" ]; then
    . $TOMCAT_CFG
fi

# Get instance specific config file
if [ -r "/etc/sysconfig/${NAME}" ]; then
    . /etc/sysconfig/${NAME}
fi

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

# Path to the tomcat launch script
TOMCAT_SCRIPT="${CATALINZ_HOME}/bin/tomcat7"

# Tomcat program name
TOMCAT_PROG="${NAME}"

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

# Define the tomcat group
TOMCAT_GROUP="${TOMCAT_GROUP:-`id -gn $TOMCAT_USER`}"

# Define the tomcat log file
#TOMCAT_LOG="${TOMCAT_LOG:-/var/log/${NAME}-initd.log}"
TOMCAT_LOG="${TOMCAT_LOG:-/dev/null}"

# Define the pid file name
# If change is needed, use sysconfig instead of here
export CATALINA_PID="${CATALINA_PID:-/var/run/${NAME}.pid}"

RETVAL="0"

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

# rhbz 757632
function version() {
        parseOptions
        $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} version" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
}

# See how we were called.
function start() {

   echo -n "Starting ${TOMCAT_PROG}: "
   if [ "$RETVAL" != "0" ]; then
     log_failure_msg
     return
   fi
   if [ ! -s "${CATALINA_PID}" ];then
      rm -f "${CATALINA_PID}"
   fi
   if [ -f "/var/lock/subsys/${NAME}" ]; then
        if [ -f "${CATALINA_PID}" ]; then
            read kpid < ${CATALINA_PID}
#           if checkpid $kpid 2>&1; then
            if [ -d "/proc/${kpid}" ]; then
                log_success_msg
                if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
                    echo
                fi
                RETVAL="0"
                return
            fi
        fi
    fi
    # fix permissions on the log and pid files
    touch $CATALINA_PID 2>&1 || RETVAL="4"
    if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
      chown ${TOMCAT_USER}:${TOMCAT_GROUP} $CATALINA_PID
    fi
    if [ "$?" != "0" ]; then
        RETVAL="4"
    fi
    parseOptions
    if [ "$RETVAL" -eq "0" -a "$SECURITY_MANAGER" = "true" ]; then
        $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" \
            >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
    else

       [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
    fi
    if [ "$RETVAL" -eq "0" ]; then
        log_success_msg
        touch /var/lock/subsys/${NAME}
    else
        log_failure_msg "Error code ${RETVAL}"
    fi
    if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
        echo
    fi
}

function stop() {
    echo -n "Stopping ${TOMCAT_PROG}: "
    if [ -f "/var/lock/subsys/${NAME}" ]; then
      parseOptions
      if [ "$RETVAL" -eq "0" ]; then
         touch /var/lock/subsys/${NAME} 2>&1 || RETVAL="4"
         [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} stop" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
      fi
      if [ "$RETVAL" -eq "0" ]; then
         count="0"
         if [ -f "${CATALINA_PID}" ]; then
            read kpid < ${CATALINA_PID}
            until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
                      [ "$count" -gt "$SHUTDOWN_WAIT" ]; do
                    if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
                        echo "waiting for processes $kpid to exit"
                    fi
                    sleep 1
                    let count="${count}+1"
                done
                if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
                    if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
                        log_warning_msg "killing processes which did not stop after ${SHUTDOWN_WAIT} seconds"
                    fi
                    kill -9 $kpid
                fi
                log_success_msg
            fi
            rm -f /var/lock/subsys/${NAME} ${CATALINA_PID}
        else
            log_failure_msg
            RETVAL="4"
        fi
    else
        log_success_msg
        RETVAL="0"
    fi
    if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
        echo
    fi
}

function status()
{
   checkpidfile
   if [ "$RETVAL" -eq "0" ] && [ -s ${CATALINA_PID} ]; then
      log_success_msg "${NAME} (pid ${kpid}) is running..."
   elif [ "$RETVAL" -eq "1" ]; then
      log_failure_msg "PID file exists, but process is not running"
   else
      checklockfile
      if [ "$RETVAL" -eq "2" ]; then
         log_failure_msg "${NAME} lockfile exists but process is not running"
      else
         pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_GROUP} java)"
         if [ -z "$pid" ]; then
             log_success_msg "${NAME} is stopped"
             RETVAL="3"
         else
             log_success_msg "${NAME} (pid ${kpid}) is running..."
             RETVAL="0"
         fi
      fi
  fi
}

function checklockfile()
{
   if [ -f /var/lock/subsys/${NAME} ]; then
      pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_GROUP} java)"
# The lockfile exists but the process is not running
      if [ -z "$pid" ]; then
         RETVAL="2"
      fi
   fi
}

function checkpidfile()
{
   if [ -f "${CATALINA_PID}" ]; then
      read kpid < ${CATALINA_PID}
      if [ -d "/proc/${kpid}" ]; then
# The pid file exists and the process is running
          RETVAL="0"
         return
      else
# The pid file exists but the process is not running
         RETVAL="1"
         return
      fi
   else
# pid file does not exist and program is not running
      RETVAL="3"
      return
  fi
}

function usage()
{
   echo "Usage: $0 {start|stop|restart|status|version}"
   RETVAL="2"
}

# See how we were called.
RETVAL="0"
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 3
        start
        ;;

    status)
        status
        ;;
    version)
                version
        ;;
    *)
      usage
      ;;
esac

exit $RETVAL

赋予执行权限,并设为开机启动就 ok 了。

chmod +x /etc/init.d/tomcat7
chkconfig tomcat7 on

五、Java SE 7 公共更新结束通知

Java 7在2011年7月首次发布。在 2015 年 4 月以后,Oracle 的公共下载网站上将不再发布 Java SE 7 的更新。这与该公司生命的 Java 政策一致——在主版本正式供应(GA)三年之后,下一个主版本GA一年以后和下一个主版本被Java.com设为默认JRE六个月之后将停止公共更新。

不过以后仍然可以通过 Oracle 技术网络的 Java Archive 获取已有的 Java 7下载。需要继续获取Java 7安全更新的用户,可以与Oracle签订支持合同或购买 Java SE 高级产品许可。不推荐在没有安全更新的情况下继续使用 Java 7。

考虑到 Java 7 免费用户不在受到 Oracle 官方的维护与更新,安全问题和其它的问题,就需要广大程序员们自行解决,各显神通了。有鉴于此,以后的新项目建议使用 Java 8 来开发。对于就项目来说,如果条件允许也尽量修改 Java 8 环境来运行。


本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/215.html
喜欢 (0)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……