文章目录
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 的核心功能包括两个主要部分:Connector 和 Container。
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 请求处理过程
- 用户在浏览器中输入网址,请求被发送到本机的 8080 端口,被 Connector 监听到。
- Connector 将请求传递给其所属的 Service 的 Engine(Container)来处理,并等待 Engine 的响应。
- 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑和数据存储。
- 执行完毕后,响应通过相反的顺序返回,最终由 Connector 返回给客户端。
三、Tomcat 服务部署
3.1 安装准备
在部署 Tomcat 之前,必须先安装好 JDK,这是 Tomcat 运行的必要环境。以下是安装步骤:
-
下载 JDK 和 Tomcat 安装包:
-
关闭防火墙并将安装包传到
/opt
目录下:systemctl stop firewalld systemctl disable firewalld setenforce 0
3.2 安装 JDK
-
在
/opt
目录下安装 JDK:cd /opt rpm -ivh jdk-8u201-linux-x64.rpm java -version # 验证 JDK 是否安装成功
-
设置 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
-
解压并安装 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
-
前台启动:
/usr/local/tomcat/bin/catalina.sh run
-
-
检查 Tomcat 是否成功启动:
netstat -natp | grep 8080
-
在浏览器中访问
http://192.168.80.100:8080
,确认 Tomcat 的默认主页加载成功。
3.4 Tomcat 目录结构
了解 Tomcat 的目录结构对于后续的配置和维护至关重要。
- bin:存放启动和关闭 Tomcat 的脚本文件,如
catalina.sh
、startup.sh
、shutdown.sh
。 - conf:存放 Tomcat 的各种配置文件,如
server.xml
、context.xml
、tomcat-users.xml
、web.xml
。 - lib:存放 Tomcat 运行所需的库文件(JAR 包)。
- logs:存放 Tomcat 执行时产生的日志文件。
- temp:存放 Tomcat 运行时产生的临时文件。
- webapps:Tomcat 的默认 Web 应用部署目录。
- work:存放 JSP 编译后产生的 class 文件。
- src:存放 Tomcat 的源代码。
- doc:存放 Tomcat 的文档。
3.5 Hello World 示例
-
编写一个简单的 Java 程序
Hello.java
:public class Hello { public static void main(String[] args){ System.out.println("Hello world!"); } }
-
编译并运行:
javac Hello.java java Hello
运行成功后,将会打印 “Hello World”。
四、Tomcat 虚拟主机配置
为了在一台服务器上运行多个项目,通常不会运行多个 Tomcat 实例,而是通过虚拟主机配置来实现。
4.1 创建虚拟主机项目目录
-
创建两个虚拟主机对应的项目目录:
mkdir /usr/local/tomcat/webapps/kgc mkdir /usr/local/tomcat/webapps/benet
-
创建测试页面:
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 验证虚拟主机配置
-
在
/etc/hosts
文件中添加域名映射:echo "192.168.10.23 www.kgc.com www.benet.com" >> /etc/hosts
-
通过浏览器访问测试:
- 访问
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 安装与配置多实例
-
在
/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
-
配置 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
-
修改 Tomcat2 中的
server.xml
文件,确保端口号不冲突:<Server port="8006" shutdown="SHUTDOWN"> <Connector port="8081" protocol="HTTP/1.1"/> <Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>
-
修改各 Tomcat 实例中的
startup.sh
和shutdown.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
-
启动各 Tomcat 实例:
/usr/local/tomcat/tomcat1/bin/startup.sh /usr/local/tomcat/tomcat2/bin/startup.sh
-
通过浏览器访问:
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 参数优化等内容,希望能为您在实际应用中提供参考。