Tomcat

Tomcat

概述

Tomcat 是由 Java 语言开发的,它是一个免费的开放源代码的 Web 应用服务器,隶属于 Apache 软件基金会的 Jakarta 项目。Tomcat 由 Apache、Sun 及其他一些公司和个人共同开发而成,因其轻量级和灵活性,在中小型系统和并发访问量适中的场合下被广泛应用。Tomcat 不仅是开发和调试 JSP 程序的首选,还常常作为 Servlet 和 JSP 容器,在后端独立运行。

Tomcat 核心组件

Tomcat 主要由以下几个核心组件构成:

  1. Web 容器:负责完成 Web 服务器的功能,能够处理 HTTP 请求并返回响应。
  2. Servlet 容器(Catalina):专门用于处理 Servlet 代码,是 Tomcat 的核心部分,负责 Servlet 的生命周期管理。
  3. JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码并执行,使得 JSP 页面能够动态生成内容。

Servlet 与 JSP

  • Servlet:Java Servlet 的简称,是运行在服务器端的 Java 应用程序,用于接收客户端请求、处理业务逻辑并返回响应。Servlet 充当了客户端和数据库之间的桥梁,是实现动态网页的重要技术。
  • JSP(Java Server Pages):一种用于创建动态网页的技术,允许在 HTML 页面中嵌入 Java 代码。JSP 页面最终会被编译成 Servlet 执行。JSP 简化了页面的开发,使得开发人员可以更加专注于业务逻辑的处理。

Tomcat 功能组件结构

Tomcat 的核心功能由两大组件构成:

  1. Connector:负责对外接收和响应请求,是 Tomcat 与外界的通信接口。
  2. Container:负责对内处理业务逻辑,包括 Engine、Host、Context 和 Wrapper 四个子容器,用于管理和调用 Servlet 相关逻辑。

Container 结构分析

  • Engine:引擎,用于管理多个虚拟主机。
  • Host:虚拟主机,代表一个站点,可以配置多个 Host 来添加不同的站点。
  • Context:Web 应用,包含多个 Servlet 封装器,代表了一个 Web 应用的运行环境。
  • Wrapper :封装器,容器的最底层,封装了一个 Servlet 实例,负责 Servlet 的创建、执行和销毁。
    这四个容器之间构成父子关系,从上到下依次为 Engine -> Host -> Context -> Wrapper,每个容器都管理着下一级的容器或组件。

Tomcat 请求过程

  1. 用户在浏览器中输入网址,请求发送到 Tomcat 监听的端口(默认为 8080)。
  2. Connector 接收到请求后,将其交给对应的 Service 中的 Engine 来处理。
  3. 请求在 Engine、Host、Context 和 Wrapper 之间层层传递,最终在相应的 Servlet 中执行业务逻辑。
  4. Servlet 处理完成后,将响应结果返回给 Wrapper,然后通过 Context、Host 和 Engine 返回给 Connector。
  5. Connector 将最终的响应发送给客户端(浏览器),用户看到请求的页面或结果。

Tomcat服务部署指南

前提条件

在部署Tomcat之前,确保已安装JDK,因为它是Tomcat运行的必要环境。

部署步骤

  1. 关闭防火墙并传输软件包

    • 关闭防火墙:

      bash 复制代码
      systemctl stop firewalld
      systemctl disable firewalld
      setenforce 0
    • 将Tomcat和JDK安装包传输到/opt目录。

  2. 安装JDK

    • 进入/opt目录并查看JDK包内容:

      bash 复制代码
      cd /opt
      rpm -qpl jdk-8u201-linux-x64.rpm
    • 安装JDK:

      bash 复制代码
      rpm -ivh jdk-8u201-linux-x64.rpm
    • 验证安装:

      bash 复制代码
      java -version
  3. 设置JDK环境变量

    • 编辑/etc/profile.d/java.sh文件,添加以下内容:

      bash 复制代码
      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
    • 使环境变量生效:

      bash 复制代码
      source /etc/profile.d/java.sh
    • 再次验证Java版本:

      bash 复制代码
      java -version
  4. 编写和运行Java程序

  • 使用文本编辑器编写Java源代码文件(如Hello.java):

    java 复制代码
    public class Hello {			
      public static void main(String[] args){
        System.out.println("Hello world!");
      }
    }
  • 编译Java源代码:

    bash 复制代码
    javac Hello.java
  • 运行编译后的字节码文件:

    bash 复制代码
    java Hello
  1. 安装并启动Tomcat

    • 解压Tomcat压缩包并移动到指定目录:

      bash 复制代码
      cd /opt
      tar zxvf apache-tomcat-9.0.16.tar.gz
      mv apache-tomcat-9.0.16 /usr/local/tomcat
    • 启动Tomcat(后台启动):

      bash 复制代码
      /usr/local/tomcat/bin/startup.sh
    • 或者使用catalina.sh脚本启动:

      bash 复制代码
      /usr/local/tomcat/bin/catalina.sh start
    • 检查Tomcat是否在8080端口运行:

      bash 复制代码
      netstat -natp | grep 8080
    • 浏览器访问Tomcat默认主页:http://<your-server-ip>:8080

  2. 使用systemd管理Tomcat

    • 创建tomcat.service文件:

      bash 复制代码
      vim /usr/lib/systemd/system/tomcat.service
    • 添加以下内容:

    ini 复制代码
     # 描述服务
     Description=tomcat server
     # 表示服务在网络启动后启动
     Wants=network-online.target
     # 表示服务在网络启动后启动
     After=network.target
    
     [Service]
     # 服务类型,forking表示服务将在后台运行
     Type=forking
     # 设置JAVA_HOME环境变量
     Environment="JAVA_HOME=/usr/java/jdk1.8.0_201-amd64"
     # 启动服务的命令
     ExecStart=/usr/local/tomcat/bin/startup.sh
     # 停止服务的命令
     ExecStop=/usr/local/tomcat/bin/shutdown.sh
     # 如果服务失败,自动重启
     Restart=on-failure
    
     [Install]
     # 表示服务将被安装到multi-user.target目标中
     WantedBy=multi-user.target
    • 管理Tomcat服务:

      bash 复制代码
      systemctl restart tomcat  # 启动
      systemctl enable tomcat   # 配置自启
      systemctl stop tomcat     # 停止服务
      systemctl status tomcat   # 检测状态
  3. 优化Tomcat启动速度

    • 修改JDK参数以避免随机数生成阻塞:

      bash 复制代码
      vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
    • 修改第117行:

      plaintext 复制代码
      securerandom.source=file:/dev/urandom

      第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,所以修改jdk参数。

    bash 复制代码
    # 使用shutdown.sh脚本停止Tomcat服务
    /usr/local/tomcat/bin/shutdown.sh
    
    # 使用startup.sh脚本启动Tomcat服务
    /usr/local/tomcat/bin/startup.sh
    
    # 查看/usr/local/tomcat/目录下的所有文件和文件夹,以便了解当前Tomcat的安装结构和内容
    ll /usr/local/tomcat/

小知识

CLASSPATH :编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
tools.jar :是系统用来编译一个类的时候用到的,即执行javac的时候用到,比如可用来编译JSP文件。
dt.jar:是关于运行环境的类库,主要是swing的包,在用到swing时最好加上。

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

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

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

●Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。

Tomcat目录结构
  • bin:存放启动和关闭脚本。
  • conf:存放配置文件。
  • lib:存放运行所需的库文件。
  • logs:存放执行日志。
  • temp:存放运行时产生的临时文件。
  • webapps:存放Web应用项目资源。
  • work:存放JSP编译后产生的class文件。

Tomcat虚拟主机配置指南

当公司有多个项目需要运行时,通常不会在一台服务器上部署多个Tomcat实例,因为这样会消耗大量系统资源。此时,可以使用Tomcat的虚拟主机功能来实现。

示例场景

假设新增了两个域名:www.xy101.comwww.xy102.com,希望通过这两个域名访问不同的项目内容。

配置步骤

  1. 创建项目目录和文件

    • 创建两个项目目录:

      bash 复制代码
      mkdir /usr/local/tomcat/webapps/xy101
      mkdir /usr/local/tomcat/webapps/xy102
    • 在每个目录中创建一个简单的index.jsp文件:

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

    • 编辑server.xml文件,在适当位置插入以下内容:
    bash 复制代码
     vim /usr/local/tomcat/conf/server.xml
    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>
    • 参数说明
      • name:主机名,即域名。
      • appBase:Tomcat程序工作目录,默认为webapps
      • unpackWARs:是否自动解压WAR文件,默认为true
      • autoDeploy:是否自动部署新添加的应用程序,默认为true
      • xmlValidation:是否验证XML文件的有效性,默认为false
      • xmlNamespaceAware:是否启用XML命名空间,默认为false
      • docBase:Web应用程序的实际存放路径。
      • path:相对于Web服务器根路径的URI,为空表示根路径。
      • reloadable:是否允许重新加载Web应用程序的类,默认为false
  3. 重启Tomcat

    • 停止并启动Tomcat服务:

      bash 复制代码
      /usr/local/tomcat/bin/shutdown.sh
      /usr/local/tomcat/bin/startup.sh
  4. 客户端浏览器访问验证

    • 修改本地hosts文件以指向服务器IP:

      bash 复制代码
      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监听端口:Tomcat的Connector监听8080端口,接受请求。
  2. 虚拟主机匹配:根据请求的域名找到对应的虚拟主机配置。
  3. Context路径解析:根据请求的URI找到对应的Web应用程序目录,并执行相应的JSP文件。
相关推荐
羊锦磊2 小时前
[ Mybatis 多表关联查询 ] resultMap
java·开发语言·数据库·mysql·mybatis
ZeroToOneDev4 小时前
Java(泛型和JUnit)
java·开发语言·笔记
迪尔~6 小时前
Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
java·pdf·excel
现在,此刻6 小时前
leetcode 11. 盛最多水的容器 -java
java·算法·leetcode
DKPT7 小时前
Java设计模式之开闭原则介绍与说明
java·设计模式·开闭原则
hyy27952276847 小时前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
布朗克1687 小时前
Spring Boot项目通过Feign调用三方接口的详细教程
java·spring boot·feign
Arva .7 小时前
Spring基于XML的自动装配
xml·java·spring
帅得不敢出门9 小时前
Android Framework定制长按电源键关机的窗口
android·java·framework
fatfishccc9 小时前
循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
xml·java·数据库·spring·intellij-idea·ioc·di