Tomcat学习总结

一、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

访问测试:

curl http://localhost:8080

显示结果:

<!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 性能优化建议

  1. 调整连接器参数

maxThreads="500"

minSpareThreads="10"

acceptCount="100"

  1. 启用压缩

compression="on"

compressableMimeType="text/html,text/xml,text/plain"

  1. 禁用DNS查询

enableLookups="false"

  1. 调整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"/>

相关推荐
尘似鹤1 小时前
linux驱动学习---竞争与并发(原子操作与各种锁)
linux·学习
在这habit之下1 小时前
HAProxy学习总结
学习
来两个炸鸡腿1 小时前
【Datawhale组队学习202602】Hello-Agents task06 框架应用开发实战
人工智能·学习·大模型·智能体
盐焗西兰花1 小时前
鸿蒙学习实战之路-STG系列(4/11)-应用选择页功能详解
服务器·学习·harmonyos
qq_416276422 小时前
通用音频表征的对比学习
学习·音视频
2501_918126912 小时前
stm32最级别的烧录解锁是什么?
stm32·单片机·嵌入式硬件·学习·个人开发
是烨笙啊2 小时前
AI 编程:核心概念与术语解析
人工智能·学习·ai编程
工业甲酰苯胺2 小时前
一文学习 Spring AOP 源码全过程
java·学习·spring