Nginx+Tomcat+Redis(单节点 / 3 节点集群)+Redisson 共享 Session 完整整合手册

本手册整合单节点 Redis、3 节点 Redis 哨兵集群、3 节点 Redis Cluster 集群 三种部署方案,搭配 Redisson 实现 Tomcat Session 共享 + Nginx 负载均衡,所有配置可直接落地,适配redisson-all-3.20.0.jar+redisson-tomcat-9-3.20.0.jar,兼顾测试与生产场景。

一、核心架构与环境准备

1. 核心架构逻辑

组件 角色与作用
Nginx 前端反向代理,实现 Tomcat 集群负载均衡,转发客户端请求
Tomcat 集群 ≥2 个节点,提供相同 Web 服务,通过 Redisson 将 Session 存储到 Redis
Redisson Tomcat 与 Redis 的中间件,支持单节点 / 集群 Redis,实现 Session 分布式共享
Redis 三种部署模式:单节点(测试)、3 节点哨兵(中小规模高可用)、3 节点 Cluster(大规模分片)

2. 组件版本与依赖

组件 推荐版本 必备资源
JDK 1.8+ 所有 Tomcat 节点版本一致
Tomcat 9.0/8.5 Tomcat9 用redisson-tomcat-9,Tomcat8.5 用redisson-tomcat-8
Nginx 1.18+ 无额外依赖
Redis 5.0+/6.0+ 单节点 / 3 节点集群部署
Redisson 包 3.20.0 1. redisson-all-3.20.0.jar:https://repo1.maven.org/maven2/org/redisson/redisson-all/3.20.0/redisson-all-3.20.0.jar2. redisson-tomcat-9-3.20.0.jar:https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-9/3.20.0/redisson-tomcat-9-3.20.0.jar

3. 前置操作

  1. 将两个 Redisson 包放入所有 Tomcat 节点{CATALINA_HOME}/lib目录,执行chmod 644 redisson-*.jar赋予可读权限;
  2. 所有节点网络互通:Nginx 能访问 Tomcat,Tomcat 能访问 Redis。

二、Redis 部署方案(3 种,含 3 节点集群)

方案 1:Redis 单节点(测试环境)

1. 配置文件(/etc/redis/redis-6379.conf
复制代码
bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis-6379.log
dir /var/lib/redis/6379

# 安全与持久化
requirepass 123456
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
2. 启动与验证
复制代码
# 创建数据目录
mkdir -p /var/lib/redis/6379 && chown -R redis:redis /var/lib/redis/
# 启动Redis
redis-server /etc/redis/redis-6379.conf
# 验证连接
redis-cli -p 6379 -a 123456 ping  # 返回PONG即成功

方案 2:Redis 3 节点哨兵集群(1 主 2 从,中小规模高可用)

1. 节点规划(3 台 Redis,无额外哨兵节点,测试用简化版)
角色 端口 配置文件 数据目录
主节点 6379 redis-6379.conf /var/lib/redis/6379
从节点 1 6380 redis-6380.conf /var/lib/redis/6380
从节点 2 6381 redis-6381.conf /var/lib/redis/6381
2. 配置文件
主节点(redis-6379.conf):同单节点配置,无需修改
从节点 1(redis-6380.conf):新增主节点指向
复制代码
# 其余配置同主节点,仅新增/修改以下内容
port 6380
pidfile /var/run/redis_6380.pid
logfile /var/log/redis/redis-6380.log
dir /var/lib/redis/6380
# 指向主节点
slaveof 127.0.0.1 6379
从节点 2(redis-6381.conf):同理修改
复制代码
port 6381
pidfile /var/run/redis_6381.pid
logfile /var/log/redis/redis-6381.log
dir /var/lib/redis/6381
slaveof 127.0.0.1 6379
3. 启动与验证
复制代码
# 创建数据目录
mkdir -p /var/lib/redis/6379 /var/lib/redis/6380 /var/lib/redis/6381 && chown -R redis:redis /var/lib/redis/
# 启动所有节点
redis-server /etc/redis/redis-6379.conf
redis-server /etc/redis/redis-6380.conf
redis-server /etc/redis/redis-6381.conf
# 验证主从同步
redis-cli -p 6379 -a 123456 info replication  # 显示connected_slaves:2即成功

方案 3:Redis 3 节点 Cluster 集群(3 主无从,测试用简化版)

1. 节点规划
角色 端口 配置文件 数据目录
主节点 1 7000 redis-7000.conf /var/lib/redis/7000
主节点 2 7001 redis-7001.conf /var/lib/redis/7001
主节点 3 7002 redis-7002.conf /var/lib/redis/7002
2. 配置文件(以 7000 为例,其余仅改端口)
复制代码
bind 0.0.0.0
protected-mode no
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis-7000.log
dir /var/lib/redis/7000

# 安全配置
requirepass 123456
masterauth 123456

# Cluster核心配置
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
cluster-require-full-coverage yes

# 持久化
appendonly yes
appendfilename "appendonly-7000.aof"
3. 启动与创建集群
复制代码
# 创建数据目录
mkdir -p /var/lib/redis/7000 /var/lib/redis/7001 /var/lib/redis/7002 && chown -R redis:redis /var/lib/redis/
# 启动所有节点
redis-server /etc/redis/redis-7000.conf
redis-server /etc/redis/redis-7001.conf
redis-server /etc/redis/redis-7002.conf
# 创建3主Cluster集群
redis-cli -a 123456 --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0
# 验证集群状态
redis-cli -c -p 7000 -a 123456 cluster info  # 显示cluster_state:ok即成功

三、Redisson 配置(适配所有 Redis 模式,2 种格式)

将配置文件放入所有 Tomcat 节点{CATALINA_HOME}/conf目录,根据 Redis 模式选择对应配置。

1. YAML 格式配置(推荐)

(1)适配 Redis 单节点:redisson-single.yaml
复制代码
singleServerConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  password: "123456"
  address: "redis://127.0.0.1:6379"
  database: 0
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
(2)适配 Redis 3 节点哨兵集群:redisson-sentinel.yaml
复制代码
sentinelServersConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  password: "123456"
  sentinelAddresses:
    - "redis://127.0.0.1:6379"
    - "redis://127.0.0.1:6380"
    - "redis://127.0.0.1:6381"
  masterName: "mymaster"
  database: 0
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"
(3)适配 Redis 3 节点 Cluster 集群:redisson-cluster.yaml
复制代码
clusterServersConfig:
  idleConnectionTimeout: 10000
  connectTimeout: 10000
  timeout: 3000
  retryAttempts: 3
  retryInterval: 1500
  password: "123456"
  nodeAddresses:
    - "redis://127.0.0.1:7000"
    - "redis://127.0.0.1:7001"
    - "redis://127.0.0.1:7002"
  scanInterval: 1000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.JsonJacksonCodec> {}
transportMode: "NIO"

2. JSON 格式配置(与 YAML 等价)

(1)单节点:redisson-single.json
复制代码
{
  "singleServerConfig": {
    "password": "123456",
    "address": "redis://127.0.0.1:6379",
    "database": 0
  },
  "threads": 16,
  "nettyThreads": 32,
  "codec": {"class":"org.redisson.codec.JsonJacksonCodec"}
}
(2)哨兵集群 / Cluster 集群:将 YAML 对应字段转为 JSON 结构即可,此处省略

四、Tomcat 集群配置(核心:Session 共享)

1. Tomcat 端口区分(2 节点为例,避免冲突)

修改{CATALINA_HOME}/conf/server.xml,调整 3 个核心端口:

Tomcat 节点 关闭端口 HTTP 端口 AJP 端口
Tomcat1 8005 8080 8009
Tomcat2 8006 8081 8010

2. 启用 Redisson Session 共享(所有 Tomcat 节点一致)

编辑{CATALINA_HOME}/conf/context.xml,在<Context>标签内添加配置,根据 Redis 模式选择对应 configPath

复制代码
<Context>
  <Manager className="org.redisson.tomcat.RedissonSessionManager"
           <!-- 单节点 -->
           configPath="${catalina.base}/conf/redisson-single.yaml"
           <!-- 哨兵集群 -->
           <!-- configPath="${catalina.base}/conf/redisson-sentinel.yaml" -->
           <!-- Cluster集群 -->
           <!-- configPath="${catalina.base}/conf/redisson-cluster.yaml" -->
           readMode="REDIS"
           updateMode="AFTER_REQUEST"
           />
</Context>

3. 统一 Session 超时时间

编辑{CATALINA_HOME}/conf/web.xml,设置与 Redisson 一致的超时时间:

复制代码
<session-config>
  <session-timeout>30</session-timeout> <!-- 30分钟 -->
</session-config>

4. 启动 Tomcat 并验证

复制代码
# 启动Tomcat节点
cd /usr/local/tomcat8080/bin && ./startup.sh
cd /usr/local/tomcat8081/bin && ./startup.sh
# 查看日志,确认无Redis连接错误
tail -f /usr/local/tomcat8080/logs/catalina.out

五、Nginx 负载均衡配置

1. 核心配置(/usr/local/nginx/conf/nginx.conf

复制代码
http {
    # Tomcat集群上游配置
    upstream tomcat_cluster {
        server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
        server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name localhost;

        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;
        }
    }
}

2. 启动与验证

复制代码
# 检查配置
/usr/local/nginx/sbin/nginx -t
# 启动/重启
/usr/local/nginx/sbin/nginx -s reload

六、整体功能验证(通用步骤)

1. 制作测试页面

所有 Tomcatwebapps/ROOT目录下创建test-session.jsp

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.net.InetAddress" %>
<html>
<body>
    <h1>Nginx+Tomcat+Redis Session共享测试</h1>
    <p>【SessionID】:<%= session.getId() %></p>
    <p>【当前Tomcat】:<%= InetAddress.getLocalHost().getHostAddress() + ":" + request.getServerPort() %></p>
    <p>【是否新Session】:<%= session.isNew() ? "是" : "否(共享成功)" %></p>
</body>
</html>

2. 验证标准

  1. 浏览器访问http://Nginx_IP/test-session.jsp
  2. 刷新页面:SessionID 始终不变,Tomcat 节点在 8080/8081 间切换 → Session 共享成功;
  3. Redis 端验证:执行keys redisson:session:*,能查到与页面一致的 Session 键 → 存储成功;
  4. 高可用验证(集群模式):停掉 Redis 主节点,等待 5 秒后刷新页面,SessionID 仍不变 → 故障转移生效。

七、全局避坑指南(必看)

  1. Redisson 包版本匹配 :Tomcat9 必须用redisson-tomcat-9,版本不匹配会导致 Tomcat 启动失败;
  2. Redis 密码一致性:所有 Redis 节点、Redisson 配置的密码必须相同,否则连接拒绝;
  3. 配置文件路径 :Redisson 配置文件需放在 Tomcat 的conf目录,configPath${catalina.base}/conf/xxx.yaml
  4. 防火墙开放端口:生产需开放 Nginx80、Tomcat8080/8081、Redis 对应端口(6379/6380/6381 或 7000-7002);
  5. Session 对象序列化 :自定义对象存入 Session 需实现java.io.Serializable接口,否则序列化失败;
  6. Redis 持久化:所有模式均需开启 AOF+RDB,防止 Redis 重启丢失 Session 数据。
相关推荐
米汤爱学习2 小时前
Redis-漏洞
数据库·redis·缓存
像少年啦飞驰点、2 小时前
零基础入门 Redis:从“缓存是什么”到手写一个简易购物车系统
java·spring boot·redis·缓存·编程入门·小白教程
wWYy.2 小时前
详解redis(7):数据结构List
数据库·redis·缓存
专注于大数据技术栈2 小时前
Redis 中 USED 和 RSS
数据库·redis·缓存
江君是实在人3 小时前
java 面试题 redis 处理大key问题
java·开发语言·redis
试剂小课堂 Pro6 小时前
mPEG-Silane:mPEG链单端接三乙氧基硅的亲水性硅烷偶联剂
java·c语言·网络·c++·python·tomcat
东方轧线6 小时前
给 AI 安装高速缓存:实战 MCP 对接 Redis,实现热点数据的毫秒级读取与状态共享
数据库·人工智能·redis
卡西里弗斯奥7 小时前
【Tomcat】部署Web服务器之Tomcat
服务器·前端·tomcat
菜鸟厚非7 小时前
如何在 Nginx 中配置 HTTPS - Linux
linux·nginx·https