Overview

由于我们服务器(Ubuntu 16.0)上的Tomcat 7太老了,想更新一个新版本的Tomcat 8。目前没找到在Ubuntu 16.0中自动安装Tomcat 8的办法,所以在这里记录一下手动安装过程。
如果服务器之前没有安装其他版本的Tomcat,可以直接跳到下面Tomcat 8安装部分。

1. 停用当前的Tomcat

以我们系统中的Tomcat 7为例,该Tomcat是使用apt-get install自动安装在系统中的,会伴随系统开机自启动。

1.1 关闭当前Tomcat 7

如果是使用apt-get install安装的Tomcat 7,使用下面的命令关闭:

sudo service tomcat7 stop

这里如果有不关掉的话,新装的Tomcat 8会在启动时检测到Tomcat已经启动,从而报错。

1.2 关闭当前Tomcat 7的开机自启动

查看当前Tomcat 7是否开机自启动:

systemctl is-enabled tomcat7.service

得到一串信息:

tomcat7.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install is-enabled tomcat7
enabled

可以看到Tomcat 7是开机自启动。关闭Tomcat 7的开机自启动:

sudo systemctl disable tomcat7.service

再查看一下,就已经关闭了。

手动安装Tomcat 8

1. 安装并配置好了JAVA JDK

检查是否安装配置了JDK

java -version

如果没安装的话,参见机器学习项目服务器上线部署全流程记录

2. 创建Tomcat8目录

选一个合适的位置,比如/opt目录,创建:

sudo mkdir -p /opt/tomcat8

3. 创建Tomcat8的用户和用户组:

先创建用户组:

sudo groupadd tomcat8

再在这个用户组中创建一个用户,赋予它/opt/tomcat8的文件夹权限:

sudo useradd -s /bin/false -g tomcat8 -d /opt/tomcat8 tomcat8

4. 下载Tomcat 8

先安装wgetunzip

sudo apt install wget unzip

使用wget下载Tomcat 8/tmp文件夹:

cd /tmp
sudo wget https://downloads.apache.org/tomcat/tomcat-8/v8.5.56/bin/apache-tomcat-8.5.56.zip

特定版本号不一定能找得到,可以自己到https://downloads.apache.org/tomcat/tomcat-8/中找一个存在的,把链接替换了。

解压apache-tomcat-8.5.56.zip并复制到/opt/tomcat8/中:

unzip apache-tomcat-8.5.56.zip
sudo mv ./apache-tomcat-8.5.56/* /opt/tomcat8/

如果mv失败,可以使用下面的命令:

sudo cp -r ./apache-tomcat-8.5.56/* /opt/tomcat8/

最后可以手动删除下载包:

sudo rm -fr apache-tomcat-8.5.56*

如果有不自己删的话,/tmp文件夹里的东西好像也会自动清理。

5. 配置Tomcat 8

/opt/tomcat8/文件夹的权限给tomcat8用户:

sudo chown -R tomcat8: /opt/tomcat8

给所有的sh脚本增加可执行权限:

sudo sh -c 'chmod +x /opt/tomcat8/bin/*.sh'

配置环境变量(假设你用的是bash):

sudo echo "export CATALINA_HOME="/opt/tomcat8"" >> ~/.bashrc
source ~/.bashrc

创建系统文件tomcat8.service

sudo vim /etc/systemd/system/tomcat8.service

将下面内容写入:

[Unit]

Description=Tomcat 8.5 servlet container

After=network.target


[Service]

Type=forking

User=tomcat8

Group=tomcat8


Environment="JAVA_HOME=/usr/lib/jvm/java-8-oracle"

Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"


Environment="CATALINA_BASE=/opt/tomcat8"

Environment="CATALINA_HOME=/opt/tomcat8"

Environment="CATALINA_PID=/opt/tomcat8/temp/tomcat.pid"

Environment="CATALINA_OPTS=-Xms2048M -Xmx4096M -Duser.timezone=GMT -server -XX:+UseParallelGC"


ExecStart=/opt/tomcat8/bin/startup.sh

ExecStop=/opt/tomcat8/bin/shutdown.sh


[Install]

WantedBy=multi-user.target

这里的环境变量JAVA_HOME需要填写自己系统中的路径,使用下面的命令查看:

echo $JAVA_HOME

环境变量CATALINA_OPTS非常重要,设置Tomcat启动内容。

特别注意-Duser.timezone=GMT这个设置,将Tomcat 8的时间设置为标准时间。因为我们同时用JAVAPerl读取了时间,Perl用的是标准时间,Tomcat 8默认使用了当地时间,会造成时间上的不一致(Tomcat 7好像没有这个问题)。

双重保险,在/opt/tomcat8/bin/catalina.sh中也设置一下:

sudo vim /opt/tomcat8/bin/catalina.sh

可以看到:

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;

在这段前面添加:

JAVA_OPTS="-Xms2048M -Xmx4096M -Duser.timezone=GMT -server -XX:+UseParallelGC"

确保Tomcat内存够用。

重新载入系统文件:

sudo systemctl daemon-reload

重新启动Tomcat 8(如果系统中还有别的Tomcat在运行,需要先关闭,否则会报错):

sudo systemctl start tomcat8

使用下面的命令检查当前Tomcat 8的运行状态:

sudo systemctl status tomcat8

(Optional) 如果需要开启8080端口,使用下面的命令:

sudo ufw allow 8080/tcp

我们的服务器使用Apache代理,通常不需要这一步。

最后设置一下Tomcat 8的开机自启动:

sudo systemctl enable tomcat8.service

再使用命令查看:

systemctl is-enabled tomcat8.service

状态已经是enabled了。

这时,访问服务器网址,就已经显示了默认的Tomcat 8界面了。

6. 设置Tomcat 8工作路径

默认情况下,Tomcat的工作路径都在其文件夹的webapps/路径下,我们当下的Tomcat8就在/opt/tomcat8/webapp路径下。由于我们的项目还在之前的Tomcat 7,所以我们依然使用Tomcat 7的工作路径。

如果Tomcat 7是用apt-get install安装的,那么查看/etc/tomcat7/server.xml:

sudo vim /etc/tomcat7/server.xml

可以看到下面的内容:

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

appBase写的是相对路径,目录为webapps,说明就是Tomcat 7的默认工作目录,如果是apt-get install安装的,该目录的绝对路径为/var/lib/tomcat7/webapps

将这个目录设置为Tomcat 8的工作目录:

sudo vim /opt/tomcat8/conf/server.xml

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

中的appBase修改为/var/lib/tomcat7/webapps

<Host name="localhost"  appBase="/var/lib/tomcat7/webapps"
            unpackWARs="true" autoDeploy="true">

当然,原来的Tomcat 7可以也设置过别的工作路径,一般会是绝对路径,那就直接将这个绝对路径复制过来放到Tomcat 8appBase这里就可以了。

重启Tomcat 8

sudo systemctl restart tomcat8

就可以了。

7. Tomcat 8命令

附上启动、重启和关闭Tomcat 8的命令:

sudo systemctl start tomcat8
sudo systemctl restart tomcat8
sudo systemctl stop tomcat8

参考文章

How to Install Tomcat 8 on Ubuntu 18.04/16.04 LTS
mv: Directory not empty
Ubuntu禁止服务开机自启动
解决tomcat时区错误问题
LINUX设置时区 并 解决 tomcat8 时区与系统时区不一致的问题