[Linux] Tomcat

一、Tomcat相关知识

1.1 Tomcat的简介 

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

1.2 Tomcat的组件构成 

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

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

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

 JSP: 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。也是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

1.3 Tomcat的功能组件结构 

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

Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。  

Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。


Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。

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这四个容器之间属于层层递进的父子关系

容器 由一个引擎(Engine)可以管理多个虚拟主机(Host)每个虚拟主机(Host)可以管理多个 Web 应用(Context)。每个 Web 应用会有多个 Servlet 封装器(Wrapper)。 

1.4 Tomcat的请求过程 

        用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;

        Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;

        请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。

        执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。 

 

二、Tomcat服务的部署 

本次部署准备的版本安装包(版本根据需求): jdk-8u201-linux-x64.rpm(jdk环境包,是tomcat的运行环境)        apache-tomcat-9.0.16.tar.gz(tomcat服务软件包)

步骤一:搭建Tomcat运行环境  

(1)关闭防火墙和selinux,防止其对安装过程的干扰
systemctl stop firewalld
systemctl disable --now firewalld
setenforce 0
(2)将准备好的软件包拖入/opt目录下,进行安装

(3)设置jdk的环境变量 

设置全局的环境变量,一般会有两种方式(本次部署采用第二种方式):

方式一:直接对 /etc/profile(全局变量配置文件进行改变)

方式二:在/etc/profile.d/  目录下创建相关的 .sh 脚本,profile有默认调用的功能。(推荐使用,便于变量的管理)

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_361-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
 

拓展知识:

CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。

 

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

(4)编写一个java 简易的源代码,进行环境测试

vim Hello.java
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)
public class Hello {			
  public static void main(String[] args){
    System.out.println("Hello world!");
  }
}

#编译源代码
javac Hello.java
#运行源代码
java Hello

步骤二:安装启动tomcat 

(1)安装Tomcat

cd /opt
#解压tomcat软件包
tar zxvf apache-tomcat-8.5.16.tar.gz
 
#移动至服务软件包统一管理目录中,并且简易其名称
mv apache-tomcat-8.5.16 /usr/local/tomcat

 (2)启动Tomcat 

 注意:Tomcat服务启动时会占用8080端口

#后台启动
/usr/local/tomcat/bin/startup.sh 
或
/usr/local/tomcat/bin/catalina.sh start	
	

#前台启动
/usr/local/tomcat/bin/catalina.sh run	

 

#关闭后台运行的tomcat
/usr/local/tomcat/bin/shutdown.sh 
(3)开启tomcat服务,测试访问tomcat的默认首页 

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服务使用拓展:优化启动速度 

vim /usr/local/jdk1.8.0_361/jre/lib/security
 
--117行--修改
securerandom.source=file:/dev/urandom

原理说明:

 ●tomcat 启动慢的原因是随机数(产生随机数的函数 random)产生遭到阻塞,遭到阻塞的原因是 熵池大小 。


●/dev/random:阻塞型,读取它就会产生随机数据,但该数据取决于熵池噪声,当熵池空了,对/dev/random 的读操作也将会被阻塞。


●/dev/urandom:非阻塞的随机数产生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

三、Tomcat的虚拟主机配置 

3.1 实验目的

 现在新增两个域名 www.cxk.com 和 www.xhz.com, 希望通过这两个域名访问到不同的项目内容。

3.2 实验前准备

搭建好相关的的jdk环境,并且保证tomcat的能够正常运行使用

3.3 实验步骤  

(1)创建 yang 和 wang 项目目录和文件
mkdir /usr/local/tomcat/webapps/cxk
mkdir /usr/local/tomcat/webapps/xhz
cd /usr/local/tomcat/webapps
echo "this is cxk.test web" > xhz/index.jsp
echo "this is xhz.test web" > cxk/index.jsp
   (2)修改 Tomcat 主配置文件 server.xml 
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.yang.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/yang" path="" reloadable="true" />
</Host>
 
<Host name="www.wang.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/wang" 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

HTTP 请求过程:

  1. Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
  2. 因为引擎的默认虚拟主机是 www.yang.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
     
  3. 访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/yang 目录,解析 index.jsp 并返回。 
(3)重启Tomcat服务  
#关闭Tomcat服务
/usr/local/tomcat/bin/shutdown.sh
#启动Tomcat服务
/usr/local/tomcat/bin/startup.sh
 (4) 进行本地域名IP映射导入 ,测试访问
echo "192.168.136.100 www.cxk.com www.xhz.com" >/etc/hosts

访问测试:

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 07:36:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 07:36:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 07:36:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 07:36:02       20 阅读

热门阅读

  1. msSQL和MySQL的区别?

    2023-12-13 07:36:02       51 阅读
  2. MySQL忘记root密码和修改root密码的解决方法

    2023-12-13 07:36:02       34 阅读
  3. 【解惑系列】如何提高一个接口的tps

    2023-12-13 07:36:02       37 阅读
  4. JVM类加载机制(中)

    2023-12-13 07:36:02       42 阅读
  5. React Context:跨层级组件共享状态参数、状态

    2023-12-13 07:36:02       36 阅读
  6. k8s 安装firewalld导致的网络疑难问题处理

    2023-12-13 07:36:02       36 阅读
  7. vue-socket.io以及原生websocket的使用

    2023-12-13 07:36:02       28 阅读
  8. http 与 websocket

    2023-12-13 07:36:02       37 阅读
  9. GEE(ccdc)——连续变化检测和分类 (CCDC)概述

    2023-12-13 07:36:02       34 阅读
  10. ElasticSearch高可用集群搭建

    2023-12-13 07:36:02       35 阅读