Tomcat

目录

1.tomcat概述

tomcat构成

Tomcat功能组件结构

Container结构

Tomcat请求过程

2.Tomcat服务部署

实验准备安装java环境部署

安装jdk

设置JDK环境变量

实验java

安装启动tomcat

优化tomcat启动速度

将Tomcat添加至服务

3.Tomcat虚拟主机配置

[创建 yy和 ikun目录和文件](#创建 yy和 ikun目录和文件)

[修改 Tomcat主配置文件](#修改 Tomcat主配置文件)

Host

Context

验证

4.Tomcat多实例部署

安装tomcat

配置tomcat环境变量

[修改 tomcat2中的 server.xml文件](#修改 tomcat2中的 server.xml文件)

[修改各 tomcat 实例中的startup.sh和 shutdown.sh文件,添加 tomcat 环境变量](#修改各 tomcat 实例中的startup.sh和 shutdown.sh文件,添加 tomcat 环境变量)

[启动各 tomcat中的/bin/startup.sh](#启动各 tomcat中的/bin/startup.sh)

浏览器访问测试


1.tomcat概述

  • Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。
  • Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。

tomcat构成

  • Web 容器:完成 Web 服务器的功能。
  • Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
  • JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。

servlet:Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。

  • 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 之间相互独立

Container结构

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

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

Tomcat请求过程

  • 用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得
  • Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
  • 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
  • 执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。

2.Tomcat服务部署

实验准备安装java环境部署

bash 复制代码
jdk-8u361-linux-x64.tar.gz 
apache-tomcat-9.0.16.tar.gz           #在部署Tomcat之前必须安装好jdk

systemctl stop firewalld
systemctl disable firewalld
setenforce 0                          #关防火墙

安装jdk

bash 复制代码
cd /opt
tar -xf apache-tomcat-9.0.16.tar.gz
tar -xf jdk-8u361-linux-x64.tar.gz        #解压文件

java -version                             #查看当前java版本

设置JDK环境变量

bash 复制代码
mkdir -p /usr/java                #先在此目录下创建一个java目录
mv jdk1.8.0_361/ /usr/java        #将此文件移动过去

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_361
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

java 复制代码
vim Hello.java                              #编写一个java脚本

public class Hello {
 public static void main(String[] args){
   System.out.println("Hello yy!");
  }
}                                           #java格式,输出一个hello yy

javac Hello.java                            #将java脚本编译
java Hello                                  #执行脚本

安装启动tomcat

bash 复制代码
cd /opt
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                         #查看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_361"
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

优化tomcat启动速度

bash 复制代码
#第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。

vim /usr/java/jdk1.8.0_361/jre/lib/security/java.security

securerandom.source=file:/dev/urandom     #117行修改

/usr/local/tomcat/bin/shutdown.sh         #重启服务
  • tomcat 启动慢的原因是随机数产生遭到阻塞,遭到阻塞的原因是 熵池大小
  • /dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞
  • /dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大

将Tomcat添加至服务

bash 复制代码
/usr/local/tomcat/bin/shutdown.sh           #关闭tomcat服务
useradd -s /sbin/nologin tomcat             #创建程序用户
chown tomcat:tomcat /usr/local/tomcat/ -R   #添加用户设置属主属组

vim /etc/systemd/system/tomcat.service      #新建服务文件

[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target 

systemctl daemon-reload
systemctl start tomcat
ss -ntap |grep 8080                          #重新加载配置文件,查看8080端口

3.Tomcat虚拟主机配置

创建 yy和 ikun目录和文件

bash 复制代码
mkdir /usr/local/tomcat/webapps/yy
mkdir /usr/local/tomcat/webapps/ikun
echo "This is yy page\!" > /usr/local/tomcat/webapps/yy/index.html
echo "This is ikun page\!" > /usr/local/tomcat/webapps/ikun/index.html

修改 Tomcat主配置文件

bash 复制代码
vim /usr/local/tomcat/conf/server.xml 
#165行前插入#
   
    <Host name="www.yy.com"  appBase="/usr/local/tomcat/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
      <Context docBase="/usr/local/tomcat/webapps/yy" path="" reloadable="true" />
</Host>
    
    <Host name="www.ikun.com"  appBase="/usr/local/tomcat/webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
      <Context docBase="/usr/local/tomcat/webapps/ikun" path="" reloadable="true" />
</Host>

systemctl stop tomcat
systemctl start tomcat                   #重新加载程序

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

验证

4.Tomcat多实例部署

安装tomcat

bash 复制代码
cd /opt
tar xf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

配置tomcat环境变量

bash 复制代码
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                 #加载此脚本

修改 tomcat2中的 server.xml文件

bash 复制代码
vim /usr/local/tomcat/tomcat2/conf/server.xml

#22行,修改Server prot,默认为8005 -> 修改为8006
<Server port="8006" shutdown="SHUTDOWN">

#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8081" protocol="HTTP/1.1"

#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

修改各 tomcat 实例中的startup.sh和 shutdown.sh文件,添加 tomcat 环境变量

bash 复制代码
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

启动各 tomcat中的/bin/startup.sh

bash 复制代码
/usr/local/tomcat/tomcat1/bin/startup.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh
netstat -natp | grep java

浏览器访问测试

bash 复制代码
http://192.168.88.31:8080
http://192.168.88.31:8081

相关推荐
2401_854391087 分钟前
城镇住房保障:SpringBoot系统功能概览
java·spring boot·后端
hummhumm9 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
wainyz18 分钟前
Java NIO操作
java·开发语言·nio
工业3D_大熊23 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
lzb_kkk32 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
爬山算法1 小时前
Maven(28)如何使用Maven进行依赖解析?
java·maven
2401_857439691 小时前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索1 小时前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨1 小时前
Filter和Listener
java·filter