Tomcat 服务器详解与优化实践

avatar
作者
猴君
阅读量:0

文章目录

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 安装包:

  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:$PATH  source /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/tomcat2  source /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_HOME1  vim /usr/local/tomcat/tomcat1/bin/shutdown.sh export CATALINA_BASE=$CATALINA_BASE1 export CATALINA_HOME=$CATALINA_HOME1 export TOMCAT_HOME=$TOMCAT_HOME1  vim /usr/local/tomcat/tomcat2/bin/startup.sh  export CATALINA_BASE=$CATALINA_BASE2 export CATALINA_HOME=$CATALINA_HOME2 export TOMCAT_HOME=$TOMCAT_HOME2  vim /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 参数优化等内容,希望能为您在实际应用中提供参考。

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!