Tomcat 服务器详解与优化实践

文章目录

  • Tomcat 服务器详解与优化实践
    • 一、Tomcat 简介
      • 1.1 什么是 Tomcat
      • 1.2 Tomcat 的核心组件
      • 1.3 什么是 Servlet 和 JSP
    • 二、Tomcat 的核心组件结构
      • 2.1 Connector
      • 2.2 Container
      • 2.3 Tomcat 请求处理过程
    • 三、Tomcat 服务部署
      • 3.1 安装准备
      • 3.2 安装 JDK
      • 3.3 安装和启动 Tomcat
      • 3.4 Tomcat 目录结构
      • 3.5 Hello World 示例
    • 四、Tomcat 虚拟主机配置
      • 4.1 创建虚拟主机项目目录
      • 4.2 修改 Tomcat 主配置文件
      • 4.3 验证虚拟主机配置
    • 五、Tomcat 优化
      • 5.1 Tomcat 配置文件参数优化
      • 5.2 JVM 参数优化
      • 5.3 内存溢出和内存泄露处理
    • 六、Tomcat 多实例部署
      • 6.1 安装与配置多实例
      • 6.2 JVM 优化
    • 七、总结
    • 七、总结

Tomcat 服务器详解与优化实践

一、Tomcat 简介

1.1 什么是 Tomcat

Tomcat 是由 Java 语言开发的免费、开源的 Web 应用服务器,隶属于 Apache 软件基金会的 Jakarta 项目。它是由 Apache、Sun 和其他公司及个人共同开发的。Tomcat 被广泛应用于中小型系统和并发访问用户较少的场景中,尤其适合开发和调试 JSP 程序。

虽然 Tomcat 和 Apache 或 Nginx 这样的 Web 服务器一样,能够处理 HTML 页面,但由于其处理静态 HTML 的能力不及 Apache 或 Nginx,因此 Tomcat 通常作为一个 Servlet 和 JSP 容器,单独运行在后端。

1.2 Tomcat 的核心组件

Tomcat 由一系列组件构成,其中核心组件包括:

  • Web 容器:负责完成 Web 服务器的功能,处理 HTTP 请求并展示动态页面。
  • Servlet 容器:核心组件名为 Catalina,用于处理 Servlet 代码。
  • JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。

这些容器共同构成了 Tomcat 的功能结构,使其既能作为 Web 服务器,又能作为 Servlet/JSP 容器。

1.3 什么是 Servlet 和 JSP

  • Servlet:Java Servlet 是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性。Servlet 用于处理客户端请求并生成动态网页内容,相当于一个中间件,将客户端和数据库连接起来。
  • JSP (Java Server Pages):JSP 是一种动态网页开发技术,它使用 JSP 标签在 HTML 页面中插入 Java 代码。JSP 是一种 Java Servlet,主要用于实现 Java Web 应用程序的用户界面部分,能够动态生成网页内容。

二、Tomcat 的核心组件结构

Tomcat 的核心功能包括两个主要部分:ConnectorContainer

2.1 Connector

Connector 负责接收和响应外部请求,是 Tomcat 与外界的交通枢纽。它监听指定的端口,接收外部请求,将请求处理后传递给容器进行业务处理,最后将处理结果返回给外界。

2.2 Container

Container 负责处理内部的业务逻辑,内部由 Engine、Host、Context 和 Wrapper 四个子容器组成。它们共同管理和调用 Servlet 相关逻辑,构成了基本的 Web 服务。

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

2.3 Tomcat 请求处理过程

  1. 用户在浏览器中输入网址,请求被发送到本机的 8080 端口,被 Connector 监听到。
  2. Connector 将请求传递给其所属的 Service 的 Engine(Container)来处理,并等待 Engine 的响应。
  3. 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑和数据存储。
  4. 执行完毕后,响应通过相反的顺序返回,最终由 Connector 返回给客户端。

三、Tomcat 服务部署

3.1 安装准备

在部署 Tomcat 之前,必须先安装好 JDK,这是 Tomcat 运行的必要环境。以下是安装步骤:

  1. 下载 JDK 和 Tomcat 安装包:

    • Tomcat 官方下载地址
    • JDK 官方下载地址
  2. 关闭防火墙并将安装包传到 /opt 目录下:

    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    

3.2 安装 JDK

  1. /opt 目录下安装 JDK:

    cd /opt
    rpm -ivh jdk-8u201-linux-x64.rpm
    java -version  # 验证 JDK 是否安装成功
    
  2. 设置 JDK 环境变量:

    vim /etc/profile.d/java.sh
    export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    export PATH=$JAVA_HOME/bin:$PATHsource /etc/profile.d/java.sh
    java -version  # 再次验证 JDK 安装是否成功
    

3.3 安装和启动 Tomcat

  1. 解压并安装 Tomcat:

    cd /opt
    tar zxvf apache-tomcat-9.0.16.tar.gz
    mv apache-tomcat-9.0.16 /usr/local/tomcat
    
  2. 启动 Tomcat 服务:

    • 后台启动:

      /usr/local/tomcat/bin/startup.sh
      
    • 前台启动:

      /usr/local/tomcat/bin/catalina.sh run
      
  3. 检查 Tomcat 是否成功启动:

    netstat -natp | grep 8080
    
  4. 在浏览器中访问 http://192.168.80.100:8080,确认 Tomcat 的默认主页加载成功。

3.4 Tomcat 目录结构

了解 Tomcat 的目录结构对于后续的配置和维护至关重要。

  • bin:存放启动和关闭 Tomcat 的脚本文件,如 catalina.shstartup.shshutdown.sh
  • conf:存放 Tomcat 的各种配置文件,如 server.xmlcontext.xmltomcat-users.xmlweb.xml
  • lib:存放 Tomcat 运行所需的库文件(JAR 包)。
  • logs:存放 Tomcat 执行时产生的日志文件。
  • temp:存放 Tomcat 运行时产生的临时文件。
  • webapps:Tomcat 的默认 Web 应用部署目录。
  • work:存放 JSP 编译后产生的 class 文件。
  • src:存放 Tomcat 的源代码。
  • doc:存放 Tomcat 的文档。

3.5 Hello World 示例

  1. 编写一个简单的 Java 程序 Hello.java

    public class Hello {            public static void main(String[] args){System.out.println("Hello world!");}
    }
    
  2. 编译并运行:

    javac Hello.java
    java Hello
    

    运行成功后,将会打印 “Hello World”。

四、Tomcat 虚拟主机配置

为了在一台服务器上运行多个项目,通常不会运行多个 Tomcat 实例,而是通过虚拟主机配置来实现。

4.1 创建虚拟主机项目目录

  1. 创建两个虚拟主机对应的项目目录:

    mkdir /usr/local/tomcat/webapps/kgc 
    mkdir /usr/local/tomcat/webapps/benet
    
  2. 创建测试页面:

    echo "This is kgc page!" > /usr/local/tomcat/webapps/kgc/index.jsp
    echo "This is benet page!" > /usr/local/tomcat/webapps/benet/index.jsp
    

4.2 修改 Tomcat 主配置文件

编辑 server.xml 文件,添加虚拟主机配置:

<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />
</Host>   <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>

4.3 验证虚拟主机配置

  1. /etc/hosts 文件中添加域名映射:

    echo "192.168.10.23 www.kgc.com www.benet.com" >> /etc/hosts
    
  2. 通过浏览器访问测试:

    • 访问 http://www.kgc.com:8080/,页面显示 “This is kgc page!”。
    • 访问 `http://www.benet.com:8080/

`,页面显示 “This is benet page!”。

五、Tomcat 优化

Tomcat 的默认配置可能并不适合生产环境,通过不断压测和优化,可以让 Tomcat 高效稳定地运行。

5.1 Tomcat 配置文件参数优化

一些常用的优化参数如下:

  • redirectPort:指定当接收客户端发来的 HTTPS 请求时,转发至此端口。
  • maxThreads:Tomcat 可创建的最大线程数,即支持的最大并发连接数。
  • minSpareThreads:Tomcat 启动时初始化的最小空闲线程数。
  • maxSpareThreads:最大备用线程数。
  • URIEncoding:指定 Tomcat 容器的 URL 编码格式。
  • connnectionTimeout:网络连接超时设置。
  • enableLookups:是否反查域名,以返回远程主机的主机名。
  • disableUploadTimeout:上传时是否使用超时机制。
  • connectionUploadTimeout:上传超时时间。
  • acceptCount:当所有线程都被使用时,传入连接请求的最大队列长度。
  • compression:是否对响应的数据进行 GZIP 压缩。

5.2 JVM 参数优化

编辑 catalina.sh 文件,添加或调整 JVM 参数:

-server                     # 启用 JVM 的 server 工作模式
-Xms1024m                   # 设置初始堆内存大小为 1024MB
-Xmx1024m                   # 设置最大堆内存大小为 1024MB
-XX:NewSize=512m            # 设置新生代初始内存大小
-XX:MaxNewSize=1024M        # 设置新生代最大内存大小
-XX:PermSize=1024m          # 设置永久保存区域的初始内存大小
-XX:MaxPermSize=1024m       # 设置永久保存区域的最大内存大小
-XX:+DisableExplicitGC      # 禁用显式的垃圾回收调用

5.3 内存溢出和内存泄露处理

  • 内存溢出 (OOM):当应用程序需要的内存超过可用内存时,会发生内存溢出。通过优化代码、调整内存配置(如 -Xms-Xmn-Xmx)可以缓解此问题。
  • 内存泄露:内存泄露是由于程序中定义了过多静态变量,导致垃圾回收机制无法回收这些对象。此时需要检查代码,避免无用的静态变量。

六、Tomcat 多实例部署

6.1 安装与配置多实例

  1. /opt 目录下解压 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
    
  2. 配置 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/tomcat2source /etc/profile.d/tomcat.sh
    
  3. 修改 Tomcat2 中的 server.xml 文件,确保端口号不冲突:

    <Server port="8006" shutdown="SHUTDOWN">
    <Connector port="8081" protocol="HTTP/1.1"/>
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>
    
  4. 修改各 Tomcat 实例中的 startup.shshutdown.sh 文件,添加环境变量:

    vim /usr/local/tomcat/tomcat1/bin/startup.sh 
    export CATALINA_BASE=$CATALINA_BASE1
    export CATALINA_HOME=$CATALINA_HOME1
    export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
    export CATALINA_BASE=$CATALINA_BASE1
    export CATALINA_HOME=$CATALINA_HOME1
    export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat2/bin/startup.sh 
    export CATALINA_BASE=$CATALINA_BASE2
    export CATALINA_HOME=$CATALINA_HOME2
    export TOMCAT_HOME=$TOMCAT_HOME2vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
    export CATALINA_BASE=$CATALINA_BASE2
    export CATALINA_HOME=$CATALINA_HOME2
    export TOMCAT_HOME=$TOMCAT_HOME2
    
  5. 启动各 Tomcat 实例:

    /usr/local/tomcat/tomcat1/bin/startup.sh 
    /usr/local/tomcat/tomcat2/bin/startup.sh 
    
  6. 通过浏览器访问:

    • http://192.168.10.80:8080
    • http://192.168.10.80:8081

6.2 JVM 优化

在生产环境中,Tomcat 的性能很大程度上依赖于 JVM 的配置。通过合理的 JVM 参数设置,可以显著提升 Tomcat 的性能和稳定性。

-server                 # JVM 的 server 工作模式
-Xms1024m               # 初始 Heap 大小
-Xmx1024m               # 最大 Heap 大小
-XX:NewSize=512m        # 新生代初始内存大小
-XX:MaxNewSize=1024M    # 新生代最大内存大小
-XX:PermSize=1024m      # 永久代初始内存大小
-XX:MaxPermSize=1024m   # 永久代最大内存大小
-XX:+DisableExplicitGC  # 禁用显式垃圾回收

七、总结

性。

-server                 # JVM 的 server 工作模式
-Xms1024m               # 初始 Heap 大小
-Xmx1024m               # 最大 Heap 大小
-XX:NewSize=512m        # 新生代初始内存大小
-XX:MaxNewSize=1024M    # 新生代最大内存大小
-XX:PermSize=1024m      # 永久代初始内存大小
-XX:MaxPermSize=1024m   # 永久代最大内存大小
-XX:+DisableExplicitGC  # 禁用显式垃圾回收

七、总结

Tomcat 作为一种轻量级的 Web 应用服务器,在中小型项目中得到了广泛应用。通过合理的配置和优化,可以使其在生产环境中稳定高效地运行。本文详细介绍了 Tomcat 的核心组件、安装部署、虚拟主机配置以及 JVM 参数优化等内容,希望能为您在实际应用中提供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

SAP BW:QUERY数据结果写入ADSO

作者 idan lian 如需转载备注出处 如果对你有帮助&#xff0c;请点赞收藏~~~ 需求背景 客户基于QUERY进行报表展示&#xff0c;现需迁移到永洪报表平台&#xff0c;query中的变量参数&#xff0c;公式等无法直接生成视图&#xff0c;query相对复杂&#xff0c;不想直接在视图…

笔记mybatisplus

MP入门 Mybatis-Plus&#xff08;简称MP&#xff09;是一个Mybatis的增强工具&#xff0c;在Mybatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 Mybatis-Plus已经封装好了大量增删改查的方法&#xff0c;程序员只需要继承BaseMapper就可以使用这些方法…

Linux阿里云服务器,利用docker安装EMQX

第一步&#xff0c;给云服务器docker进行加速 阿里云搜索“镜像加速器”&#xff0c;找到下面这个菜单&#xff0c;点进去 然后找到镜像工具下的镜像加速器 把这个加速器地址复制 然后在自己的云服务器中&#xff0c;找到docker的文件夹 点击json配置文件 把地址修改为刚刚…

如何将LaTeX数学公式嵌入到PowerPoint中

如何将LaTeX数学公式嵌入到PowerPoint中 简介 在学术演示或技术报告中&#xff0c;清晰且专业地展示数学公式是至关重要的。PowerPoint虽然提供了一些基本的公式编辑功能&#xff0c;但如果你需要更复杂或格式严格的公式&#xff0c;使用LaTeX生成公式并嵌入到PPT中是一个极佳…

Python酷库之旅-第三方库Pandas(092)

目录 一、用法精讲 391、pandas.Series.hist方法 391-1、语法 391-2、参数 391-3、功能 391-4、返回值 391-5、说明 391-6、用法 391-6-1、数据准备 391-6-2、代码示例 391-6-3、结果输出 392、pandas.Series.to_pickle方法 392-1、语法 392-2、参数 392-3、功能…

KT来袭,打造沉浸式体验的聚合性web3应用平台

随着步入 2024&#xff0c;漫长的区块链熊市即将接近尾声。纵观产业发展&#xff0c;逆流而上往往会是彰显品牌市场影响力和技术实力的最佳证明。在这次周期中&#xff0c;一个名为KT的web3.0聚合平台吸引了市场关注&#xff0c;无论在市场层面还是技术层面&#xff0c;都广泛赢…

听劝❗用AI做职场思维导图仅仅需要几秒钟啊

本文由 ChatMoney团队出品 嘿&#xff0c;各位职场朋友们 是不是常常对着密密麻麻的笔记感到焦虑呢&#xff1f; 想整理却无从下手&#xff1f; 别怕&#xff0c;ChatmoneyAI知识库来拯救你的整理困难症啦&#xff01; 咱们都知道&#xff0c;思维导图是职场中必备的神器 …

zoom 会议机器人web例子

一、需要创建zoom app&#xff0c;创建及配置参考&#xff1a;Zoom会议机器人转写例子-CSDN博客 这里直接使用zoom-recall的配置。 二、需要生成签名&#xff0c;参数为&#xff1a;zoom-recall中的Client ID和Client Secret 1、git clone https://github.com/zoom/meetings…

【PHP入门教程】PHPStudy环境搭建+composer创建项目

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 Composer安装 Composer&#xff1a;安装途中报错解决&#xff1a;初始化项目创建文件最终文件目录Compo…

微服务:配置管理和配置热更新

参考&#xff1a;黑马程序员之微服务 &#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、引言 二、配置共享 1. 添加共享配置到nacos &#xff08;1&#xff09;jdbc的共享配置 shared…

设计模式之Decorator装饰者、Facade外观、Adapter适配器(Java)

装饰者模式 设计模式的基本原则&#xff0c;对内关闭修改。 Decorator Pattern&#xff0c;装饰者模式&#xff0c;也叫包装器模式(Wrapper Pattern)&#xff1a;将一个对象包装起来&#xff0c;增加新的行为和责任。一定是从外部传入&#xff0c;并且可以没有顺序&#xff0…

望繁信科技入选2024年第3批上海市高新技术成果转化项目名单

近日&#xff0c;上海望繁信科技有限公司&#xff08;以下简称“望繁信科技”&#xff09;凭借其自主研发的“数字北极星流程挖掘分析软件”项目&#xff0c;成功入选2024年第3批上海市高新技术成果转化项目名单。这一殊荣根据《上海市高新技术成果转化项目认定办法》&#xff…

Keil Error-Flash Download failed Cortex-M4 擦除芯片还不好使的方案!!!

点击魔术棒-Debug-Settings后看到SWDIO可以正常识别&#xff0c;但是点击Reset下拉只有三个选项。 此时点击Pack&#xff0c;将Enable勾去掉。 回到Reset&#xff0c;此时多了Autodetet选项&#xff0c;选择这个选项后&#xff0c;即可正常烧录。

CLI举例:通过ISAKMP方式建立GRE over IPsec隧道

配置安全策略&#xff0c;允许私网指定网段进行报文交互&#xff0c;放行IKE协商报文。配置静态路由&#xff0c;保证两端路由可达。配置GRE Tunnel接口以及Tunnel口的转发路由。配置基于ACL的IPsec策略。GRE over IPsec中IPsec需要保护的数据流以GRE的起点为源、终点为目的。 …

初始C++(类与对象)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.引用二.内联函数三.类和对象总结 前言 之前讲c的命令空间和第一个程序的运行&#xff0c;继…

Aixos食用指南,超全面详细讲解!

前言&#xff1a;axios是目前最流行的ajax封装库之一&#xff0c;用于很方便地实现ajax请求的发送。特意花费了两个小时为大家准备了一份全面详细的Aixos食用指南&#xff0c;需要的小伙伴点个关注 哦~&#x1f495; &#x1f308;&#x1f308;文章目录 Axios 简介 Axios 特…

vue实现卡片遮罩层交互式功能

前言 在前端开发中&#xff0c;卡片遮罩层是一种常见的交互设计元素&#xff0c;用于强调某个区域或内容&#xff0c;并提供用户操作的入口。本文将带大家在 vue 中结合实际案例实现此功能。 实现效果 完整代码 html <template><!-- 主容器 --><div class&quo…

ctfshow WEB刷题

web1 直接右键打开&#xff0c;在源代码里 web2 ctrlu查看源码 web3 打开bp抓包发送直接就得到了 web4 用dirsearch扫描发现txt文件 访问 接着访问得到flag web5 用dirbuster扫描看看有没有phps源码泄露&#xff0c;发现存在 访问下载文件打开就是flag web6 用dirsearch扫…

ES6笔记总结(Xmind格式):第三天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; ES6知识总结&#xff1a; Promise的使用: 1.使用 new Promise() 构造函数来创建一个 promise 对象 2.接受两个函数作为参数&#xff1a;resolve 和 reject ①resolve 函数在异步操作成功完成时调用&#xf…