前言

  • Tomcat 是 java 语言开发的,Tomcat 服务器是一个免费开放源代码的Web应用服务器,是Apache软件基金会的Jakarta 项目的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

  • Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。

  • 一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。

Tomcat组件

在这里插入图片描述

Tomcat 功能组件结构:
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。

●Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
●Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。
●Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。

Container 结构分析:

  • 每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器:

  • 4个子容器的作用分别是:

    • (1)Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
    • (2)Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
    • (3)Context:代表一个 Web 应用,包含多个 Servlet 封装器;
    • (4)Wrapper:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
  • Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。

  • 容器 由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 封装器。

总结

  • connector 连接器:暴露监听端口,接收客户端发来的请求和返回响应消息给客户端

  • container 容器:负责处理用户的业务请求,由四个子容器 engine、host、context、wrapper 组成,且他们是父子关系

    • engine:引擎,管理多个虚拟主机

    • host:一个 host 代表一个虚拟主机

    • context:web 应用的路径

    • wrapper:servlet 封装器,负责处理业务逻辑

客户端请求的过程

在这里插入图片描述

  • 客户端(浏览器)----> connector(暴露的TCP 8080端口)----> container(engine)----> host ----> context ----> wrapper

    • container(engine):根据域名发送给对应的虚拟主机

    • host:根据用户的访问URL路径发送给对应的context

    • context:根据URL路径的web应用发送给对应的wrapper

    • wrapper:根据应用程序处理业务逻辑

    • wrapper处理完之后会一层一层返回回去

  • Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。

java 所需环境

java 需要 jdk 环境

jdk 包 通常包含 JDK、JRE、JVM

JDK:java开发工具

JRE:java编译、运行环境

JVM:java虚拟机,可使java程序在不同平台上运行

jdk 版本

jdk版本1.8最常用 -->jdk11 --> jdk17 --> jdk20(最新)

Tomcat服务部署

在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。

  1. 关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
    jdk-8u201-linux-x64.rpm
    apache-tomcat-9.0.16.tar.gz
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
  1. 安装JDK
    cd /opt
    rpm -qpl jdk-8u201-linux-x64.rpm
    rpm -ivh jdk-8u201-linux-x64.rpm
    java -version

  2. 设置JDK环境变量
    vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile.d/java.sh
java -version


注释

JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
dt.jar:dt.jar是关于运行环境的类库,主要是swing包。

首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,打印 “Hello World”。

vim Hello.java
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)

public class Hello {			
  public static void main(String[] args){
    System.out.println("Hello world!");
  }
}

javac Hello.java
java Hello

  1. 安装启动Tomcat
    cd /opt
    tar zxvf apache-tomcat-9.0.16.tar.gz
    mv apache-tomcat-9.0.16 /usr/local/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 端口号8080查看是否开启

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命令 控制 tomcat 时需要先用/usr/local/tomcat/bin/shutdown.sh 关闭tomcat

浏览器访问Tomcat的默认主页 http://192.168.60.5:8080
在这里插入图片描述

5.优化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 的工作目录,存放 Web 应用代码生成和编译文件

Tomcat 虚拟主机配置

很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.ccc.com 和 www.bbb.com, 希望通过这两个域名访问到不同的项目内容

1.创建 ccc 和 bbb 项目目录和文件
mkdir /usr/local/tomcat/webapps/ccc

mkdir /usr/local/tomcat/webapps/bbb

echo “This is ccc page!” > /usr/local/tomcat/webapps/ccc/index.jsp

echo “This is bbb page!” > /usr/local/tomcat/webapps/bbb/index.jsp

2.修改 Tomcat 主配置文件 server.xml
vim /usr/local/tomcat/conf/server.xml

--165行前--插入
<Host name="www.ccc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/ccc" path="" reloadable="true" />
</Host>

<Host name="www.bbb.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/bbb" 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

  1. 客户端浏览器访问验证

echo “192.168.60.5 www.ccc.com www.bbb.com” >> /etc/hosts
浏览器访问 http://www.ccc.com:8080/ 页面显示This is ccc page!

在这里插入图片描述

浏览器访问 http://www.bbb.com:8080/ 页面显示This is bbb page!

在这里插入图片描述

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

  1. 修改 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

注释

tomcat 端口:
tcp 8080:负责处理http请求连接
tcp 8443:负责处理https请求连接
tcp 8005:关闭tomcat服务使用
tcp 8009:AJP协议端口,与apache连接使用,apache可通过AJP协议访问tomcat的8009端口
  1. 修改各 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
  1. 启动各 tomcat 中的 /bin/startup.sh

/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh

netstat -natp | grep java

在这里插入图片描述

  1. 浏览器访问测试

http://192.168.60.5:8080
在这里插入图片描述

http://192.168.60.5:8081
在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐