当前位置: 首页 > news >正文

【网站架构部署与优化】Tomcat部署安装

文章目录

  • Tomcat
    • 概述
      • Tomcat 核心组件
      • Servlet 与 JSP
      • Tomcat 功能组件结构
      • Container 结构分析
      • Tomcat 请求过程
    • Tomcat服务部署指南
      • 前提条件
      • 部署步骤
      • 小知识
        • Tomcat目录结构
    • Tomcat虚拟主机配置指南
      • 示例场景
      • 配置步骤
      • HTTP请求过程

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. 关闭防火墙并传输软件包
    • 关闭防火墙:
      systemctl stop firewalld
      systemctl disable firewalld
      setenforce 0
      
    • 将Tomcat和JDK安装包传输到/opt目录。
  2. 安装JDK
    • 进入/opt目录并查看JDK包内容:
      cd /opt
      rpm -qpl jdk-8u201-linux-x64.rpm
      
    • 安装JDK:
      rpm -ivh jdk-8u201-linux-x64.rpm
      
    • 验证安装:
      java -version
      
  3. 设置JDK环境变量
    • 编辑/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版本:
      java -version
      
  4. 编写和运行Java程序
  • 使用文本编辑器编写Java源代码文件(如Hello.java):
    public class Hello {			public static void main(String[] args){System.out.println("Hello world!");}
    }
    
  • 编译Java源代码:
    javac Hello.java
    
  • 运行编译后的字节码文件:
    java Hello
    
  1. 安装并启动Tomcat
    • 解压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
      
    • 或者使用catalina.sh脚本启动:
      /usr/local/tomcat/bin/catalina.sh start
      
    • 检查Tomcat是否在8080端口运行:
      netstat -natp | grep 8080
      
    • 浏览器访问Tomcat默认主页:http://<your-server-ip>:8080
  2. 使用systemd管理Tomcat
    • 创建tomcat.service文件:
      vim /usr/lib/systemd/system/tomcat.service
      
    • 添加以下内容:
     # 描述服务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服务:
      systemctl restart tomcat  # 启动
      systemctl enable tomcat   # 配置自启
      systemctl stop tomcat     # 停止服务
      systemctl status tomcat   # 检测状态
      
  3. 优化Tomcat启动速度
    • 修改JDK参数以避免随机数生成阻塞:
      vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
      
    • 修改第117行:
      securerandom.source=file:/dev/urandom
      
      第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,所以修改jdk参数。
    # 使用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. 创建项目目录和文件

    • 创建两个项目目录:
      mkdir /usr/local/tomcat/webapps/xy101
      mkdir /usr/local/tomcat/webapps/xy102
      
    • 在每个目录中创建一个简单的index.jsp文件:
      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文件,在适当位置插入以下内容:
     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>
    
    • 参数说明
      • 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服务:
      /usr/local/tomcat/bin/shutdown.sh
      /usr/local/tomcat/bin/startup.sh
      
  4. 客户端浏览器访问验证

    • 修改本地hosts文件以指向服务器IP:
      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文件。

相关文章:

  • android设计模式的建造者模式,请举例
  • Tesla T4 P2P测试
  • Apache Iceberg 与 Spark整合-使用教程(Iceberg 官方文档解析)
  • 重头开始嵌入式第四十二天(硬件 ARM体系架构)
  • 计算机网络(八) —— Udp协议
  • powershell@update-help更新文档和离线文档安装@并行加速安装帮助文档更新@安装报错问题
  • 【LeetCode:219. 存在重复元素 II + 哈希表】
  • Ant design vue中的提示框(a-tooltip)
  • Linux应用开发实验班——JSON-RPC
  • 大数据新视界 --大数据大厂之HBase 在大数据存储中的应用与表结构设计
  • 【有啥问啥】“弱激励学习(Weak Incentive Learning)”的原理与过程解析
  • 如何使用ssm实现基于SpringMVC网上选课系统的设计与实现
  • 努比亚z17努比亚NX563j原厂固件卡刷包下载_刷机ROM固件包下载-原厂ROM固件-安卓刷机固件网
  • Python图形用户界面设计的15个基础组件
  • 代码编码规范文档(参考)
  • angular组件开发
  • Flannel解读
  • scala基础语法(二)
  • SpringBoot几种定时任务的实现方式
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 简单基于spring的redis配置(单机和集群模式)
  • 力扣(LeetCode)22
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 驱动程序原理
  • 手写一个CommonJS打包工具(一)
  • 提醒我喝水chrome插件开发指南
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一个JAVA程序员成长之路分享
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 优化 Vue 项目编译文件大小
  • 1.Ext JS 建立web开发工程
  • ​MySQL主从复制一致性检测
  • # 安徽锐锋科技IDMS系统简介
  • #pragam once 和 #ifndef 预编译头
  • (2.2w字)前端单元测试之Jest详解篇
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Python第六天)文件处理
  • (三)SvelteKit教程:layout 文件
  • (四)事件系统
  • (算法)大数的进制转换
  • (未解决)macOS matplotlib 中文是方框
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)linux 命令大全
  • (转)Sublime Text3配置Lua运行环境
  • .CSS-hover 的解释
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net和jar包windows服务部署
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET学习全景图
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /bin/bash^M: bad interpreter: No such file or directory
  • [BZOJ3223]文艺平衡树
  • [C/C++] -- 二叉树