1. 环境准备与前置检查
在Linux系统上部署Tomcat之前,需要确保基础环境已经就绪。我见过太多人直接开始安装Tomcat,结果因为Java环境问题卡住半天。这里分享一个完整的检查清单:
1.1 Java环境验证
首先用以下命令检查Java是否安装:
bash复制java -version
如果显示类似"openjdk version 1.8.0_362"的信息,说明已安装。如果没有,需要先安装JDK:
对于CentOS/RHEL系统:
bash复制sudo yum install java-1.8.0-openjdk-devel
对于Ubuntu/Debian系统:
bash复制sudo apt-get install openjdk-8-jdk
注意:Tomcat 9.x需要Java 8或更高版本。如果使用Tomcat 10.x,建议使用Java 11+。我遇到过有人用Java 7跑Tomcat 9,结果各种奇怪的ClassNotFound错误。
1.2 系统用户创建
为安全考虑,建议创建专用用户运行Tomcat:
bash复制sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
这样做的目的是避免直接使用root运行Tomcat,减少安全风险。我在生产环境中见过因为用root跑Tomcat导致整个服务器被黑的情况。
1.3 防火墙配置
提前开放端口(默认8080):
bash复制sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
如果是云服务器,还需要在安全组中放行相应端口。曾经有个同事折腾两小时才发现是阿里云安全组没开端口。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Tomcat安装与配置
2.1 下载与解压
到Apache官网获取最新稳定版(当前推荐9.0.x):
bash复制cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz
验证下载文件的完整性:
bash复制wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz.sha512
sha512sum -c apache-tomcat-9.0.76.tar.gz.sha512
解压到/opt目录:
bash复制sudo tar xzvf apache-tomcat-9.0.76.tar.gz -C /opt --strip-components=1
2.2 权限设置
设置目录权限:
bash复制cd /opt
sudo chown -R tomcat:tomcat .
sudo chmod -R u+x bin
特别注意:webapps目录应该设置为不可写,防止恶意上传:
bash复制sudo chmod -R g-w webapps
2.3 基础配置调整
修改conf/server.xml中的连接器配置:
xml复制<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="10"
enableLookups="false"
acceptCount="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/css,text/javascript,application/json"/>
这些参数根据你的服务器配置调整:
- maxThreads:建议为CPU核心数*200
- acceptCount:当所有线程忙时的排队请求数
- compression:启用Gzip压缩节省带宽
3. 服务管理与优化
3.1 创建Systemd服务
创建/etc/systemd/system/tomcat.service文件:
ini复制[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl start tomcat
3.2 JVM参数优化
创建setenv.sh文件(如果不存在):
bash复制sudo vim /opt/tomcat/bin/setenv.sh
添加以下内容(根据服务器内存调整):
bash复制export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -Djava.awt.headless=true"
参数说明:
- Xms/Xmx:堆内存初始和最大值,建议设为相同值
- MetaspaceSize:元空间初始大小
- MaxMetaspaceSize:元空间最大值
3.3 访问日志优化
修改conf/server.xml中的AccessLogValve:
xml复制<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D %{User-Agent}i" />
%D参数记录请求处理时间(毫秒),对性能分析很有帮助。
4. 安全加固措施
4.1 删除默认应用
移除不必要的默认应用:
bash复制sudo rm -rf /opt/tomcat/webapps/docs /opt/tomcat/webapps/examples /opt/tomcat/webapps/host-manager
保留manager应用的话,需要加强认证:
bash复制sudo vim /opt/tomcat/conf/tomcat-users.xml
添加:
xml复制<role rolename="manager-gui"/>
<user username="admin" password="复杂密码" roles="manager-gui"/>
4.2 禁用不安全的HTTP方法
在web.xml中添加:
xml复制<security-constraint>
<web-resource-collection>
<web-resource-name>Restricted methods</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
4.3 添加安全响应头
在conf/web.xml中添加:
xml复制<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. 应用部署实践
5.1 标准部署方式
将WAR包放入webapps目录:
bash复制sudo cp application.war /opt/tomcat/webapps/
sudo chown tomcat:tomcat /opt/tomcat/webapps/application.war
Tomcat会自动解压并部署。这种方式简单但不利于管理多个版本。
5.2 上下文部署
在conf/Catalina/localhost/下创建context文件:
bash复制sudo vim /opt/tomcat/conf/Catalina/localhost/application.xml
内容:
xml复制<Context docBase="/path/to/application.war"
unpackWAR="true"
path="/app" />
优点:
- 可以控制应用路径
- 支持热部署
- 便于版本管理
5.3 生产环境部署建议
-
使用反向代理(Nginx/Apache):
- 处理静态资源
- SSL终止
- 负载均衡
-
配置日志轮转:
bash复制sudo vim /etc/logrotate.d/tomcat
内容:
code复制/opt/tomcat/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 tomcat tomcat
sharedscripts
postrotate
/bin/kill -HUP `cat /opt/tomcat/temp/tomcat.pid 2>/dev/null` 2>/dev/null || true
endscript
}
- 监控设置:
- 使用JMX监控JVM
- 配置Prometheus的JMX Exporter
- 设置健康检查端点
6. 常见问题排查
6.1 启动失败排查
检查日志:
bash复制tail -n 100 /opt/tomcat/logs/catalina.out
常见问题:
- 端口冲突:netstat -tulnp | grep 8080
- 权限问题:确保所有文件属于tomcat用户
- 内存不足:调整setenv.sh中的JVM参数
6.2 性能问题排查
- 线程数监控:
bash复制ps -Lf <tomcat_pid> | wc -l
- 内存分析:
bash复制jstat -gcutil <tomcat_pid> 1000 5
- 连接数监控:
bash复制netstat -anp | grep 8080 | wc -l
6.3 内存泄漏处理
- 生成堆转储:
bash复制jmap -dump:format=b,file=/tmp/heap.hprof <pid>
- 分析工具:
- Eclipse MAT
- VisualVM
- YourKit
- 常见泄漏点:
- 静态集合
- 未关闭的资源
- 线程局部变量
7. 进阶配置技巧
7.1 多实例部署
创建第二个实例:
bash复制sudo cp -r /opt/tomcat /opt/tomcat2
sudo chown -R tomcat:tomcat /opt/tomcat2
修改conf/server.xml中的端口号(8005, 8080, 8009等)
启动:
bash复制export CATALINA_BASE=/opt/tomcat2
/opt/tomcat2/bin/startup.sh
7.2 APR连接器
安装依赖:
bash复制sudo yum install apr-devel openssl-devel
# 或
sudo apt-get install libapr1-dev libssl-dev
配置server.xml:
xml复制<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="200" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/key.pem"
certificateFile="conf/cert.pem"
certificateChainFile="conf/chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
7.3 集群配置
在server.xml中添加:
xml复制<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<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.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
8. 备份与迁移
8.1 完整备份方案
- 配置文件备份:
bash复制sudo tar czvf tomcat-conf-$(date +%Y%m%d).tar.gz /opt/tomcat/conf
- 应用备份:
bash复制sudo tar czvf tomcat-webapps-$(date +%Y%m%d).tar.gz /opt/tomcat/webapps
- 定期备份脚本:
bash复制#!/bin/bash
BACKUP_DIR=/backup/tomcat
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR/$DATE
# 备份配置
tar czvf $BACKUP_DIR/$DATE/conf.tar.gz /opt/tomcat/conf
# 备份应用
tar czvf $BACKUP_DIR/$DATE/webapps.tar.gz /opt/tomcat/webapps
# 备份日志(保留最近7天)
find /opt/tomcat/logs -type f -mtime -7 | tar czvf $BACKUP_DIR/$DATE/logs.tar.gz -T -
# 删除30天前的备份
find $BACKUP_DIR -type d -mtime +30 | xargs rm -rf
8.2 迁移到新服务器
- 在新服务器上安装相同版本的Tomcat
- 停止旧服务器上的Tomcat
- 备份并传输以下目录:
- conf/
- webapps/
- lib/ (如果有自定义jar)
- bin/ (如果有自定义脚本)
- 检查并更新配置中的IP/主机名
- 启动新服务器上的Tomcat
8.3 版本升级步骤
- 备份当前安装
- 下载新版本Tomcat
- 停止当前Tomcat
- 复制以下目录到新版本:
- conf/
- webapps/
- lib/
- bin/setenv.sh
- 检查并更新配置文件
- 启动新版本Tomcat
- 监控日志确保应用正常运行
9. 监控与维护
9.1 基础监控指标
-
JVM监控:
- 堆内存使用
- 线程数
- GC次数和时间
-
请求监控:
- 活跃会话数
- 请求处理时间
- 错误率
-
系统资源:
- CPU使用率
- 内存使用
- 磁盘I/O
9.2 使用JMX监控
在setenv.sh中添加:
bash复制export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
使用JConsole或VisualVM连接:
code复制service:jmx:rmi:///jndi/rmi://<服务器IP>:9010/jmxrmi
9.3 日志分析技巧
- 查找错误:
bash复制grep -E "ERROR|Exception" /opt/tomcat/logs/catalina.out
- 统计请求耗时:
bash复制awk '{print $10}' /opt/tomcat/logs/localhost_access_log.* | sort -n | uniq -c
- 实时监控:
bash复制tail -f /opt/tomcat/logs/catalina.out | grep --color -E "ERROR|WARN|Exception"
10. 性能调优实战
10.1 连接器优化
调整conf/server.xml中的Connector:
xml复制<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500"
minSpareThreads="25"
maxConnections="1000"
acceptCount="200"
connectionTimeout="20000"
keepAliveTimeout="60000"
maxKeepAliveRequests="100"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/css,text/javascript,application/json"/>
参数说明:
- maxThreads:根据CPU核心数调整(建议核心数*200)
- acceptCount:当所有线程忙时的排队请求数
- keepAliveTimeout:长连接保持时间
10.2 JVM调优
生产环境推荐配置(8G内存服务器):
bash复制export JAVA_OPTS="-server -Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=70 -Djava.awt.headless=true"
GC选择建议:
- 小内存(<4G):UseParallelGC
- 中等内存(4-8G):UseG1GC
- 大内存(>8G):UseZGC或UseShenandoahGC
10.3 会话管理优化
对于集群环境,配置分布式会话:
xml复制<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
对于单实例,使用持久化会话:
xml复制<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
maxActiveSessions="1000">
<Store className="org.apache.catalina.session.FileStore"
directory="../session_data"/>
</Manager>
11. 容器化部署
11.1 Docker基础部署
Dockerfile示例:
dockerfile复制FROM openjdk:8-jre
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
# 安装Tomcat
ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz .
RUN tar -xvf apache-tomcat-9.0.76.tar.gz --strip-components=1
RUN rm apache-tomcat-9.0.76.tar.gz
# 添加应用
COPY target/application.war webapps/
# 暴露端口
EXPOSE 8080
CMD ["catalina.sh", "run"]
构建并运行:
bash复制docker build -t myapp .
docker run -d -p 8080:8080 --name myapp-container myapp
11.2 生产级Docker配置
优化后的Dockerfile:
dockerfile复制FROM eclipse-temurin:8-jre-jammy
ENV CATALINA_HOME /opt/tomcat
ENV CATALINA_BASE /opt/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
ENV JAVA_OPTS="-server -Xms1g -Xmx1g -XX:+UseG1GC -Djava.security.egd=file:/dev/./urandom"
RUN groupadd -r tomcat && \
useradd -r -g tomcat -d $CATALINA_HOME -s /bin/false tomcat && \
mkdir -p $CATALINA_HOME && \
chown -R tomcat:tomcat $CATALINA_HOME
WORKDIR $CATALINA_HOME
# 使用多阶段构建减小镜像大小
FROM alpine as downloader
RUN apk add --no-cache wget
RUN wget -O /tmp/tomcat.tar.gz https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz && \
wget -O /tmp/tomcat.tar.gz.sha512 https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.76/bin/apache-tomcat-9.0.76.tar.gz.sha512 && \
sha512sum -c /tmp/tomcat.tar.gz.sha512
FROM eclipse-temurin:8-jre-jammy
COPY --from=downloader /tmp/tomcat.tar.gz /tmp/
COPY --chown=tomcat:tomcat target/application.war $CATALINA_HOME/webapps/
RUN tar -xvf /tmp/tomcat.tar.gz -C /opt --strip-components=1 && \
rm /tmp/tomcat.tar.gz && \
chown -R tomcat:tomcat $CATALINA_HOME && \
rm -rf $CATALINA_HOME/webapps/* && \
chmod +x $CATALINA_HOME/bin/*.sh
USER tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
11.3 Kubernetes部署
deployment.yaml示例:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: myapp:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "2Gi"
cpu: "500m"
limits:
memory: "3Gi"
cpu: "1"
livenessProbe:
httpGet:
path: /manager/html
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /manager/html
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
service.yaml:
yaml复制apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
selector:
app: tomcat
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
12. 自动化运维
12.1 使用Ansible部署
playbook示例:
yaml复制---
- hosts: webservers
become: yes
vars:
tomcat_version: 9.0.76
java_version: 1.8.0
tasks:
- name: Install Java
yum:
name: java-{{ java_version }}-openjdk-devel
state: present
- name: Create Tomcat group
group:
name: tomcat
state: present
- name: Create Tomcat user
user:
name: tomcat
group: tomcat
shell: /bin/false
home: /opt/tomcat
system: yes
create_home: no
- name: Download Tomcat
get_url:
url: "https://archive.apache.org/dist/tomcat/tomcat-9/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz"
dest: "/tmp/apache-tomcat-{{ tomcat_version }}.tar.gz"
- name: Install Tomcat
unarchive:
src: "/tmp/apache-tomcat-{{ tomcat_version }}.tar.gz"
dest: "/opt"
remote_src: yes
owner: tomcat
group: tomcat
- name: Create symlink
file:
src: "/opt/apache-tomcat-{{ tomcat_version }}"
dest: "/opt/tomcat"
state: link
owner: tomcat
group: tomcat
- name: Configure systemd service
template:
src: templates/tomcat.service.j2
dest: /etc/systemd/system/tomcat.service
notify: restart tomcat
- name: Deploy application
copy:
src: "{{ item }}"
dest: "/opt/tomcat/webapps/"
owner: tomcat
group: tomcat
with_fileglob:
- "files/*.war"
- name: Enable and start Tomcat
systemd:
name: tomcat
enabled: yes
state: started
handlers:
- name: restart tomcat
systemd:
name: tomcat
state: restarted
12.2 CI/CD集成
Jenkins pipeline示例:
groovy复制pipeline {
agent any
environment {
TOMCAT_URL = 'http://tomcat-server:8080/manager/text'
TOMCAT_USER = credentials('tomcat-credentials')
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deploy') {
steps {
sh "curl --upload-file target/*.war '${TOMCAT_URL}/deploy?path=/myapp&update=true' --user ${TOMCAT_USER}"
}
}
}
post {
always {
junit '**/target/surefire-reports/*.xml'
}
failure {
mail to: 'team@example.com',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Check console output at ${env.BUILD_URL}"
}
}
}
12.3 监控集成
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'tomcat'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['tomcat-server:8080']
- job_name: 'jmx'
static_configs:
- targets: ['tomcat-server:9010']
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'tomcat-jmx'
Grafana仪表板可以监控:
- JVM内存使用
- 线程状态
- 请求吞吐量
- 错误率
- 响应时间分布
13. 高可用架构
13.1 负载均衡配置
Nginx配置示例:
nginx复制upstream tomcat {
least_conn;
server tomcat1:8080;
server tomcat2:8080;
server tomcat3:8080;
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://tomcat;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 30s;
}
# 静态资源直接由Nginx处理
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
root /var/www/static;
}
}
13.2 会话复制配置
在server.xml中启用集群:
xml复制<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"
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.MessageDispatch15Interceptor"/>
</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>
13.3 数据库会话存储
配置JDBCStore:
xml复制<Manager className="org.apache.catalina.session.PersistentManager"
maxActiveSessions="1000">
<Store className="org.apache.catalina.session.JDBCStore"
driverName="org.postgresql.Driver"
connectionURL="jdbc:postgresql://dbserver:5432/tomcat_sessions"
connectionName="session_user"
connectionPassword="session_password"
sessionTable="tomcat_sessions"
sessionIdCol="session_id"
sessionDataCol="session_data"
sessionValidCol="valid_session"
sessionMaxInactiveCol="max_inactive"
sessionLastAccessedCol="last_access"
sessionAppCol="app_name"/>
</Manager>
14. 安全最佳实践
14.1 SSL/TLS配置
生成证书:
bash复制keytool -genkey -alias tomcat -keyalg RSA -keystore /opt/tomcat/conf/keystore.jks -validity 3650 -keysize 2048
配置server.xml:
xml复制<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/keystore.jks"
certificateKeystorePassword="changeit"
type="RSA" />
</SSLHostConfig>
</Connector>
14.2 安全头部配置
在web.xml中添加:
xml复制<filter>
<filter-name>httpHeaderSecurity</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>
<init-param>
<param-name>hstsMaxAgeSeconds</param-name>
<param-value>31536000</param-value>
</init-param>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
14.3 安全扫描与加固
- 使用OWASP ZAP进行安全扫描:
bash复制docker run -v $(pwd):/zap/wrk/:rw -t owasp/zap2docker-stable zap-baseline.py \
-t http://your-tomcat-server:8080 -r report.html
-
定期更新Tomcat版本
-
禁用不必要功能:
- 禁用TRACE方法
- 禁用目录列表
- 禁用PUT和DELETE方法
-
使用安全管理器:
bash复制export CATALINA_OPTS="$CATALINA_OPTS -Djava.security.manager -Djava.security.policy==/opt/tomcat/conf/catalina.policy"
15. 故障排查手册
15.1 启动问题排查
常见错误及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Address already in use | 端口被占用 | 更改端口或杀死占用进程 |
| PermGen space不足 | 内存配置不足 | 增加MaxPermSize参数 |
| ClassNotFoundException | 类路径问题 | 检查lib目录和类路径 |
| 无法绑定到端口 | 权限不足 | 使用root启动或绑定到1024+端口 |
15.2 性能问题排查
- 线程转储分析:
bash复制jstack <pid> > thread_dump.txt
- 内存分析:
bash复制jmap -histo:live <pid> > memory_histo.txt
- 连接数监控:
bash复制netstat -anp | grep 8080 | wc -l
15.3 内存泄漏排查
- 生成堆转储:
bash复制jmap -dump:format=b,file=heap.hprof <pid>
-
分析工具:
- Eclipse MAT
- VisualVM
- YourKit
-
常见泄漏模式:
- 静态集合不断增长
- 未关闭的资源(数据库连接、文件句柄)
- 线程局部变量未清理
16. 版本升级指南
16.1 升级前准备
-
检查兼容性:
- 查看官方发布说明
- 检查应用依赖
- 验证JDK版本要求
-
备份关键数据:
- 配置文件
- 应用数据
- 会话数据(如果使用持久化会话)
-
准备回滚计划
16.2 升级步骤
- 停止当前Tomcat实例
- 备份当前安装目录
- 安装新版本Tomcat
