Tomcat:完整学习笔记教程

第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 &quot;%r&quot; %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 &quot;%r&quot; %s %b &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot;"
       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 &quot;%r&quot; %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应用服务器,经过多年的发展已经成为企业级应用的首选。通过合理配置和调优,可以为应用提供稳定、高性能的服务环境。

相关推荐
伯明翰java4 小时前
Redis学习笔记-List列表(2)
redis·笔记·学习
a123560mh4 小时前
国产信创操作系统银河麒麟常见软件适配(MongoDB、 Redis、Nginx、Tomcat)
linux·redis·nginx·mongodb·tomcat·kylin
云帆小二4 小时前
从开发语言出发如何选择学习考试系统
开发语言·学习
Elias不吃糖4 小时前
总结我的小项目里现在用到的Redis
c++·redis·学习
BullSmall4 小时前
《道德经》第六十三章
学习
AA陈超5 小时前
使用UnrealEngine引擎,实现鼠标点击移动
c++·笔记·学习·ue5·虚幻引擎
BullSmall5 小时前
《道德经》第六十二章
学习
Knox_Lai6 小时前
数据结构与算法学习(0)-常见数据结构和算法
c语言·数据结构·学习·算法
IMPYLH6 小时前
Lua 的 assert 函数
开发语言·笔记·junit·单元测试·lua
离离茶7 小时前
【笔记1-8】Qt bug记录:QListWidget窗口的浏览模式切换为ListMode后,滚轮滚动速度变慢
笔记·qt·bug