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 数据。
相关推荐
闲云一鹤16 小时前
nginx 快速入门教程 - 写给前端的你
前端·nginx·前端工程化
何中应4 天前
Nginx转发请求错误
前端·后端·nginx
大大水瓶5 天前
Tomcat
java·tomcat
芝士雪豹只抽瑞克五5 天前
Nginx 高性能Web服务器笔记
服务器·nginx
失重外太空啦5 天前
Tomcat
java·服务器·tomcat
屎到临头想搅便5 天前
TOMCAT
java·tomcat
失重外太空啦5 天前
nginx
运维·nginx
微风起皱5 天前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
知我Deja_Vu5 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存