CentOS安装Tomcat

前言

以前我都是使用 OneinStack 脚本,一键安装 lnmt(Linux + Nginx + MySQL + Tomcat)Java EE 环境,后来开始接触 Docker,发现在容器中脚本一键安装完成并提交镜像后,镜像居然超过了5G,太夸张了。而我自己纯手动搭建,镜像才1.9G,可能脚本自动安装了很多其它可能用不上的依赖,终究还是得自己搭建环境,只安装自己需要的服务。这一篇首先讲一下 tomcat 的搭建。

安装wget

使用 wget 来下载资源文件,检查一下服务器是否有 wget 命令,如果没有,需要先安装。

我的 docker 容器跑的是 centos:6.8 的镜像,没有 wget,所以也需要先安装。

1
$ yum -y install wget

安装jdk

由于运行 tomcat 需要 java 环境,也就是需要安装 jdk。安装 jdk 有两种方式。

一种是下载 jdk 压缩包,比如 jdk-8u151-linux-x64.tar.gz,然后解压,再编辑配置文件 /etc/profile,配置环境变量 JAVA_HOME、CLASSPATH、PATH。

另一种是下载 rpm 软件包,比如 jdk-8u151-linux-x64.rpm,直接使用 rpm 安装。

我选择使用 rpm 安装,无需再配环境变量。

1
2
$ wget -P /tmp/ https://cdn.bingo.ren/jdk-8u151-linux-x64.rpm
$ rpm -ivh /tmp/jdk-8u151-linux-x64.rpm

安装tomcat

我选择从阿里云的镜像站点下载,使用 tomcat 8.5.24。然后模仿 OneinStack,将 tomcat 解压到 /usr/local/tomcat 目录。

1
2
$ wget -O /tmp/tomcat.tar.gz http://mirrors.aliyun.com/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz
$ tar -zxvf /tmp/tomcat.tar.gz -C /usr/local

解压完成后,使用 startup.sh 这个脚本即可启动 tomcat 服务。

1
$ /usr/local/tomcat/bin/startup.sh

以service的方式运行tomcat

期望的 service 用法:

command description
service tomcat start 启动tomcat
service tomcat stop 停止tomcat
service tomcat restart 重启tomcat
service tomcat status 查看tomcat运行状态

首先把下面的 tomcat 脚本放到 /etc/init.d 目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/bin/bash
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: tomcat-server daemon
# Description: tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script
# Created by Bingo on 2017/12/2.
# Copyright © 2016年 cn.dankal. All rights reserved.
#Location of JAVA_HOME (bin files)
export JAVA_HOME=/usr/java/jdk1.8.0_151/
#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH
#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat
#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=root
#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"
#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=20
tomcat_pid() {
echo `ps -ef | grep $CATALINA_HOME/ | grep -v grep | tr -s " "|cut -d" " -f2`
}
user_exists() {
if id -u $1 >/dev/null 2>&1; then
echo "1"
else
echo "0"
fi
}
status() {
pid=$(tomcat_pid)
if [ -n "$pid" ]; then
echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
else
echo -e "\e[00;31mTomcat is not running\e[00m"
fi
}
# call the startup.sh
start() {
pid=$(tomcat_pid)
if [ -n "$pid" ]; then
echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
else
echo -e "\e[00;32mStarting tomcat\e[00m"
if [ `user_exists $TOMCAT_USER` = "1" ]; then
su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
else
$CATALINA_HOME/bin/startup.sh
fi
status
fi
return 0
}
# call the shutdown.sh, after 20s still not work, then kill -9 pid.
stop() {
pid=$(tomcat_pid)
if [ -n "$pid" ]; then
echo -e "\e[00;31mStoping tomcat\e[00m"
$CATALINA_HOME/bin/shutdown.sh
let kwait=$SHUTDOWN_WAIT
count=0;
until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
do
echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
sleep 1
let count=$count+1;
done
if [ $count -gt $kwait ]; then
echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
kill -9 $pid
fi
else
echo -e "\e[00;31mTomcat is not running\e[00m"
fi
return 0
}
# fully-kill tomcat and call the startup.sh.
restart() {
pid=$(tomcat_pid)
if [ -n "$pid" ]; then
echo -e "\e[00;31mStoping tomcat\e[00m"
kill -9 $pid
fi
echo -e "\e[00;32mStarting tomcat\e[00m"
if [ `user_exists $TOMCAT_USER` = "1" ]; then
su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
else
$CATALINA_HOME/bin/startup.sh
fi
status
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo -e $TOMCAT_USAGE
;;
esac
exit 0
  • start 对应 /usr/local/tomcat/bin/startup.sh 脚本。
  • stop 对应 /usr/local/tomcat/bin/shutdown.sh 脚本,如果脚本执行后超过20秒,tomcat 仍然在运行,就会使用 kill -9 彻底杀死 tomcat 进程。
  • restart 原本是参考 OneinStack 的做法,先执行 stop 再执行 start,后来我改为了先 kill -9 再执行 start。因为使用 jenkins 的时候发现 stop 每次都会等20秒才彻底杀死 tomcat 进程,浪费时间。
  • status 根据是否有 tomcat 进程来判断 tomcat 服务是否正在运行。

然后给所有用户加上可执行权限:

1
$ chmod a+x tomcat

最后设置服务运行级别:

1
$ chkconfig --add tomcat

至此,tomcat 服务添加成功。
chkconfig --list 查看,在服务列表里就会出现 tomcat 服务了。

1
2
3
4
5
6
7
8
9
10
11
12
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
jexec 0:off 1:on 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off
redis 0:off 1:off 2:on 3:on 4:on 5:on 6:off
redis-sentinel 0:off 1:off 2:off 3:off 4:off 5:off 6:off
restorecond 0:off 1:off 2:off 3:off 4:off 5:off 6:off
tomcat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off

测试:

1
2
3
4
$ service tomcat start
$ service tomcat stop
$ service tomcat restart
$ service tomcat status

解决tomcat日志文件中文乱码

上述配置全部搞定后,把项目 war 包放到 webapps 下,项目就跑起来了。但是我发现,日志中的中文都出现乱码 ???。在网上查这个问题,有很多种解决方法,最终修改 catalina.sh 脚本解决。

1
$ vi /usr/local/tomcat/bin/catalina.sh

大概在229行,如果不方便看行数的话,可以使用 / 快速搜索定位。

1
/LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"

因为搜出来的第一个结果可能是一句注释,所以可能还需要按 N 跳到下一条搜索结果。总之,找到并把原有的代码:

1
2
3
if [ -z "$LOGGING_MANAGER" ]; then
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
fi

改为:

1
2
3
4
5
if [ -z "$LOGGING_MANAGER" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
else
JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
fi

最后重启 tomcat 即可。

1
$ service tomcat restart

后话

至此,Tomcat 环境就已经搭建完毕,可以部署 Java EE 项目。如果项目需要连接本地的持久化服务,就还需要安装 MySQL、Redis 等,这两个会放在下一篇文章来写。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/63.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!