1. 项目概述
在Web应用开发中,会话(Session)管理一直是架构设计的关键环节。当应用需要横向扩展时,传统的单机Session存储方式就会面临严峻挑战。最近我在一个电商项目中,就遇到了多Tomcat节点间的Session共享问题。经过反复测试验证,最终采用Nginx+Tomcat+Redis+Redisson的方案完美解决了这个痛点。
这套架构的核心价值在于:
- 通过Nginx实现负载均衡,将请求分发到多个Tomcat节点
- 使用Redis作为集中式Session存储,替代Tomcat默认的内存Session
- 借助Redisson客户端简化Redis操作,提供分布式锁等高级功能
- 支持单节点和集群两种Redis部署模式,适应不同规模的应用场景
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与组件选型
2.1 版本选择建议
在实际部署中,版本兼容性至关重要。以下是我验证过的稳定版本组合:
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| Nginx | 1.20.1 | 支持HTTP/2,稳定性好 |
| Tomcat | 9.0.62 | JDK8兼容性好 |
| Redis | 6.2.6 | 支持多线程IO |
| Redisson | 3.17.5 | 与Spring Boot集成度高 |
| JDK | 1.8.0_321 | 企业级应用主流选择 |
提示:生产环境建议使用Redis 6.x以上版本,其多线程特性可以显著提升吞吐量。
2.2 硬件资源配置
根据我的经验,不同规模的系统需要匹配不同的资源配置:
开发测试环境:
- CPU:4核
- 内存:8GB
- 磁盘:50GB SSD
- 网络:1Gbps
生产环境(中等流量):
- CPU:8核
- 内存:16GB
- 磁盘:100GB SSD
- 网络:10Gbps
3. 核心组件配置详解
3.1 Nginx负载均衡配置
Nginx的核心作用是实现请求的负载均衡。以下是我的典型配置:
nginx复制upstream tomcat_cluster {
# 加权轮询策略
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080 weight=2;
server 192.168.1.103:8080 weight=1;
# 保持长连接
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Session粘滞配置(可选)
# proxy_cookie_path / "/; HttpOnly; SameSite=Strict";
}
}
关键参数说明:
weight:节点权重,数值越大分配的请求越多keepalive:保持的连接数,减少TCP握手开销proxy_set_header:确保原始客户端信息传递到后端
3.2 Tomcat Session配置
要让Tomcat使用Redis存储Session,需要修改context.xml:
xml复制<Context>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="redis.example.com"
port="6379"
database="0"
password="your_redis_password"
maxInactiveInterval="1800"
sessionPersistPolicies="SAVE_ON_CHANGE"
sentinelMaster="mymaster" <!-- 集群模式使用 -->
sentinels="sentinel1:26379,sentinel2:26379,sentinel3:26379"/>
</Context>
配置技巧:
maxInactiveInterval设置为30分钟(1800秒)是个平衡点SAVE_ON_CHANGE策略确保Session变更立即持久化- 生产环境建议使用Sentinel模式提高可用性
3.3 Redis集群配置
对于三节点Redis集群,每个节点的redis.conf需要包含:
conf复制port 6379
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
appendonly yes
protected-mode no
requirepass your_secure_password
启动集群后,使用以下命令创建槽位分配:
bash复制redis-cli --cluster create \
192.168.1.201:6379 \
192.168.1.202:6379 \
192.168.1.203:6379 \
--cluster-replicas 0 \
-a your_secure_password
4. Redisson集成与优化
4.1 Spring Boot集成配置
在application.yml中添加Redisson配置:
yaml复制spring:
redis:
redisson:
config: |
singleServerConfig:
address: "redis://redis.example.com:6379"
password: "your_redis_password"
database: 0
connectionPoolSize: 64
subscriptionConnectionPoolSize: 16
codec: !<org.redisson.codec.JsonJacksonCodec> {}
4.2 分布式Session管理
创建自定义SessionRepository:
java复制@Bean
public RedisOperationsSessionRepository sessionRepository(
@Qualifier("sessionRedisTemplate") RedisTemplate<String, Object> sessionRedisTemplate) {
RedisOperationsSessionRepository repository = new RedisOperationsSessionRepository(sessionRedisTemplate);
repository.setDefaultMaxInactiveInterval(1800); // 30分钟
return repository;
}
4.3 连接池优化建议
根据压测结果,推荐以下连接池参数:
| 参数 | 开发环境 | 生产环境 |
|---|---|---|
| connectionPoolSize | 16 | 64 |
| subscriptionConnectionPoolSize | 8 | 16 |
| idleConnectionTimeout | 10000 | 30000 |
| connectTimeout | 1000 | 3000 |
| timeout | 3000 | 5000 |
5. 性能调优与监控
5.1 关键指标监控
建议监控以下核心指标:
| 指标名称 | 健康阈值 | 监控工具 |
|---|---|---|
| Redis内存使用率 | <70% | Prometheus+Grafana |
| Tomcat线程池活跃线程 | <最大线程80% | Spring Boot Actuator |
| Nginx活跃连接数 | <worker_connections80% | nginx_status |
| Session创建速率 | <1000次/秒 | Redis慢查询日志 |
5.2 JVM调优参数
Tomcat的JVM参数建议配置:
bash复制JAVA_OPTS="-server -Xms4g -Xmx4g -XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m -XX:+UseG1GC
-XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4
-XX:ConcGCThreads=2 -XX:InitiatingHeapOccupancyPercent=35"
6. 常见问题排查
6.1 Session丢失问题
现象:用户登录状态随机丢失
排查步骤:
- 检查Redis内存是否已满
- 确认Redis持久化配置(AOF/RDB)
- 验证网络连接稳定性
- 检查Tomcat-Redis连接超时设置
6.2 性能瓶颈分析
当QPS达到2000时出现延迟:
-
Redis CPU饱和
- 解决方案:升级到多线程版本或增加节点
-
Nginx worker不足
- 调整配置:
nginx复制worker_processes auto; worker_connections 10240; multi_accept on;
- 调整配置:
-
Tomcat线程池耗尽
- 修改
server.xml:xml复制<Executor name="tomcatThreadPool" maxThreads="500" minSpareThreads="50"/>
- 修改
7. 安全加固措施
7.1 Redis安全配置
conf复制# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUS[HAL](https://taotoken.net/?utm_source=general)L ""
rename-command CONFIG ""
# 启用TLS
tls-port 6379
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
7.2 Nginx防护配置
nginx复制# 防止DDoS
limit_req_zone $binary_remote_addr zone=one:10m rate=100r/s;
# 隐藏服务器信息
server_[token](https://taotoken.net?utm_source=general)s off;
more_clear_headers 'Server';
8. 部署架构演进
8.1 单节点部署
适合初期小流量场景:
code复制Client → Nginx → Tomcat
↘ Redis (单节点)
8.2 集群部署方案
高可用架构设计:
code复制Client → Nginx (主备)
→ Tomcat集群 (3节点)
→ Redis集群 (3主3从)
→ Redisson客户端
在实际项目中,我们经历了从单节点到集群的完整演进过程。初期使用单Redis节点可以简化运维,当日均PV超过50万时,切换到Redis集群后性能提升了3倍,同时保证了99.99%的可用性。
