Tomcat基础知识

  • 目的:将SpringBoot项目部署到Tomcat应用服务器中
  • 了解tomcat
    • 开源应用服务器
    • 支持Servlet,JSP,……,Java系Web应用
    • 入门简单

Tomcat安装

  • 环境要求:Java开发和运行时环境

    1
    2
    3
    4
    [root@localhost local]# java -version
    java version "1.8.0_221"
    Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
  • 下载位置:https://tomcat.apache.org/,我们选择在Linux上安装,选择Tomcat9

    image-20210221181341635

  • 安装方法:下载解压

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [root@localhost ~]# wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
    --2021-02-21 18:14:28-- https://downloads.apache.org/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
    ……
    [root@localhost ~]# ls
    anaconda-ks.cfg apache-tomcat-9.0.43.tar.gz jdk-8u221-linux-x64.tar
    [root@localhost ~]# tar -zxvf apache-tomcat-9.0.43.tar.gz
    apache-tomcat-9.0.43/conf/
    apache-tomcat-9.0.43/conf/catalina.policy
    apache-tomcat-9.0.43/conf/catalina.properties
    ……
    [root@localhost ~]# mv apache-tomcat-9.0.43 /usr/local/tomcat9
    [root@localhost ~]# cd /usr/local/
    [root@localhost local]# ls
    bin games jdk1.8 lib64 sbin src
    etc include lib libexec share tomcat9
  • 运行和配置入门:

    • 启动:/bin/startup.sh
    • 停止:/bin/shutdown.sh
    • 配置文件:/conf/server.xml
    • 日志:/logs/catalina.out
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@localhost ~]# cd /usr/local/tomcat9/bin/
    [root@localhost bin]# ./startup.sh
    Using CATALINA_BASE: /usr/local/tomcat9
    Using CATALINA_HOME: /usr/local/tomcat9
    Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
    Using JRE_HOME: /usr/local/jdk1.8
    Using CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
    Using CATALINA_OPTS:
    Tomcat started.

    查看tomcat启动进程

    1
    2
    [root@localhost bin]# ps -ef | grep tomcat | grep -v grep
    root 16119 1 6 19:45 pts/0 00:00:04 /usr/local/jdk1.8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start

    查看tomcat日志

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost bin]# cd /usr/local/tomcat9/logs/
    [root@localhost logs]# ls
    catalina.2021-02-21.log host-manager.2021-02-21.log localhost_access_log.2021-02-21.txt
    catalina.out localhost.2021-02-21.log manager.2021-02-21.log
    [root@localhost logs]# tail -f catalina.out
    21-Feb-2021 19:45:13.915 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat9/webapps/docs]
    21-Feb-2021 19:45:13.947 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[/usr/local/tomcat9/webapps/docs]的部署已在[47]毫秒内完成
    21-Feb-2021 19:45:13.947 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat9/webapps/examples]
    21-Feb-2021 19:45:14.588 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[/usr/local/tomcat9/webapps/examples]的部署已在[641]毫秒内完成
    ……

    经过查看后,没有报错信息,Tomcat启动成功,我们浏览器访问:http://ip:8080,如果访问不成功,则需要关闭防火墙或者防火墙添加端口号

    1
    2
    3
    4
    5
    6
    [root@localhost logs]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
    success
    [root@localhost logs]# firewall-cmd --reload
    success
    [root@localhost logs]# firewall-cmd --permanent --zone=public --list-ports
    8080/tcp

    注意:如果阿里云服务,需要设置安全组开放8080的端口

    完成上面操作,重新加载,访问成功

    image-20210221201215749

  • Tomcat中的授权

    1
    2
    [root@localhost ~]# cd /usr/local/
    [root@localhost local]# chmod -R a+x tomcat9/

jeesite4 SpringBoot应用

使用的是jeesite4的一个开源项目,项目Git地址:https://gitee.com/jeanlv/jeesite4

将该项目git glone并用Idea打开,加载项目的依赖,具体查看

image-20210221210445615

下载到源代码,我们看到代码结构,目录deploy下是部署相关的脚本,具体部署参考文档:https://jeesite.com/docs/install-deploy/

MySQL安装与配置

Linux中按传统的安装与配置会非常的繁琐,因此本篇采用Docker安装配置

  1. 拉去镜像,我们拉去最新的mysql镜像,版本是mysql8系列的

    1
    2
    3
    4
    5
    6
    7
    [root@localhost ~]# docker pull mysql
    Using default tag: latest
    latest: Pulling from library/mysql
    a076a628af6f: Pull complete
    f6c208f3f991: Pull complete
    88a9455a9165: Pull complete
    ……
  1. 宿主机创建挂载的目录,并编写mysql相关配置

    1
    2
    3
    4
    5
    [root@localhost ~]# mkdir /usr/local/mysql_data
    [root@localhost ~]# cd /usr/local/mysql_data
    [root@localhost mysql_data]# touch my.cnf
    [root@localhost mysql_data]# ls
    my.cnf

    my.cnf内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [mysqld]
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    expire_logs_days=7
    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    max_connections=1000

    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8
  1. 启动mysql容器,并挂载相应的配置

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# docker run --restart=always --privileged=true -p 3306:3306 --name mysql -v /usr/local/mysql_data/log:/var/log/mysql -v /usr/local/mysql_data/data:/var/lib/mysql -v /usr/local/mysql_data/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql_data/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123123 -d mysql:latest
    401b286b9d15c10af4ded23d6f976ab54e445ee33ab7ec950904309c2b259e71
    [root@localhost ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    401b286b9d15 mysql:latest "docker-entrypoint.s…" 7 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
    cca651588eb3 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 2 days ago Up 2 days 50000/tcp, 0.0.0.0:8082->8080/tcp jenkins
  1. 根据jeesite4的部署文档中介绍,进入mysql容器中进行【创建用户和授权】设置

    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
    [root@localhost ~]# docker exec -it 401b286b9d15 bash
    root@401b286b9d15:/# mysql -uroot -p
    Enter password:
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.23 MySQL Community Server - GPL

    Copyright (c) 2000, 2021, Oracle and/or its affiliates.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> set global read_only=0;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set global optimizer_switch='derived_merge=off';
    Query OK, 0 rows affected (0.00 sec)

    mysql> create user 'jeesite'@'%' identified by 'jeesite';
    Query OK, 0 rows affected (0.01 sec)

    mysql> create database jeesite DEFAULT CHARSET 'utf8' COLLATE 'utf8_general_ci';
    Query OK, 1 row affected, 2 warnings (0.00 sec)

    mysql> grant all privileges on jeesite.* to 'jeesite'@'%';
    Query OK, 0 rows affected (0.01 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    mysql>
  1. 回到应用修改数据库连接,并执行脚本进行数据初始化

    • 打开文件jeesit4/web/src/main/resources/config/application.yml,数据库链接修改

      image-20210222130456643

    • 在进入jeesit4/web/bin中执行脚本init-data.sh(init-data.bat)进行初始化

      image-20210222130706717

  2. 完成以上配置,到数据库中检查数据库及数据表的生成

SpringBoot应用到Tomcat部署流

image-20210222121926486

Jenkins自由风格任务部署SpringBoot应用到Tomcat

SpringBoot应用到Tomcat部署的Shell脚本

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
#!/usr/bin/env bash

## 需要在Jenkins任务中配置以下参数
#export mysql_ip=mysql server ip or host
#export mysql_port=mysql port
#export mysql_user=mysql username
#export mysql_pwd=mysql password
#export TOMCAT_PATH=tomcat path
#export PROJ_PATH=project path

## 检查系统类型
export os_type=`uname`

## 停止tomcat的函数, 参数$1带入tomcat的路径$TOMCAT_PATH
killTomcat()
{
pid=`ps -ef|grep $1|grep java|awk '{print $2}'`
echo "tomcat Id list :$pid"
if [ "$pid" = "" ]
then
echo "no tomcat pid alive"
else
kill -9 $pid
fi
}

## 配置数据库参数,兼容MacOS系统,MacOS系统的os_type=Darwin
cd $PROJ_PATH/web/src/main/resources/config
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application.yml
else
sed -i "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "s/mysql_port/${mysql_port}/g" application.yml
sed -i "s/mysql_user/${mysql_user}/g" application.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application.yml
fi

## Maven 编译
cd $PROJ_PATH/root
mvn clean install -Dmaven.test.skip=true

## Maven 打包
cd $PROJ_PATH/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U

## 停止Tomcat
killTomcat $TOMCAT_PATH

## 删除tomcat中原有的工程
rm -f $TOMCAT_PATH/webapps/ROOT.war
rm -rf $TOMCAT_PATH/webapps/ROOT

## 复制/粘贴新web.war包到tomcat web应用部署路径,使用ROOT在浏览器访问直接http://ip:port,不需要在加其他的路径名
cp $PROJ_PATH/web/target/web.war $TOMCAT_PATH/webapps/
cd $TOMCAT_PATH/webapps/
mv web.war ROOT.war

## 启动tomcat
cd $TOMCAT_PATH/bin
sh startup.sh

Jenkins创建自由风格Job进行部署

注意:Jenkins的安装,如果是Docker安装的Jenkins会非常麻烦,需要挂载Tomcat,但在Docker容器中操作无权限,因此本篇采用的是Jenkins在官网下载的war包,放到Tomcat中启动即可。

  1. [新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页

  2. 配置”源码管理” -> “Git”

    image-20210222152333446

  3. “构建” -> “增加构建步骤” -> “执行shell”

    image-20210222152407722

    Shell脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BUILD_ID=DONTKILLME

    . ~/.bash_profile
    export mysql_ip=8.140.xxx.xxx
    export mysql_port=3306
    export mysql_user=root
    export mysql_pwd=123123
    export TOMCAT_PATH=/usr/local/tomcat9
    export PROJ_PATH=`pwd`/jeesite4

    sh jeesite4/deploy/deploy_tomcat.sh
  1. 完成以上配置后,点击[保存],回到Job页面,点击[Build Now]

    image-20210222152750633

  2. 进入Build Number查看“控制台输出”,查看执行的日志

    image-20210222152833733

  3. Job执行成功,浏览器访问:http://ip:8080

    image-20210222152531847

    默认最高管理员账号:system 密码:admin,登录后的页面

    image-20210222152634687

Jenkins Pipeline任务部署SpringBoot应用到Tomcat

SpringBoot应用到Tomcat部署的pipeline脚本

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
node('master') {
stage('同步源码') {
git([url: 'https://gitee.com/jeanlv/jeesite4.git', branch: '${branch}'])
}

stage('maven编译打包') {
sh '''
. ~/.bash_profile

export pwd=`pwd`
export os_type=`uname`
cd web/src/main/resources/config
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application.yml
else
sed -i "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "s/mysql_port/${mysql_port}/g" application.yml
sed -i "s/mysql_user/${mysql_user}/g" application.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application.yml
fi

cd $pwd/root
mvn clean install -Dmaven.test.skip=true

cd $pwd/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U
'''
}

stage('停止 tomcat') {
sh '''
## 停止tomcat的函数, 参数$1带入tomcat的路径$TOMCAT_PATH
killTomcat()
{
pid=`ps -ef|grep $1|grep java|awk '{print $2}'`
echo "tomcat Id list :$pid"
if [ "$pid" = "" ]
then
echo "no tomcat pid alive"
else
kill -9 $pid
fi
}
## 停止Tomcat
killTomcat $tomcat_home
'''
}

stage('清理环境') {
sh '''
## 删除原有war包
rm -f $tomcat_home/webapps/ROOT.war
rm -rf $tomcat_home/webapps/ROOT
'''
}

stage('部署新的war包') {
sh '''
cp web/target/web.war $tomcat_home/webapps/
cd $tomcat_home/webapps
mv web.war ROOT.war
'''
}

stage('启动tomcat') {
sh '''
JENKINS_NODE_COOKIE=dontkillme
cd $tomcat_home/bin
sh startup.sh
'''
}
}

Jenins创建流水线Job进行部署

  1. [新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页

  2. [General] -> [This project is parameterized]进行参数配置,mysql、tomcat路径相关的配置信息等

    image-20210222165800141

  3. 配置”流水线” -> “定义”选择”Pipeline script from SCM”,配置Git信息

    image-20210222170004497

    配置Groovy脚本的路径

    image-20210222170048840

  4. 完成以上配置后,点击[保存],回到Job页面,点击[Build with Parameters],查看配置的参数

    image-20210222170217337

  5. 点击[开始构建],查看“控制台日志”

    image-20210222170303900

  6. 查看到是执行成功的,回到Job Build页面,查看流水线执行图

    image-20210222170355332

我们看到流水线执行图,清晰明了,很清楚的看到在部署的时候执行的过程,在配置的过程也是灵活便捷,因此在持续交付的过程中,推荐该方式。

这时我们浏览器再次访问:http://ip:8080,访问成功

image-20210222170613672

用户名:system 密码:admin,查看登录后的页面

image-20210222170702987

之后,我们在配置GitLab或Github的WebHook,就可以完成,提交代码立即构建并部署环境,完成整个流水线的过程。

注意:本篇有个很大的坑,我将Jenkins和SpringBoot应用部署到了同一个tomcat中,因此引发的问题是,Job在跑的时候,会停止tomcat因此,Jenkins也会被干掉,之后的步骤就不会执行,后面在实际操作的时候,注意要区分这里。