Tomcat6.0安装与配置

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

Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的 Servlet 和 JSP 规范总是能在 Tomcat 中得到体现,Tomcat 5 支持最新的 Servlet 2.4 和 JSP 2.0 规范。因为Tomcat技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前Tomcat主要版本有Tomcat 6.0、Tomcat 7.0、Tomcat 8.0三个版本。

tomcat.png

Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好 Apache 服务器,可利用它响应对 HTML页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

一、准备工作

首先从官方网站 http://tomcat.apache.org/ 下载你需要的 Tomcat 版本,还要从 http://www.oracle.com 下载需要的 jdk 包,选择 1.6 与 1.7 的版本都可以,我们以 apache-tomcat-6.0.44.tar.gz 、jdk-6u45-linux-x64.bin 这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

先赋予执行权限

chmod +x jdk-6u45-linux-x64.bin
./jdk-6u45-linux-x64.bin
mkdir /usr/java
mv jdk1.6.0_45/ /usr/java/

如果是用的 .rpm.bin 包,安装会更方便一点,不但会穿建rpm包,还会自动安装上。

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

export JAVA_HOME=/usr/java/jdk1.6.0_45
export JAVA_BIN=/usr/java/jdk1.6.0_45/bin
export PATH=$PATH:$JAVA_BIN
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

注意:CLASSPATH 不要像网上其它文章那样,加很多,在 tomcat6 下,会造成没有任何日志输出,tomcat7 下则没有问题。

在 profile 文件中配置环境变量,PATH 与 CLASSPATH 最好是不要使用 PATH=$PATH:$JAVA_BIN 的变量形式,每次引用都全读 $PATH 在,多次引用,环境变量会变得很长,而且重复,再次修改比较麻烦。

先用 echo 输出变量值,然后改成这样比较好:

export JAVA_HOME=/usr/java/jdk1.6.0_45
export JAVA_BIN=/usr/java/jdk1.6.0_45/bin
export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_BIN
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

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

[root@vm ~]# source /etc/profile
[root@vm ~]# echo $JAVA_HOME
/usr/java/jdk1.6.0_45
[root@vm ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.6.0_45/bin:/root/bin
[root@vm ~]# echo $CLASSPATH
.:/usr/java/jdk1.6.0_45/lib/dt.jar:/usr/java/jdk1.6.0_45/lib/tools.jar
[root@vm ~]# echo $CLASSPATH
.:/usr/java/jdk1.6.0_45/lib/dt.jar:/usr/java/jdk1.6.0_45/lib/tools.jar
[root@vm ~]# java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

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

三、安装 Tomcat

1、解压 Tomcat 到工作目录

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

tar xf apache-tomcat-6.0.44.tar.gz
mv apache-tomcat-6.0.44 /usr/local/tomcat6

2、配置环境变量

修改 profile 文件:

export TOMCAT_HOME=/usr/local/tomcat6
export CATALINA_HOME=/usr/local/tomcat6
export CATALINA_BASE=/usr/local/tomcat6
export CATALINA_TMPDIR=/usr/local/tomcat6/temp

如果不设置 Tomcat 也是可以的正常启动的,启动脚本会检测路径,然后自行设置环境变量为安装目录,如果代码目录不在安装目录下,一定要设置环境变量到指定目录下。

3、安装 APR 库

APR(Apache Portable Runtime) 是一个高可移植库,它是 Apache HTTP Server
2.x 的核心。在Tomcat中使用 APR 库,其实就是在 Tomcat 中使用JNI的方式来读取文件以及进行网络传输。可以大大提升 Tomcat 对静态文件的处理性能,同时如果你使用了 HTTPS 方式传输的话,也可以提升 SSL 的处理性能,提供超强的可伸缩性和性能。

APR 有很多用途,包括访问高级IO功能(例如 sendfile,epoll 和 OpenSSL),OS 级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和 UNIX sockets )。这些功能可以使 Tomcat 作为一个通常的前台 WEB 服务器,能更好地和其它本地web技术集成,总体上让 Java 更有效率作为一个高性能 web 服务器平台而不是简单作为后台容器。

在产品环境中,特别是直接使用Tomcat做WEB服务器的时候,应该使用Tomcat Native来提高其性能。Tomcat6默认就启动这种方式,但扩展模块并没有安装,在日志中会提示找不到这个模块。

日志信息如下:

2015-9-12 11:20:26 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.6.0_45/jre/lib/amd64/server:/usr/java/jdk1.6.0_45/jre/lib/amd64:/usr/java/jdk1.6.0_45/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

安装方法如下:

cd /usr/local/tomcat6/bin/
yum install -y gcc apr-devel openssl-devel
tar xf tomcat-native.tar.gz
cd tomcat-native-1.1.33-src/jni/native/
./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/tomcat6/bin/
rm tomcat-native-1.1.33-src/ -fr

添加共享库全局环境变量到 profile 文件中,然后重新加载环境变量

export LD_LIBRARY_PATH=/usr/local/tomcat6/lib

如果还加过其他路径就要追加:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tomcat6/lib

4、日志切割

Tomcat 自身已经有日志切割功能了,日志的名字都是以日期的形式生成的,但是有一个文件 catalina.out 是没有被切割的,那只能我们自己来切割了。利用系统自带的日志切割服务 logrotate 工具,在 /etc/logrotate.d 下,创建一个名字为 tomcat6 的文件,内容如下:

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

四、Tomcat 配置

关于Tomcat的目录结构,可以参考下面简单的描述

[root@vm ~]# ls /usr/local/tomcat6/
bin   include  LICENSE  NOTICE         RUNNING.txt  webapps
conf  lib      logs     RELEASE-NOTES  temp         work

主目录下面有bin、lib等目录

bin             存放Tomcat启动、停止服务程序以及一些其他脚本程序

lib              存放Tomcat运行需要的jar包

log             存放Tomcat运行的相关日志文件

conf           存放Tomcat配置文件。例如 server.xml 、 tomcat-users.xml、web.xml 等

temp          存放Tomcat运行的临时文件。

webapps    Web应用的发布目录,默认情况下把Web应用文件放于此目录。

work          Tomcat的工作目录,默认情况下把编译JSP文件生成的servlet类文件放于此目录下

1、启动与关闭 Tomcat 服务:

[root@vm ~]# /usr/local/tomcat6/bin/startup.sh       #启动
Using CATALINA_BASE:   /usr/local/tomcat6
Using CATALINA_HOME:   /usr/local/tomcat6
Using CATALINA_TMPDIR: /usr/local/tomcat6/temp
Using JRE_HOME:        /usr/java/jdk1.6.0_45
Using CLASSPATH:       /usr/local/tomcat6/bin/bootstrap.jar

[root@vm ~]# //usr/local/tomcat6/bin/shutdown.sh      #关闭
Using CATALINA_BASE:   /usr/local/tomcat6
Using CATALINA_HOME:   /usr/local/tomcat6
Using CATALINA_TMPDIR: /usr/local/tomcat6/temp
Using JRE_HOME:        /usr/java/jdk1.6.0_45
Using CLASSPATH:       /usr/local/tomcat6/bin/bootstrap.jar

启动与关闭脚本,实际上是调用的同级目录下的 catalina.sh 脚本,来执行应动作的。

用浏览器访问以下可以看到以下效果:

tomcat6.png

2、修改 Tomcat 配置文件

默认情况下,tomcat使用的的编码方式:iso-8859-1。

利用request.setCharacterEncoding("UTF-8");来设置Tomcat接收请求的编码格式,只对POST方式提交的数据有效,对GET方式提交的数据无效!

要设置GET的编码,可以修改 ${CATALINA_HOME}/conf/server.xml文件中,相应的端口的Connector的属性:URIEncoding="UTF-8",这样,GET方式提交的数据才会被正确解码。如果不设置,程序在访问的时候,有些地方就会有乱码。

找到 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" />

这样修改后就可以了,如果 Tomcat 运行需要其它编码,启动前要将环境变量的语言也修改,配置文件做相应设置。Tomcat 的端口号和连接超时,也是在这里设置。

3、Tomcat 的管理页面设置

如果要进入Tomcat的管理页面:http://localhost:8080/manager/html,这时会弹出下面认证界面,需要你输入用户名和密码,如果你没有配置过或者你忘了用户名、密码,都应该通过配置文件 ${CATALINA_HOME}/conf/tomcat-users.xml 来设置,Ant 与Jenkins 等工具,也是通过这个管理界面来实现自动打包发布的。不过生产环境,建议把这些管理界面都删掉,防止带来入侵的安全隐患。

manger1.png

默认配置文件如下:

<tomcat-users>
<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
</tomcat-users>

将注释去掉,改成

<tomcat-users>
  <role rolename="admin"/>
  <role rolename="manager"/>
  <user username="tomcat" password="tomcat123" roles="admin,manager"/>
</tomcat-users>

重启 Tomcat ,然后输入密码就可以登录了

manger2.png

4、Tomcat 修改header头

HTTP Server在响应请求时,会返回服务器的Server信息,为安全起见,我们一般会建议去掉或修改这个信息。想要隐藏服务器Response Header中server信息和版本号,做如下操作即可。

(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
HTTP/1.1 200 OK
Accept-Ranges: bytes
ETag: W/"7454-1431087679000"
Last-Modified: Fri, 08 May 2015 12:21:19 GMT
Content-Type: text/html
Content-Length: 7454
Date: Sat, 12 Sep 2015 11:03:43 GMT
Server: IIS Server

(2)修改源代码

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

cd /usr/local/tomcat6/lib
jar xf catalina.jar
vim org/apache/catalina/util/ServerInfo.properties
server.info=CHOPMOON
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/

5、Tomcat 开机启动与安全设置

Linux下有三类用户:

(1)超级用户: root 具有操作系统的一切权限, UID为0

(2)普通用户:具有操作系统有限的权限 UID为500—6000

(3)系统用户: 是为了方便系统管理,满足相应的系统进程文件属主的要求,不能登录系统,UID为1–499

那接下来就说一下,用这几种用户启动的的区别以及如何操作:

① root:如果我们只是自己测试,使用root启动倒也无妨,将 /usr/local/tomcat6/bin/startup.sh 放到 /etc/rc.local 里边,随机器启动就可以了,但脚本还需要做些改动。这种方式启动,因为还没有登录系统,所以 /etc/profile 文件没有被加载上,也就是说环境变量没有生效,需要 startup.sh 首行加上“source /etc/profile”这一行,“source”可以“.”代替。

因为 root 用户是最高权限,也就是说 Tomcat 也拥有了最高权限,可以对任意文件进行这种操作,如果是在生产环境中,这个是相当危险。

②普通用户:使用普通用户的时候,要想启动 Tomcat 服务,要先把 /usr/local/tomcat6 用户和组都改成相应的用户身份,如 tomcat

chown tomcat.tomcat -R /usr/local/tomcat6

代码目录如果在别的地方也要修改一下,然后在切换到普通用户下,执行

/usr/local/tomcat6/bin/startup.sh

Tomcat 就可以普通用户身份启动了,用 ps 命令查看一下进程,可以看到对应的用户已经改变了。

但是,这样似乎没法直接通过在”rc.local“放入启动命令来开机自启动,不过可以使用 su 命令或 runuser 命令来调用启动脚本。su 命令临时切换用户身份,runuser 命令使用一个替代的用户或者组ID运行一个shell,这个命令尽在 root 用户时有效,以后再详细的介绍这个命令。

命令如下:

su - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1

runuser - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1

用这条命令来调用启动脚本,放置在 rc.local 文件,就可以以普通用户身份启动了,这样可以解决这个问题了。可是普通用户还是有一个交互式 shell ,该用户可以登录系统,还是可以执行一些系统命令,虽然是普通用户,权限受到一定的限制,但安全级别还是差一点。

③系统用户:这类用户的shell级别不是 /sbin/nologin,就是 /bin/false,如 nodoby 用户 。这样的用户是只能用于启动系统服务的,没有任何其他功能,无法直接登录系统,就和windows的系统服务用户差不多。这样的用户安全级别已经非常高了,用于启动系统服务再合适不过了,但是像上边那样直接 su -c 与 runuser -c 使用命令是无法运行的,因为该类用户是不能登录系统的。如果用户是 /sbin/nologin 就会提示“This account is currently not available.”且无法执行,如果是 /bin/false,则不会有任何提示,且不会执行。这两个命令是很强大的,还是可以使用的,只需要加上“ -s "参数指定执行命令的 shell 就可以了。

su -s /bin/sh - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1


runuser -s /bin/sh - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1

下面就来介绍一下,如何利用它来写一个 service 自启动服务脚本。

首先创建一个普通用户,然后修改 Tomcat 目录所属用户和组

useradd -r -u 91 -d /usr/local/tomcat6 -s /bin/false tomcat
chown tomcat.tonmcat -R /usr/local/tomcat6

然后创建一个环境变量文件,将需要设置的变量都提前设好,让脚本自动读取,不受全局变量影响。

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

JAVA_HOME=/usr/java/jdk1.6.0_45
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/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

#### tomcat ####
export CATALINA_HOME=/usr/local/tomcat6
export CATALINA_BASE=/usr/local/tomcat6
export CATALINA_TMPDIR=$CATALINA_HOME/temp
export JAVA_ENDORSED_DIRS=$CATALINA_HOME/endorsed
export LD_LIBRARY_PATH=$CATALINA_HOME/lib

#export LANG=zh_CN.gb18030      #需要用其它语言编码,这里设置一下就可以了

TOMCAT_USER="tomcat"            #Tomcat 启动用户
SHUTDOWN_WAIT="30"              #关闭服务时,等待时间

JAVACMD=$JAVA_BIN/java

JAVA_OPTS="-server -Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=384m"
CATALINA_OPTS=""

接着创建一个子进程脚本,用于执行启动命令,记录进程ID

vim /usr/local/tomcat6/bin/tomcat6
#!/bin/bash

. /usr/local/tomcat6/bin/setenv.sh


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.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" = "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 \
    -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

$! 是 Shell 最后运行的后台Process的PID,这样脚本就可以对改进程进行控制了。

赋予执行权限

chmod +x /usr/local/tomcat6/bin/tomcat6

最后创建系统自启动脚本

vim /etc/init.d/tomcat6
#!/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
#

CATALINA_HOME=/usr/local/tomcat6
 
## 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="${CATALINA_HOME}/bin/tomcat6"
 
# 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
        start
        ;;
 
    status)
        status
        ;;
    version)
         version
        ;;
    *)
      usage
      ;;
esac
 
exit $RETVAL

赋予执行权限

chmod +x /etc/init.d/tomcat6

以上脚本是根据操作系统中自带的rpm包中的脚本修改得来,还可以在做些优化。Tomcat 还有一种启动方式,就是使用 jsvc 以守护进程方式启动和停止 Tomcat 服务,该方法会在 tomcat7 中进行介绍。

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

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

Hi,请填写昵称和邮箱!

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