一: Tomcat 概述
1.1: Tomcat 介绍
- 免费的、开放源代码的Web应用服务器
- Apache软件基金会(Apache Software Foundation)Jakarta项目中的一个核心项目
- 由Apache、Sun和一些公司及个人共同开发而成
- 深受Java爱好者的喜爱,并得到部分软件开发商的认可
- 目前比较流行的Web应用服务器。
Tomcat属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些web 服务器一样,具有处理 HTML页面的功能,然而由于其处理静态HTML 的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。
1.2: Tomcat 核心组件
JavaServlet
Servlet 是 Java 平台上的一种服务器端组件,用于扩展服务端的能力,处理来自客户端的请求并生成响应。Tomcat 提供了一个 Servlet 容器,负责加载、实例化、初始化和调用 Servlet,以及在不需要时销毁它们。
JSP容器
JSP (JavaServer Pages) 是一种动态网页技术标准,用于创建动态网页内容。JSP 页面会被转换成 Servlet,在第一次请求时编译,之后直接执行编译后的 Servlet。
1.3: Tomcat 请求处理
1:用户在浏览器中输入网址,请求被发送到本机端口8080,被在那里监听的Connector获得;
2:Connector把该请求交给它所在的Service 的 Engine (Container)来处理,并等待Engine
的回应;
3:请求在Engine、Host、Context和 Wrapper 这四个容器之间层层调用,最后在Servlet 中执行对应的业务逻辑、数据存储等。
4:执行完之后的请求响应在Context、Host、Engine 容器之间层层返回,最后返回给Connector,并通过Connector返回给客户端。
1.4:Tomcat 功能组件结构
1. Server
这是最外层的容器,代表整个 Tomcat 实例,包含一个或多个 Service。
2. Service
每个 Service 包含一个或多个 Connector 和一个 Container(Engine)。Service 定义了哪些 Connector 可以访问哪些 Container。
3. Connector
Connector 负责处理特定协议的请求,如 HTTP、HTTPS 或 AJP。它将接收到的请求转发给 Engine,并将 Engine 的响应返回给客户端。
4. Engine
Engine 是处理请求的核心组件,它决定请求应该交给哪一个 Host 来处理。
5. Host
Host 代表虚拟主机,允许在单个物理服务器上运行多个网站。每个 Host 都有自己的 Contexts。
6. Context
Context 是一个 Web 应用程序的容器,负责加载和管理该应用的 Servlets 和 JSPs。
1.5:Container结构分析
- Server:顶级容器,包含 Service 元素。
- Service:包含至少一个 Connector 和一个 Container(Engine)。
- Connector:实现特定协议的通信,如 HTTP、HTTPS。
- Container :Engine、Host 和 Context 都是 Container 的子类,它们共同形成了 Tomcat 的层次结构。
- Engine:处理请求的核心,将请求分发到适当的 Host。
- Host:代表虚拟主机,可以有多个 Context。
- Context:每个 Web 应用都有自己的 Context,负责该应用的生命周期管理和资源加载。
这种结构使 Tomcat 能够有效地处理复杂的请求路由和多应用共存的情况。
1.6:Tomcat数据流向
二: Tomcat 服务部署
2.1:案例环境
|---------------------|-----------------------|
| 名称 | 说明 |
| 系统版本 | CentOS7.9(64位) |
| Tomcat 版本 | 9.0.8 |
| jdk版本 | 1.8.0_171 |
| 服务器IP地址 | 192.168.10.101 6G 内存 |
| Windows 客户端IP地址及其配置 | 192.168.10.10 8G 内存 |
| 主机名 | localhost.localdomain |
| Firewalld | 关闭 |
| Selinux | 禁用 |
| Jmeter 版本 | 3.1 |
2.2:下载并安装 JDK
1:安装JDK
Java Development Kit (JDK) 是开发 Java 应用程序所必需的软件包,包含了 Java 编译器、Java 运行时环境 (JRE) 和其他开发工具。
下载 JDK
- 访问 Oracle 官方网站或其他可靠的 JDK 发布平台,例如 Adoptium 或 Azul Systems。
- 根据你的操作系统(Windows、Linux 或 macOS),选择合适的 JDK 版本进行下载。
- 建议下载最新的 LTS (Long Term Support) 版本,以确保稳定性和长期支持。
安装 JDK
- 对于 Windows 和 macOS 用户,运行下载的安装程序,按照屏幕上的提示完成安装过程。
- 在 Linux 上,你可以使用包管理器(如 apt、yum 或 dnf)来安装,或者手动解压下载的二进制文件并将其放置在适当的位置。
2:设置 jdk 的环境变量
为了确保系统能够识别 JDK 的位置,你需要设置环境变量。具体步骤如下:
Windows
- 打开"控制面板" > "系统和安全" > "系统" > "高级系统设置" > "环境变量"。
- 在"系统变量"区域,点击"新建",添加变量名
JAVA_HOME
,变量值设为 JDK 的安装目录。 - 找到
Path
变量,编辑它,在其中添加%JAVA_HOME%\bin
。
Linux/macOS
-
打开终端。
-
编辑
~/.bashrc
或/etc/environment
文件,取决于你想设置用户级还是系统级变量。 -
添加以下行:
1export JAVA_HOME=/path/to/jdk 2export PATH=$JAVA_HOME/bin:$PATH
-
保存文件并运行
source ~/.bashrc
或source /etc/environment
使更改生效。
2.3:安装启动 Tomcat
1:安装 Tomcat 服务
- 下载 Tomcat 的压缩包(
.tar.gz
或.zip
格式)。 - 解压缩下载的文件到你选择的目录,例如
/opt/tomcat
。 - 确保你的系统已经正确设置了 JDK 的环境变量,因为 Tomcat 需要它来运行。
2:优化 Tomcat 服务启动时间
- 减少初始堆大小 :通过修改
CATALINA_OPTS
环境变量来减小 JVM 的初始堆大小。 - 禁用不必要的服务和模块 :在
server.xml
文件中禁用不需要的 Connectors 或者在context.xml
中禁用不使用的数据源。 - 使用预编译的 JSP:在部署阶段预编译 JSP 文件,避免在启动时进行编译。
- 清理临时文件:定期清理工作目录下的临时文件和缓存。
3: Tomcat 目录结构
- bin:包含启动和停止脚本。
- conf :包含配置文件,如
server.xml
,web.xml
,context.xml
等。 - lib:存放 Tomcat 使用的 jar 文件和第三方库。
- logs:存放 Tomcat 日志文件。
- temp:存放临时文件。
- webapps :存放部署的 web 应用程序。默认包含一个示例应用
docs
和manager
。 - work:存放 JSP 编译后的 class 文件。
- docs:包含 Tomcat 文档和示例应用程序。
- bin/setenv.sh 或 bin/catalina.bat :用于设置环境变量,如
JAVA_OPTS
和CATALINA_OPTS
。
完成上述步骤后,你可以通过运行 bin/startup.sh
(Unix/Linux)或 bin/startup.bat
(Windows)来启动 Tomcat。同样地,通过运行 bin/shutdown.sh
或 bin/shutdown.bat
来停止 Tomcat。
三: Tomcat 配置与优化
3.1:虚拟主机配置
在 Tomcat 的安装目录下,通常有一个名为 webapps
的目录,这是用来存放 Web 应用程序的。为了创建虚拟主机,你需要在这个目录下为每个虚拟主机创建对应的目录。
-
创建 www 目录:
1mkdir /path/to/tomcat/webapps/www
-
创建 bbs 目录:
1mkdir /path/to/tomcat/webapps/bbs
接着,在这两个目录下创建一些基本的 HTML 文件,比如 index.html
,以便测试虚拟主机是否正常工作。
2. 修改 Tomcat 主配置文件
Tomcat 的主配置文件是 conf/server.xml
,在这里你可以配置虚拟主机。
-
打开 server.xml 文件: 使用文本编辑器打开此文件。
-
找到 Engine 节点 : 在
<Engine>
节点中,你会看到一个或多个<Host>
节点,每一个都代表一个虚拟主机。如果不存在,你需要添加一个新的<Host>
节点。 -
添加或修改 Host 节点 : 对于每个虚拟主机,你都需要添加一个
<Host>
节点,例如:1<Host name="www.example.com" appBase="www" unpackWARs="true" autoDeploy="true"> 2 <!-- 其他配置 --> 3</Host> 4 5<Host name="bbs.example.com" appBase="bbs" unpackWARs="true" autoDeploy="true"> 6 <!-- 其他配置 --> 7</Host>
这里,
name
属性是虚拟主机的域名,appBase
是指向 Web 应用程序目录的路径。
3:虚拟主机访问测试
为了测试虚拟主机是否正确配置,你需要确保你的 DNS 设置或本地 hosts 文件已经正确映射了虚拟主机的域名到你的 Tomcat 服务器 IP 地址。
-
修改 hosts 文件: 在你的操作系统中,找到 hosts 文件并添加以下条目(以 Windows 为例):
1127.0.0.1 www.example.com 2127.0.0.1 bbs.example.com
注意:这里的 IP 地址应该是你的 Tomcat 服务器的实际 IP 地址,如果是本地测试,则使用
127.0.0.1
。 -
重启 Tomcat: 关闭并重新启动 Tomcat 服务,让新的配置生效。
-
测试访问 : 打开浏览器,输入虚拟主机的域名
www.example.com
和bbs.example.com
,你应该能看到你之前创建的index.html
页面。
3.2 Tomcat 优化
1. Tomcat 配置文件参数优化
优化 Tomcat 的性能主要集中在调整 JVM 参数、Connector 配置、以及一些高级配置上。下面是一些具体的优化建议:
JVM 参数
JVM 的配置对于 Tomcat 的性能至关重要,尤其是内存管理。在 bin/catalina.sh
或 bin/catalina.bat
文件中,你可以设置以下 JVM 参数:
-
Heap Size:
-Xms<size>
: 初始堆大小。-Xmx<size>
: 最大堆大小。
示例:
1JAVA_OPTS="$JAVA_OPTS -Xms256m -Xmx1024m"
-
PermGen/PermSize (Java 8 以前):
-XX:PermSize=<size>
: 初始永久代大小。-XX:MaxPermSize=<size>
: 永久代最大大小。
Java 8 及以后版本使用 Metaspace,因此需要调整
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
。 -
GC Tuning:
-XX:+UseConcMarkSweepGC
: 使用 CMS 垃圾回收器。-XX:+CMSIncrementalMode
: 使 CMS 在低负载时进行增量式回收。-XX:+UseParNewGC
: 使用 ParNew 作为年轻代的垃圾回收器。
-
Thread Stack Size:
-Xss<size>
: 线程栈大小。
Connector 配置
在 conf/server.xml
中,<Connector>
配置是另一个关键区域,需要调整以适应高并发环境:
-
线程池:
maxThreads
: 最大线程数。minSpareThreads
: 最小空闲线程数。maxConnections
: 最大连接数。
示例:
1<Connector port="8080" protocol="HTTP/1.1" 2 maxThreads="200" minSpareThreads="25" maxConnections="1024" 3 connectionTimeout="20000" redirectPort="8443" />
-
KeepAlive:
enableLookups
: 是否启用 DNS 查找(禁用可提高性能)。useBodyEncodingForURI
: 是否使用实体编码来解码 URI。
-
压缩:
compression
: 压缩类型。compressableMimeType
: 可压缩的内容类型列表。
高级配置
-
Session Persistence:
sessionCookiePath
和sessionCookieDomain
可以帮助管理和持久化会话。
-
JMX Monitoring:
Catalina
引擎和StandardEngine
组件可以被配置为使用 JMX 监控,这对于性能监控和故障排除非常有帮助。
2. jmeter 压测工具
使用 Apache JMeter 进行压力测试是评估 Tomcat 服务器性能的一种有效方式。以下是使用 JMeter 的步骤:
-
下载和安装 JMeter: 从官方网站下载 JMeter,并解压缩到一个目录。
-
创建测试计划 : 启动 JMeter,通过右键点击
Test Plan
->Add
->Threads(Users)
->Thread Group
来创建线程组。 -
配置 HTTP 请求 : 在线程组内,添加
HTTP Request
采样器,输入你的 URL 和其他请求参数。 -
添加监听器 : 添加
View Results Tree
,Summary Report
,Aggregate Report
和Response Time Graph
等监听器,以查看测试结果。 -
配置线程数和迭代次数 : 在线程组中,设置
Number of Threads (users)
,Ramp-Up Period (in seconds)
和Loop Count
来模拟用户行为。 -
执行测试: 点击绿色的运行按钮开始测试。测试结束后,检查监听器中的结果。
-
分析结果: 根据测试结果,查看平均响应时间、吞吐量、错误率等指标,判断系统是否能够承受预期的负载。
通过以上步骤,你可以根据测试结果对 Tomcat 的配置进行相应的调整,以达到最优的性能。这可能需要多次迭代和优化过程。