一、Tomcat简介
1.1 什么是Tomcat
Tomcat是Apache软件基金会开发的一款开源Java Web应用服务器,实现了Java EE规范中的Servlet、JSP等标准。它作为一个轻量级的Web容器,广泛应用于Java Web应用的部署和运行。
Tomcat主要特点:
开源免费,社区活跃
轻量级,启动速度快
支持Servlet和JSP规范
可嵌入到Spring Boot等框架
支持集群和负载均衡
1.2 Web技术演进
B/S模式:浏览器/服务器模式,基于HTTP协议,无需安装客户端。
前端三大核心技术:
HTML:网页结构骨架
CSS:网页样式美化
JavaScript:网页行为引擎
同步与异步交互:
同步:请求后阻塞等待,整个页面刷新
异步(Ajax):基于XMLHttpRequest对象,局部更新
1.3 后台应用架构
单体架构:
所有功能模块整合在一个工程
打包为war包部署
适合小型项目
微服务架构:
按业务边界拆分为多个独立服务
独立开发、部署、运行
支持多语言技术栈
二、Tomcat基础安装部署
2.1 环境准备
安装JDK:
yum install java-1.8.0-openjdk.x86_64 -y
验证JDK安装:
java -version
显示结果:
openjdk version "1.8.0_392"
OpenJDK Runtime Environment (build 1.8.0_392-b08)
OpenJDK 64-Bit Server VM (build 25.392-b08, mixed mode)
2.2 下载与解压
下载Tomcat:
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz
解压到指定目录:
tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local
cd /usr/local && mv apache-tomcat-9.0.115 tomcat
2.3 目录结构说明
目录 说明
bin 启动和关闭脚本
conf 配置文件目录
lib 依赖库目录
logs 日志文件目录
webapps Web应用部署目录
work 编译后的JSP文件
2.4 启动测试
启动Tomcat:
/usr/local/tomcat/bin/startup.sh
验证端口监听:
netstat -antlupe | grep 8080
显示结果:
tcp6 0 0 :::8080 :::* LISTEN 0 12345 1234/java
访问测试:
显示结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Apache Tomcat/9.0.115</title>
</head>
<body>
<h1>Apache Tomcat/9.0.115</h1>
</body>
</html>
2.5 Systemd服务化配置
创建tomcat用户:
useradd -s /sbin/nologin -M tomcat
chown tomcat.tomcat /usr/local/tomcat -R
创建环境变量文件:
vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre
创建systemd服务文件:
vim /lib/systemd/system/tomcat.service
Unit
Description=Tomcat
After=syslog.target network.target
Service
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
Install
WantedBy=multi-user.target
启动服务:
systemctl daemon-reload
systemctl enable --now tomcat
验证服务状态:
netstat -antlupe | grep java
显示结果:
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 12346 1234/java
tcp6 0 0 :::8080 :::* LISTEN 0 12347 1234/java
三、Tomcat核心配置
3.1 配置文件说明
Tomcat主要配置文件:
conf/server.xml 主配置文件,配置端口、连接器、引擎等
conf/web.xml Web应用默认配置
conf/context.xml Context默认配置
conf/tomcat-users.xml 用户权限配置
conf/logging.properties 日志配置
3.2 server.xml核心配置
vim /usr/local/tomcat/conf/server.xml
Server配置:
<Server port="8005" shutdown="SHUTDOWN">
Service配置:
<Service name="Catalina">
Connector配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="10"
acceptCount="100"
enableLookups="false"
URIEncoding="UTF-8" />
Engine配置:
<Engine name="Catalina" defaultHost="localhost">
Host配置:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
3.3 配置参数说明
参数 说明
port 监听端口
protocol 协议类型
connectionTimeout 连接超时时间
maxThreads 最大线程数
minSpareThreads 最小空闲线程数
acceptCount 最大等待连接数
enableLookups 是否开启DNS查询
URIEncoding URI编码格式
3.4 JVM参数优化
vim /usr/local/tomcat/bin/setenv.sh
CATALINA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
参数说明:
-server 使用服务器模式
-Xms 初始堆内存
-Xmx 最大堆内存
-XX:PermSize 初始永久代大小
-XX:MaxPermSize 最大永久代大小
四、Web应用部署
4.1 部署方式
方式1:直接部署到webapps目录
将war包或应用目录复制到webapps目录
Tomcat会自动解压和部署
方式2:配置Context
在conf/Catalina/localhost/下创建xml文件
方式3:修改server.xml
在Host节点内添加Context配置
4.2 部署示例
创建测试应用:
mkdir -p /usr/local/tomcat/webapps/myapp
echo "<h1>Hello Tomcat</h1>" > /usr/local/tomcat/webapps/myapp/index.html
访问测试:
curl http://localhost:8080/myapp/
显示结果:
<h1>Hello Tomcat</h1>
4.3 部署JSP应用
创建JSP页面:
vim /usr/local/tomcat/webapps/myapp/test.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head><title>Test Page</title></head>
<body>
<h1>Server Info</h1>
<p>Server: <%= application.getServerInfo() %></p>
<p>JSP Version: <%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %></p>
<p>Current Time: <%= new java.util.Date() %></p>
</body>
</html>
访问测试:
curl http://localhost:8080/myapp/test.jsp
显示结果:
<h1>Server Info</h1>
<p>Server: Apache Tomcat/9.0.115</p>
<p>JSP Version: 2.3</p>
<p>Current Time: Mon Feb 25 10:30:00 CST 2026</p>
五、Nginx+Tomcat整合
5.1 整合架构
Nginx作为反向代理,处理静态请求,转发动态请求到Tomcat:
Client -> Nginx(80) -> Tomcat(8080)
5.2 Nginx配置
vim /usr/local/nginx/conf/conf.d/tomcat.conf
server {
listen 80;
server_name app.timinglee.org;
location / {
root /usr/local/nginx/html;
index index.html;
}
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重启Nginx:
nginx -s reload
5.3 测试整合
准备测试JSP页面:
echo 'test page' > /usr/local/tomcat/webapps/ROOT/test.jsp
访问测试:
curl http://app.timinglee.org/test.jsp
显示结果:
test page
六、Tomcat负载均衡
6.1 环境规划
角色 IP地址 说明
Nginx 192.168.58.3 负载均衡器
Tomcat1 192.168.58.10 后端服务器1
Tomcat2 192.168.58.20 后端服务器2
6.2 后端Tomcat配置
Tomcat1配置:
安装JDK和Tomcat(同2.1-2.2)
配置Systemd服务(同2.5)
Tomcat2配置同上。
6.3 Nginx负载均衡配置
vim /usr/local/nginx/conf/conf.d/tomcat_lb.conf
upstream tomcat_backend {
server 192.168.58.10:8080 weight=5;
server 192.168.58.20:8080 weight=5;
}
server {
listen 80;
server_name app.timinglee.org;
location ~* \.(jsp|do)$ {
proxy_pass http://tomcat_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重启Nginx:
nginx -s reload
6.4 测试负载均衡
准备测试页面:
Tomcat1:echo "Tomcat1 - 192.168.58.10" > /usr/local/tomcat/webapps/ROOT/test.jsp
Tomcat2:echo "Tomcat2 - 192.168.58.20" > /usr/local/tomcat/webapps/ROOT/test.jsp
访问测试:
for i in {1..6}; do curl http://app.timinglee.org/test.jsp; done
显示结果:
Tomcat1 - 192.168.58.10
Tomcat2 - 192.168.58.20
Tomcat1 - 192.168.58.10
Tomcat2 - 192.168.58.20
Tomcat1 - 192.168.58.10
Tomcat2 - 192.168.58.20
七、Session共享高可用
7.1 Session问题
在负载均衡环境下,如果不处理Session,会导致:
用户登录后,请求被转发到不同服务器
Session数据不一致,需要重新登录
7.2 Session共享方案
方案1:Session复制(Tomcat集群)
优点:实现简单
缺点:性能开销大,不适合大规模集群
方案2:Session绑定(IP Hash)
优点:实现简单
缺点:某台服务器故障时Session丢失
方案3:Session服务器(Memcached/Redis)
优点:性能好,可扩展
缺点:需要额外维护Session服务器
7.3 Memcached实现Session共享
7.3.1 安装Memcached
所有节点安装Memcached:
dnf install memcached -y
配置Memcached:
vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
启动服务:
systemctl enable --now memcached
验证端口:
netstat -antlupe | grep memcached
显示结果:
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 0 12345 1234/memcached
7.3.2 配置Tomcat会话管理器
下载Memcached会话管理jar包:
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
kryo-5.0.0.jar
kryo-serializers-0.45.jar
复制到Tomcat lib目录:
cp *.jar /usr/local/tomcat/lib/
Tomcat1配置:
vim /usr/local/tomcat/conf/context.xml
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.58.10:11211,n2:192.168.58.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
Tomcat2配置:
vim /usr/local/tomcat/conf/context.xml
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.58.10:11211,n2:192.168.58.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
7.3.3 重启Tomcat
systemctl restart tomcat
7.3.4 验证Session共享
创建测试页面:
vim /usr/local/tomcat/webapps/ROOT/session.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head><title>Session Test</title></head>
<body>
<h1>Session Test</h1>
<p>Session ID: <%= session.getId() %></p>
<p>Server: <%= request.getServerName() %></p>
<p>Created: <%= new java.util.Date(session.getCreationTime()) %></p>
<p>Last Access: <%= new java.util.Date(session.getLastAccessedTime()) %></p>
<p>Count: <%
Integer count = (Integer) session.getAttribute("count");
if (count == null) {
count = 0;
}
count++;
session.setAttribute("count", count);
out.println(count);
%></p>
</body>
</html>
访问测试:
curl http://app.timinglee.org/session.jsp
显示结果:
Session ID: ABC123DEF456
Server: app.timinglee.org
Created: Mon Feb 25 10:00:00 CST 2026
Last Access: Mon Feb 25 10:30:00 CST 2026
Count: 1
再次访问:
curl http://app.timinglee.org/session.jsp
显示结果:
Session ID: ABC123DEF456
Count: 2(Session保持)
停止Tomcat1:
systemctl stop tomcat
再次访问:
curl http://app.timinglee.org/session.jsp
显示结果:
Session ID: ABC123DEF456
Count: 3(Session未丢失,从Tomcat2获取)
八、Tomcat监控与优化
8.1 内置监控
启用Manager应用:
vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx"/>
访问Manager:
http://localhost:8080/manager/html
8.2 常用监控指标
指标 说明
Active Sessions 活动会话数
Max Active 最大活动会话数
Session Count 总会话数
JVM Memory JVM内存使用情况
Threads 线程使用情况
8.3 性能优化建议
- 调整连接器参数
maxThreads="500"
minSpareThreads="10"
acceptCount="100"
- 启用压缩
compression="on"
compressableMimeType="text/html,text/xml,text/plain"
- 禁用DNS查询
enableLookups="false"
- 调整JVM参数
-Xms1024m -Xmx2048m
九、Tomcat安全管理
9.1 关闭默认应用
删除默认应用:
rm -rf /usr/local/tomcat/webapps/docs
rm -rf /usr/local/tomcat/webapps/examples
rm -rf /usr/local/tomcat/webapps/host-manager
rm -rf /usr/local/tomcat/webapps/manager
9.2 修改默认端口
vim /usr/local/tomcat/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
改为:
<Server port="18005" shutdown="RANDOM_SHUTDOWN_STRING">
9.3 隐藏版本信息
vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" ... server="Apache" />
9.4 配置HTTPS
生成证书:
keytool -genkey -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/conf/keystore.jks
配置Connector:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/keystore.jks" keystorePass="password"/>