第1章:Tomcat简介
1.1 什么是Tomcat?
Apache Tomcat是一个开源的Java Servlet容器,由Apache Software Foundation开发。它实现了Java Servlet和JavaServer Pages (JSP)规范,是最流行的Java Web服务器之一。
1.2 Tomcat的历史发展
1999年:Tomcat作为Apache Jakarta项目的子项目诞生
2001年:Tomcat 4.0发布,支持Servlet 2.3和JSP 1.2规范
2005年:Tomcat 5.5发布,成为Apache顶级项目
2011年:Tomcat 7.0发布,支持Servlet 3.0规范
2016年:Tomcat 8.0发布,支持Servlet 3.1规范
2018年:Tomcat 9.0发布,支持Servlet 4.0规范
2021年:Tomcat 10.0发布,支持Jakarta EE 9规范
......
1.3 Tomcat的特点和优势
开源免费:完全免费使用,支持商业应用
轻量级:相比其他应用服务器,Tomcat更轻量,启动速度快
易于使用:配置简单,学习曲线平缓
跨平台:支持Windows、Linux、macOS等操作系统
高性能:经过优化,能够处理大量并发请求
可扩展:支持集群部署和负载均衡
安全性:提供多种安全特性,支持SSL/TLS加密
1.4 Tomcat的版本选择
Tomcat 8.5:稳定版本,支持Servlet 3.1,推荐生产环境使用
Tomcat 9.0:最新稳定版本,支持Servlet 4.0
Tomcat 10.0:支持Jakarta EE 9,但API有所变化
Tomcat 10.1:支持Jakarta EE 10
对于新项目,推荐使用Tomcat 9.0或10.0版本。
1.5 Tomcat的应用场景
企业级Web应用:部署Java Web应用
微服务架构:作为轻量级容器运行Spring Boot应用
开发环境:快速搭建开发测试环境
API服务器:提供RESTful API服务
静态资源服务器:处理静态文件请求
第2章:Tomcat的安装和配置
2.1 系统要求
Java版本:Tomcat 8.5+需要JDK 8或更高版本
操作系统:Windows、Linux、macOS、Solaris等
内存:至少512MB,推荐1GB以上
磁盘空间:至少100MB可用空间
2.2 下载Tomcat
从Apache Tomcat官网下载最新版本:
java
https://tomcat.apache.org/download-90.cgi
选择对应的版本和操作系统:
Core:核心分发包,包含Tomcat服务器
Deployer:用于部署Web应用的工具
Embedded:嵌入式版本,可集成到其他应用中
2.3 Windows环境安装
解压安装包
将下载的zip文件解压到指定目录,如:C:\apache-tomcat-9.0.x
配置环境变量
java
JAVA_HOME:指向JDK安装目录
CATALINA_HOME:指向Tomcat安装目录
PATH:添加 %CATALINA_HOME%\bin
启动Tomcat
java
# 进入Tomcat bin目录
cd C:\apache-tomcat-9.0.x\bin
# 启动服务
startup.bat
# 停止服务
shutdown.bat
2.4 Linux环境安装
解压安装包
java
# 创建Tomcat目录
sudo mkdir /opt/tomcat
# 解压文件
sudo tar -zxvf apache-tomcat-9.0.x.tar.gz -C /opt/tomcat
# 创建符号链接
sudo ln -s /opt/tomcat/apache-tomcat-9.0.x /opt/tomcat/latest
配置环境变量
java
# 编辑/etc/profile或~/.bashrc
export JAVA_HOME=/usr/java/jdk1.8.0_xxx
export CATALINA_HOME=/opt/tomcat/latest
export PATH=$PATH:$CATALINA_HOME/bin
# 使环境变量生效
source /etc/profile
创建系统服务
# 创建服务文件
sudo vi /etc/systemd/system/tomcat.service
# 添加以下内容:
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/java/jdk1.8.0_xxx
Environment=CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat/latest
Environment=CATALINA_BASE=/opt/tomcat/latest
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
# 重新加载systemd
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start tomcat
# 设置开机自启
sudo systemctl enable tomcat
2.5 验证安装
检查服务状态
java
# Windows
netstat -ano | findstr :8080
# Linux
sudo systemctl status tomcat
访问默认页面打开浏览器访问:http://localhost:8080
查看Tomcat日志
java
# Windows
%CATALINA_HOME%\logs\catalina.out
# Linux
/opt/tomcat/latest/logs/catalina.out
第3章:Tomcat目录结构详解
3.1 主要目录结构
java
apache-tomcat-9.0.x/
├── bin/ # 启动和关闭脚本
│ ├── startup.sh/.bat # 启动脚本
│ ├── shutdown.sh/.bat # 关闭脚本
│ ├── catalina.sh/.bat # 主控制脚本
│ └── setenv.sh/.bat # 环境变量设置
├── conf/ # 配置文件
│ ├── server.xml # 主配置文件
│ ├── web.xml # Web应用默认配置
│ ├── tomcat-users.xml # 用户认证配置
│ ├── context.xml # 上下文配置
│ └── catalina.policy # 安全策略
├── lib/ # Tomcat核心库
├── logs/ # 日志文件
│ ├── catalina.out # 主日志文件
│ ├── localhost.log # 本地日志
│ └── host-manager.log # 主机管理日志
├── temp/ # 临时文件
├── webapps/ # Web应用部署目录
│ ├── ROOT/ # 默认Web应用
│ ├── docs/ # Tomcat文档
│ ├── examples/ # 示例应用
│ ├── host-manager/ # 主机管理应用
│ └── manager/ # 管理应用
├── work/ # 工作目录(JSP编译等)
└── LICENSE # 许可证文件
3.2 配置文件详解
server.xml - 主配置文件
java
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
web.xml - Web应用默认配置
java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description>
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
tomcat-users.xml - 用户认证配置
java
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>
3.3 日志文件说明
catalina.out:Tomcat主日志,包含启动信息和错误信息
localhost.log:本地主机相关的日志
manager.log:管理应用日志
host-manager.log:主机管理应用日志
localhost_access_log.txt:访问日志
第4章:Web应用部署
4.1 部署方式概述
Tomcat支持多种Web应用部署方式:
WAR文件部署:最常用方式
目录部署:开发阶段使用
自动部署:通过配置文件
热部署:运行时部署
4.2 WAR文件部署
手动部署
java
停止Tomcat服务
# Linux
sudo systemctl stop tomcat
# Windows
shutdown.bat
将WAR文件复制到webapps目录
cp myapp.war /opt/tomcat/webapps/
启动Tomcat服务
# Linux
sudo systemctl start tomcat
# Windows
startup.bat
验证部署访问:http://localhost:8080/myapp
使用Manager应用部署
java
访问Manager应用浏览器访问:http://localhost:8080/manager/html
登录认证使用tomcat-users.xml中配置的用户
上传WAR文件在"Deploy"部分选择WAR文件并部署
4.3 目录部署
创建应用目录
java
mkdir /opt/tomcat/webapps/myapp
创建WEB-INF目录
java
mkdir /opt/tomcat/webapps/myapp/WEB-INF
创建web.xml
java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
创建classes目录
java
mkdir /opt/tomcat/webapps/myapp/WEB-INF/classes
创建lib目录
java
mkdir /opt/tomcat/webapps/myapp/WEB-INF/lib
4.4 上下文配置
context.xml配置
java
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- 数据库连接池配置 -->
<Resource name="jdbc/myapp"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/myapp"/>
</Context>
server.xml中配置上下文
java
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/myapp" docBase="/path/to/myapp" reloadable="true"/>
</Host>
4.5 部署最佳实践
文件命名规范
WAR文件使用小写字母
避免使用特殊字符
包含版本号,如:myapp-1.0.war
目录权限设置
java
# 设置正确的权限
chown -R tomcat:tomcat /opt/tomcat/webapps/myapp
chmod -R 755 /opt/tomcat/webapps/myapp
备份策略
部署前备份现有应用
保留多个版本的备份
定期清理旧备份
部署验证
检查应用启动日志
验证关键功能
监控系统资源使用
第5章:Tomcat配置管理
5.1 连接器配置
HTTP连接器
java
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
acceptCount="100"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"/>
AJP连接器
java
<Connector port="8009"
protocol="AJP/1.3"
redirectPort="8443"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
acceptCount="100"/>
5.2 JVM参数优化
setenv.sh配置(Linux)
java
# JVM内存设置
export JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx2048m"
# GC参数
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
export JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
# 其他优化
export JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
setenv.bat配置(Windows)
set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx2048m
set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC
set JAVA_OPTS=%JAVA_OPTS% -XX:MaxGCPauseMillis=200
set JAVA_OPTS=%JAVA_OPTS% -Djava.awt.headless=true
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
5.3 线程池配置
java
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="150"
minSpareThreads="25"
maxIdleTime="60000"/>
5.4 安全配置
禁用不必要的应用
java
# 删除默认应用
rm -rf /opt/tomcat/webapps/docs
rm -rf /opt/tomcat/webapps/examples
rm -rf /opt/tomcat/webapps/host-manager
rm -rf /opt/tomcat/webapps/manager
配置安全头
java
在web.xml中添加:
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SSL/TLS配置
java
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
scheme="https"
secure="true"
SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
certificateKeystorePassword="changeit"
certificateKeyAlias="localhost"/>
</SSLHostConfig>
</Connector>
第6章:性能调优
6.1 内存优化
JVM堆内存设置
java
# 生产环境推荐配置
-Xms2g -Xmx4g
-XX:NewSize=512m -XX:MaxNewSize=1g
-XX:PermSize=256m -XX:MaxPermSize=512m
内存监控
java
使用jstat命令监控JVM内存:
# 查看GC情况
jstat -gcutil <pid> 1000
# 查看内存使用
jstat -gccapacity <pid>
6.2 连接器优化
高并发配置
java
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="1000"
minSpareThreads="100"
maxConnections="2000"
connectionTimeout="20000"
keepAliveTimeout="20000"
maxKeepAliveRequests="100"/>
压缩配置
java
<Connector port="8080"
compression="on"
compressionMinSize="1024"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"/>
6.3 数据库连接池
Tomcat JDBC Pool配置
java
<Resource name="jdbc/myapp"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxIdle="50"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"/>
6.4 缓存优化
静态资源缓存
java
<Context>
<Resources cachingAllowed="true"
cacheMaxSize="102400"
cacheObjectMaxSize="512"
cacheTtl="60000"/>
</Context>
Session管理
java
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="-1"
maxIdleBackup="-1">
<Store className="org.apache.catalina.session.FileStore"
directory="./session"/>
</Manager>
第7章:安全配置
7.1 用户认证和授权
基本认证配置
java
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
JDBC Realm配置
java
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/tomcat_users"
connectionName="tomcat"
connectionPassword="password"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"/>
7.2 SSL/TLS证书配置
生成自签名证书
java
# 生成密钥库
keytool -genkey -alias tomcat -keyalg RSA -keystore /opt/tomcat/conf/localhost-rsa.jks
# 查看证书信息
keytool -list -keystore /opt/tomcat/conf/localhost-rsa.jks
配置HTTPS
java
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
scheme="https"
secure="true"
SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
certificateKeystorePassword="changeit"/>
</SSLHostConfig>
</Connector>
7.3 安全过滤器
CSRF防护
java
<filter>
<filter-name>CSRF</filter-name>
<filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CSRF</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
XSS防护
java
<filter>
<filter-name>XSS</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.4 访问控制
基于IP的访问控制
java
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.1.*"/>
基于主机的访问控制
java
<Valve className="org.apache.catalina.valves.RemoteHostValve"
deny="evil.com"/>
第8章:监控和管理
8.1 Manager应用
启用Manager应用
编辑tomcat-users.xml
java
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
访问Manager应用
HTML界面:http://localhost:8080/manager/html
文本界面:http://localhost:8080/manager/text
Manager应用功能
应用列表:查看所有已部署应用
部署应用:上传和部署WAR文件
停止/启动应用:控制应用状态
重载应用:重新加载应用
查看统计信息:应用访问统计
8.2 JMX监控
启用JMX
java
# Linux
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9090"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
# Windows
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=9090
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false
使用JConsole连接
java
jconsole localhost:9090
8.3 日志监控
配置日志轮转
java
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i""
rotatable="true"
fileDateFormat=".yyyy-MM-dd"/>
日志级别配置
在logging.properties中配置:
java
handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
8.4 性能监控工具
使用VisualVM
启动VisualVM
java
jvisualvm
连接Tomcat进程
本地连接:直接选择Tomcat进程
远程连接:配置JMX远程连接
使用jstatd
java
# 创建安全策略文件
echo "grant codebase \"file:${JAVA_HOME}/lib/tools.jar\" {
permission java.security.AllPermission;
};" > /tmp/jstatd.policy
# 启动jstatd
jstatd -J-Djava.security.policy=/tmp/jstatd.policy -p 1099
第9章:故障排除
9.1 常见启动问题
端口占用
问题现象:
Address already in use: JVM_Bind
解决方案:
java
# 查看端口占用
netstat -tlnp | grep :8080
# 杀死进程
kill -9 <PID>
# 或者修改Tomcat端口
# 编辑server.xml
<Connector port="8081" protocol="HTTP/1.1" .../>
内存不足
问题现象:
java.lang.OutOfMemoryError: Java heap space
解决方案:
java
# 增加JVM内存
export JAVA_OPTS="$JAVA_OPTS -Xms1g -Xmx2g"
类路径问题
问题现象:
ClassNotFoundException
解决方案:
java
检查lib目录
检查CLASSPATH设置
检查JAR文件完整性
9.2 运行时问题
应用无法访问
排查步骤:
检查Tomcat是否启动
检查防火墙设置
检查应用部署状态
查看错误日志
数据库连接问题
常见错误:
Communications link failure
解决方案:
java
检查数据库服务状态
验证连接参数
检查网络连接
配置连接池参数
Session问题
排查方法:
java
# 查看Session统计
curl http://localhost:8080/manager/text/sessions?path=/myapp
9.3 性能问题诊断
高CPU使用率
诊断步骤:
使用top/htop查看进程
使用jstack生成线程转储
分析线程状态
识别热点方法
内存泄漏
检测方法:
java
# 使用jmap生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>
# 使用MAT分析堆转储
# Memory Analyzer Tool
慢响应时间
排查工具:
Access Log分析
Thread Dump分析
Database慢查询分析
网络延迟测试
9.4 日志分析技巧
使用grep分析日志
java
# 查找错误信息
grep "ERROR" catalina.out
# 查找特定应用错误
grep "myapp" localhost.log
# 统计HTTP状态码
grep "HTTP/1.1" localhost_access_log.txt | cut -d'"' -f3 | sort | uniq -c
日志轮转配置
java
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="access"
suffix=".log"
pattern="%h %l %u %t "%r" %s %b"
rotatable="true"
fileDateFormat=".yyyy-MM-dd"
maxDays="30"/>
第10章:高级特性
10.1 集群和负载均衡
配置集群
java
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
负载均衡配置
使用Apache HTTP Server + mod_proxy:
java
<Proxy balancer://tomcat-cluster>
BalancerMember http://tomcat1:8080 route=tomcat1
BalancerMember http://tomcat2:8080 route=tomcat2
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass / balancer://tomcat-cluster/
ProxyPassReverse / balancer://tomcat-cluster/
10.2 虚拟主机配置
配置虚拟主机
java
<Engine name="Catalina" defaultHost="www.example.com">
<Host name="www.example.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Alias>example.com</Alias>
<Context path="" docBase="/var/www/example"/>
</Host>
<Host name="www.test.com" appBase="/var/www/test"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/var/www/test"/>
</Host>
</Engine>
10.3 SSI和CGI支持
启用SSI
java
<Context>
<Valve className="org.apache.catalina.ssi.SSIEngine"
debug="0"
expires="666"
isVirtualWebappRelative="0"
buffered="1"/>
</Context>
启用CGI
java
<Context>
<Valve className="org.apache.catalina.valves.CGIValve"
cgiPathPrefix="/WEB-INF/cgi"/>
</Context>
10.4 WebSocket支持
配置WebSocket
Tomcat 7+ 原生支持WebSocket,无需额外配置。
java
@ServerEndpoint("/websocket")
public class WebSocketServer {
@OnOpen
public void onOpen(Session session) {
System.out.println("连接打开: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("收到消息: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("连接关闭: " + session.getId());
}
}
10.5 嵌入式Tomcat
Maven依赖
java
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.65</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.65</version>
</dependency>
基本使用
java
public class EmbeddedTomcat {
public static void main(String[] args) throws Exception {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
Context ctx = tomcat.addContext("/", new File("webapp").getAbsolutePath());
Tomcat.addServlet(ctx, "hello", new HttpServlet() {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("Hello, Embedded Tomcat!");
}
});
ctx.addServletMappingDecoded("/", "hello");
tomcat.start();
tomcat.getServer().await();
}
}
第11章:最佳实践和生产部署
11.1 生产环境部署清单
安全加固
移除默认应用
java
rm -rf webapps/docs webapps/examples webapps/host-manager webapps/manager
修改默认端口
java
<Connector port="80" protocol="HTTP/1.1" .../>
配置防火墙
java
# 只开放必要端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
设置文件权限
java
chown -R tomcat:tomcat /opt/tomcat
chmod -R 755 /opt/tomcat
chmod 600 /opt/tomcat/conf/*
性能优化
JVM调优
java
export JAVA_OPTS="$JAVA_OPTS -server"
export JAVA_OPTS="$JAVA_OPTS -Xms4g -Xmx8g"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
export JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
连接器优化
java
<Connector port="80"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="1000"
maxConnections="2000"
connectionTimeout="20000"/>
缓存配置
java
<Context>
<Resources cachingAllowed="true"
cacheMaxSize="104857600"
cacheObjectMaxSize="52428800"/>
</Context>
11.2 监控和告警
配置日志监控
java
# 使用logrotate管理日志
cat > /etc/logrotate.d/tomcat << EOF
/opt/tomcat/logs/*.log {
daily
rotate 30
compress
missingok
create 644 tomcat tomcat
postrotate
systemctl reload tomcat
endscript
}
EOF
设置监控脚本
#!/bin/bash
# Tomcat监控脚本
TOMCAT_PID=$(pgrep -f tomcat)
if [ -z "$TOMCAT_PID" ]; then
echo "Tomcat is not running"
exit 1
fi
# 检查HTTP响应
curl -f http://localhost:8080 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Tomcat is not responding"
exit 1
fi
echo "Tomcat is running fine"
exit 0
11.3 备份和恢复
应用备份策略
java
#!/bin/bash
# Tomcat应用备份脚本
BACKUP_DIR="/opt/backup/tomcat"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份配置文件
tar -czf $BACKUP_DIR/conf_$DATE.tar.gz /opt/tomcat/conf
# 备份Web应用
tar -czf $BACKUP_DIR/webapps_$DATE.tar.gz /opt/tomcat/webapps
# 备份数据(如果有)
# tar -czf $BACKUP_DIR/data_$DATE.tar.gz /opt/tomcat/data
# 清理旧备份(保留7天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
灾难恢复
停止Tomcat服务
恢复配置文件
恢复Web应用
启动Tomcat服务
验证应用功能
11.4 升级策略
滚动升级
java
准备新版本
# 下载新版本
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
# 解压到新目录
tar -xzf apache-tomcat-9.0.65.tar.gz
mv apache-tomcat-9.0.65 /opt/tomcat/tomcat-9.0.65
配置新版本
# 复制配置文件
cp -r /opt/tomcat/current/conf/* /opt/tomcat/tomcat-9.0.65/conf/
# 复制Web应用
cp -r /opt/tomcat/current/webapps/* /opt/tomcat/tomcat-9.0.65/webapps/
切换版本
# 停止当前版本
systemctl stop tomcat
# 切换符号链接
ln -sf /opt/tomcat/tomcat-9.0.65 /opt/tomcat/current
# 启动新版本
systemctl start tomcat
11.5 总结
通过本文的学习,你已经掌握了:
Tomcat基础知识:了解Tomcat的历史、特点和应用场景
安装配置:掌握Windows和Linux环境下的安装方法
目录结构:熟悉Tomcat的目录结构和配置文件
应用部署:学习多种部署方式和最佳实践
配置管理:掌握连接器、JVM、安全等配置
性能调优:了解内存、连接池、缓存等优化技巧
安全配置:学习认证授权、SSL/TSL、安全过滤器等
监控管理:使用Manager应用、JMX、日志等监控工具
故障排除:掌握常见问题的诊断和解决方法
高级特性:集群、虚拟主机、WebSocket等高级功能
生产部署:学习生产环境的部署、监控、备份等最佳实践
Tomcat作为Java Web应用服务器,经过多年的发展已经成为企业级应用的首选。通过合理配置和调优,可以为应用提供稳定、高性能的服务环境。