一、Tomcat概述:
Tomcat:
Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。
使用场景:
作为Web服务器,处理静态网页请求,如html页面,但是性能一般(只有nginx的六分之一);
作为Servlet/JSP容器,运行JAVA语言开发的jsp动态网页程序,并作为中间件实现前端Web和后端数据库的协同工作,这也是tomcat的主要应用场景。
Tomcat的组成:
Tomcat 由一系列的组件构成,其中核心的组件有三个:
Web 容器:完成 Web 服务器的功能。
Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。
Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户的.jsp动态页面的请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。
什么是 servlet?
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
什么是 JSP?
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。
JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
Tomcat功能组件结构
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
●Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
●Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,它们是父子关系,用于管理和调用 Servlet 相关逻辑。
●Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。
每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器:
engine:引擎,管理多个虚拟主机,一个container只有一个engine
host:一个host代表一个虚拟主机站点
context:管理web网页应用程序
wrapper:servlet封装器,负责处理业务逻辑,对象实例的创建、执行、销毁等动作
容器 由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 封装器。
Tomcat 请求过程:
1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。
Tomcat的端口:
tcp 8080 负责接收http请求连接的端口 8443 负责接收https请求连接的端口
8005 用于接收关闭tomcat服务信号的端口
8009 AJP协议端口,用于与Apache连接使用的端口
二、Tomcat部署
关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
系统初始化
[root@l1 ~]# systemctl stop firewalld.service
[root@l1 ~]# setenforce 0
[root@l1 ~]# vim /etc/selinux/config
安装jdk(两种安装方式)
第一种方式:yum安装
检查yum挂载情况
[root@l1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 1913544 0 1913544 0% /dev
tmpfs 1930624 0 1930624 0% /dev/shm
tmpfs 1930624 12560 1918064 1% /run
tmpfs 1930624 0 1930624 0% /sys/fs/cgroup
/dev/mapper/centos-root 38770180 5434732 33335448 15% /
/dev/sda1 1038336 191104 847232 19% /boot
tmpfs 386128 12 386116 1% /run/user/42
tmpfs 386128 0 386128 0% /run/user/0
[root@l1 ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@l1 ~]# cd /mnt/Packages/
[root@l1 Packages]# ls | grep -i java
[root@l1 Packages]# yum install -y java-1.8.0-*
[root@l1 Packages]# java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
[root@l1 Packages]#
第二种方式(软件包安装)
1.官网下载软件包
2.将软件包上传到/opt目录中
[root@l1 ~]# cd /opt/
[root@l1 opt]# ls
rh
[root@l1 opt]# ls
jdk-8u391-linux-x64.rpm jdk-8u391-linux-x64.tar.gz rh
[root@l1 opt]#
3.一个是rpm安装
查看rpm包的指定列表,发现都在/usr/lib/jvm目录中
[root@l1 opt]# rpm -qpl jdk-8u391-linux-x64.rpm
4.另一个是tar安装(可以自己指定目录)
[root@l1 opt]# tar xf jdk-8u391-linux-x64.tar.gz
[root@l1 opt]# ls
jdk1.8.0_391 jdk-8u391-linux-x64.rpm jdk-8u391-linux-x64.tar.gz rh
[root@l1 opt]# mv jdk1.8.0_391/ /usr/local/
[root@l1 opt]# cd /usr/local/
[root@l1 local]# ls
bin games jdk1.8.0_391 lib64 sbin src
etc include lib libexec share
[root@l1 local]# cd jdk1.8.0_391/
[root@l1 jdk1.8.0_391]# ls
bin jvisualvm.txt release
COPYRIGHT legal src.zip
include lib THIRDPARTYLICENSEREADME-JAVAFX.txt
javafx-src.zip LICENSE THIRDPARTYLICENSEREADME.txt
jmc.txt man
jre README.html
[root@l1 jdk1.8.0_391]#
jdk1.8.0_391的bin目录是存放java命令的,jre目录包含java的运行环境,lib目录包含java运行时需要的架构包
5.清除之前的jdk
[root@l1 jdk1.8.0_391]# yum -y remove java-1.8.0-*
[root@l1 jdk1.8.0_391]# yum -y remove java-1.7.0-*
[root@l1 jdk1.8.0_391]# java -version
-bash: /usr/bin/java: 没有那个文件或目录
[root@l1 jdk1.8.0_391]#
6.配置环境变量
[root@l1 jdk1.8.0_391]# java -version
-bash: /usr/bin/java: 没有那个文件或目录
[root@l1 jdk1.8.0_391]# vim /etc/profile
———————————————————————————末行添加———--------------———————————
export JAVA_HOME=/usr/local/jdk1.8.0_391
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
——————————————————————————————————————————————————————————————
[root@l1 jdk1.8.0_391]# source /etc/profile
[root@l1 jdk1.8.0_391]# java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)
[root@l1 jdk1.8.0_391]#
7.验证jdk环境是否安装成功
[root@l1 jdk1.8.0_391]# cd ~
[root@l1 ~]# ls
anaconda-ks.cfg 公共 视频 文档 音乐
initial-setup-ks.cfg 模板 图片 下载 桌面
[root@l1 ~]#
[root@l1 ~]# vim hello.java
—————————————————————————插入———————————————————————————————————————
public class hello {
public static void main(String [] args){
System.out.println("Hello World");
}
}
————————————————————————————————————————————————————————————————
[root@l1 ~]# javac hello.java
[root@l1 ~]# ls
anaconda-ks.cfg hello.java 公共 视频 文档 音乐
hello.class initial-setup-ks.cfg 模板 图片 下载 桌面
[root@l1 ~]# java hello
Hello World
[root@l1 ~]#
安装并启动Tomcat:
上传压缩包并解压:
tomcat目录中的bin目录有tomcat启动停止的脚本,conf目录有tomcat常用的配置文件,logs目录存放日志,lib目录存放着tomcat的架构包,temb目录存放着tomcat运行时的产生的一些临时文件,webapps目录存放web程序,work目录是tomcat的工作目录
[root@l1 ~]# cd /opt/
[root@l1 opt]# ls
jdk-8u391-linux-x64.rpm jdk-8u391-linux-x64.tar.gz rh
[root@l1 opt]# tar xf apache-tomcat-9.0.16.tar.gz
[root@l1 opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat
[root@l1 opt]# cd /usr/local/
[root@l1 local]# ls
bin games jdk1.8.0_391 lib64 sbin src
etc include lib libexec share tomcat
[root@l1 local]# cd tomcat/
[root@l1 tomcat]# ls
bin lib README.md webapps
BUILDING.txt LICENSE RELEASE-NOTES work
conf logs RUNNING.txt
CONTRIBUTING.md NOTICE temp
[root@l1 tomcat]#
开启tomcat :
##启动tomcat ##
#后台启动
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start
#前台启动
/usr/local/tomcat/bin/catalina.sh run
netstat -natp | grep 8080
浏览器访问Tomcat的默认主页 http://192.168.80.100:8080
#systemd 管理控制启动
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_201-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl restart tomcat #启动
systemctl enable tomcat #配置自启
systemctl stop tomcat #停止服务
systemctl status tomcat #检测状态
[root@l1 tomcat]# cd bin/
[root@l1 bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_391/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@l1 bin]# netstat -lntp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 9542/java
[root@l1 bin]#
显示已成功开启:
关闭tomcat:
[root@l1 bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_391/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@l1 bin]# netstat -lntp | grep 8080
[root@l1 bin]#
./catalina.sh start/stop也可以实现后台启动/关闭tomcat,./catalina.sh run可实现前台启动tomcat,要想停止,ctrl+c即可 。nginx前台启动:/usr/local/nginx -g "daemon off;"
添加tomcat.service系统服务
[root@l1 bin]# cd /usr/lib/systemd/system
[root@l1 system]# vim tomcat.service
——————————————————————————插入————————————————————————————————————————————————
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk1.8.0_391"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
————————————————————————————————————————————————————————————————————————————————
[root@l1 system]# systemctl restart tomcat.service
[root@l1 system]# systemctl enable tomcat.service
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
[root@l1 system]# netstat -lntp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 10096/java
[root@l1 system]# systemctl stop tomcat.service
[root@l1 system]# netstat -lntp | grep 8080
[root@l1 system]#
优化tomcat启动速度:
优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改
securerandom.source=file:/dev/urandom
----------------------------------------------------------------------------------------------------------
●tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小 。
●/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。
●/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
●Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
----------------------------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
ll /usr/local/tomcat/
------主要目录说明----------------------------------------------------------------------------------------------
●bin:存放启动和关闭 Tomcat 的脚本文件,如 catalina.sh、startup.sh、shutdown.sh
●conf:存放 Tomcat 服务器的各种配置文件,如主配置文件 server.xml 和 应用默认的部署描述文件 web.xml
●lib:存放 Tomcat 运行需要的库文件的 jar 包,一般不作任何改动
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用项目资源的目录
●work:Tomcat 的工作目录,存放 jsp 编译后产生的 class 文件
----------------------------------------------------------------------------------------------------------
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改
[root@l1 system]# vim /usr/local/jdk1.8.0_391/jre/lib/security/java.security
[root@l1 system]#
[root@l1 system]# systemctl restart tomcat.service
[root@l1 system]# systemctl status tomcat.service
三、 Tomcat虚拟主机配置
---------------------Tomcat 虚拟主机配置-------------------------
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.xy101.com 和 www.xy102.com, 希望通过这两个域名访问到不同的项目内容。
1.创建 xy101 和 xy102 项目目录和文件
mkdir /usr/local/tomcat/webapps/xy101
mkdir /usr/local/tomcat/webapps/xy102
echo "This is xy101 page\!" > /usr/local/tomcat/webapps/xy101/index.jsp
echo "This is xy102 page\!" > /usr/local/tomcat/webapps/xy102/index.jsp
2.修改 Tomcat 主配置文件 server.xml
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.xy101.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xy101" path="" reloadable="true" />
</Host>
<Host name="www.xy102.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xy102" path="" reloadable="true" />
</Host>
----------------------------------------------------------------------------------------------------------
Host
name:主机名
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
Context
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空"",则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
----------------------------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
3.客户端浏览器访问验证
echo "192.168.80.100 www.xy101.com www.xy102.com" >> /etc/hosts
浏览器访问 http://www.xy101.com:8080/ 页面显示This is xy101 page\!
浏览器访问 http://www.xy102.com:8080/ 页面显示This is xy102 page\!
----------------------------------------------------------------------------------------------------------
HTTP 请求过程:
(1)Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是 www.xy101.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
(3)访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/xy101 目录,解析 index.jsp 并返回。
----------------------------------------------------------------------------------------------------------
1.创建 xy101 和 xy102 项目目录和文件
例如现在新增两个域名 www.xy101.com 和 www.xy102.com, 希望通过这两个域名访问到不同的项目内容
[root@l1 system]# cd /usr/local/tomcat/webapps/
[root@l1 webapps]# mkdir xy{101,102}
[root@l1 webapps]# ls
docs examples host-manager manager ROOT xy101 xy102
[root@l1 webapps]# echo "xxbb yyds\!" > xy101/index.jsp
[root@l1 webapps]# echo "sbbb yyds\!" > xy102/index.jsp
[root@l1 webapps]#
2.修改 Tomcat 主配置文件 server
[root@l1 webapps]# vim /usr/local/tomcat/conf/server.xml
[root@l1 webapps]#
——————————————————————————165行之前添加————————————————————————————————————————
<Host name="www.xy101.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xy101" path="" reloadable="true" />
</Host>
<Host name="www.xy102.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/xy102" path="" reloadable="true" />
</Host>
————————————————————————————————————————————————————————————————————————————————
3.在hosts文件中添加内容
在浏览器输入http://www.xy101.com:8080 http://www.xy102.com:8080
Tomcat多实例部署:
1)修改tomcat主配置文件 server.xml 中的三个端口号 8080 8005 8009,每个实例要不一样
2)修改tomcat启动停止脚本 startup.sh shutdown.sh ,添加环境变量 export TOMCAT_HOME CATALINA_HOME CATALINA_BASE 都指向每个实例各自的工作目录
---------------------Tomcat多实例部署---------------------
1.安装好 jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
3.配置 tomcat 环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
source /etc/profile.d/tomcat.sh
4.修改 tomcat2 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN"> #22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1" #69行,修改Connector port,HTTP/1.1 默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> #116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
----------------------------------------------------------------------------------------------------------
第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器默认监听8009端口,为AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口。
8005端口,关闭Tomcat时使用。
----------------------------------------------------------------------------------------------------------
5.修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/tomcat1/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat2/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
6.启动各 tomcat 中的 /bin/startup.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
netstat -natp | grep java
7.浏览器访问测试
http://192.168.80.101:8080
http://192.168.80.101:8081
1.重新生成一个Tomcat
[root@l1 webapps]# cd /opt/
[root@l1 opt]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u391-linux-x64.tar.gz
jdk-8u391-linux-x64.rpm rh
[root@l1 opt]# tar xf apache-tomcat-9.0.16.tar.gz
[root@l1 opt]# mv apache-tomcat-9.0.16 /usr/local/tomcat2
[root@l1 opt]# cd /usr/local/
[root@l1 local]# ls
bin games jdk1.8.0_391 lib64 sbin src tomcat2
etc include lib libexec share tomcat
[root@l1 local]# systemctl stop tomcat.service
[root@l1 local]# netstat -lntp | grep java
[root@l1 local]#
2.修改tomcat2中的server.xml文件,要求各tomcat实例配置不能有重复的端口号
3.配置tomcat启动的环境变量
[root@l1 local]# vim /usr/local/tomcat/bin/startup.sh
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat
[root@l1 local]# vim /usr/local/tomcat/bin/shutdown.sh
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat
[root@l1 local]# vim /usr/local/tomcat2/bin/startup.sh
export TOMCAT_HOME=/usr/local/tomcat2
export CATALINA_HOME=/usr/local/tomcat2
export CATALINA_BASE=/usr/local/tomcat2
[root@l1 local]# vim /usr/local/tomcat2/bin/shutdown.sh
export TOMCAT_HOME=/usr/local/tomcat2
export CATALINA_HOME=/usr/local/tomcat2
export CATALINA_BASE=/usr/local/tomcat2
[root@l1 local]# ./tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_391/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@l1 local]# ./tomcat2/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat2
Using CATALINA_HOME: /usr/local/tomcat2
Using CATALINA_TMPDIR: /usr/local/tomcat2/temp
Using JRE_HOME: /usr/local/jdk1.8.0_391/jre
Using CLASSPATH: /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar
Tomcat started.
[root@l1 local]#
[root@l1 local]# netstat -lntp | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 11578/java
tcp6 0 0 127.0.0.1:8006 :::* LISTEN 11632/java
tcp6 0 0 :::8009 :::* LISTEN 11578/java
tcp6 0 0 :::8010 :::* LISTEN 11632/java
tcp6 0 0 :::8080 :::* LISTEN 11578/java
tcp6 0 0 :::8081 :::* LISTEN 11632/java
[root@l1 local]#