欢迎光临殡葬网
详情描述

一、架构设计

用户请求 → Nginx(负载均衡) → Tomcat集群(多实例) → Redis(共享会话)

二、环境准备

1. 软件版本

  • Windows 10/11 或 Windows Server
  • Nginx 1.24+ 官网下载
  • Tomcat 9.0+ 官网下载
  • Redis for Windows 微软版本
  • JDK 8/11/17

2. 目录结构建议

C:\cluster\
├── nginx\
├── tomcat1\
├── tomcat2\
├── redis\
└── webapp\  # 你的Web项目

三、详细安装配置步骤

1. Redis安装配置

安装:

下载Redis for Windows 解压到 C:\cluster\redis 修改配置文件 redis.windows.conf
# 绑定所有IP,允许远程连接
bind 0.0.0.0

# 端口号
port 6379

# 设置密码(可选)
requirepass yourpassword

# 持久化设置
save 900 1
save 300 10
save 60 10000

# 最大内存
maxmemory 256mb
maxmemory-policy allkeys-lru

启动Redis:

# 方式1:命令行启动
cd C:\cluster\redis
redis-server.exe redis.windows.conf

# 方式2:安装为Windows服务
redis-server.exe --service-install redis.windows.conf --service-name RedisCluster
net start RedisCluster

2. Tomcat集群配置

准备两个Tomcat实例:

# 复制Tomcat文件夹
xcopy C:\cluster\tomcat1 C:\cluster\tomcat2 /E /I

修改Tomcat配置:

1) 修改端口(避免冲突)

tomcat1/conf/server.xml

<!-- 修改以下端口 -->
<Server port="8005" shutdown="SHUTDOWN">

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

tomcat2/conf/server.xml

<Server port="8006" shutdown="SHUTDOWN">

<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8444" />

<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />

2) 配置Redis会话共享

添加依赖到 tomcat1/lib/tomcat2/lib/

  • tomcat-redis-session-manager
  • jedis-3.6.0.jar
  • commons-pool2-2.9.0.jar

修改 conf/context.xml(两个Tomcat都改):

<Context>
    <!-- Redis Session Manager -->
    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
             host="localhost"
             port="6379"
             password="yourpassword"
             database="0"
             maxInactiveInterval="1800"
             sessionPersistPolicies="SAVE_ON_CHANGE"
             sentinelMaster=""
             sentinels=""
             timeout="2000"
             />
</Context>

3. Nginx负载均衡配置

修改 nginx/conf/nginx.conf

http {
    # 配置上游服务器(Tomcat集群)
    upstream tomcat_cluster {
        # ip_hash;  # 会话保持(可选)
        # least_conn;  # 最少连接(可选)

        # 权重配置 weight=数字,数字越大权重越高
        server localhost:8080 weight=1 max_fails=3 fail_timeout=30s;
        server localhost:8081 weight=1 max_fails=3 fail_timeout=30s;

        # 保持连接设置
        keepalive 32;
    }

    # 启用gzip压缩
    gzip on;
    gzip_min_length 1k;
    gzip_types text/plain application/javascript application/x-javascript text/css;

    server {
        listen       80;
        server_name  localhost;

        # 反向代理到Tomcat集群
        location / {
            proxy_pass http://tomcat_cluster;

            # 重要:传递客户端真实IP
            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 30s;
            proxy_read_timeout 120s;
            proxy_send_timeout 120s;

            # 启用长连接
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }

        # 静态文件处理(可选)
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 30d;
            proxy_pass http://tomcat_cluster;
        }

        # Nginx状态监控
        location /nginx_status {
            stub_status on;
            access_log off;
            allow 127.0.0.1;
            deny all;
        }
    }
}

4. 部署Web应用

创建测试应用 test-session.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head><title>Session Test</title></head>
<body>
    <h2>Tomcat集群会话测试</h2>
    <%
        String sessionId = session.getId();
        Integer counter = (Integer) session.getAttribute("counter");
        if (counter == null) {
            counter = 1;
        } else {
            counter++;
        }
        session.setAttribute("counter", counter);
    %>

    <p>服务器: <%= request.getLocalAddr() %>:<%= request.getLocalPort() %></p>
    <p>Session ID: <%= sessionId %></p>
    <p>访问次数: <%= counter %></p>
    <p>Session创建时间: <%= new java.util.Date(session.getCreationTime()) %></p>
</body>
</html>

将Web应用部署到两个Tomcat的 webapps/ROOT 目录。

四、启动和测试

1. 启动顺序

# 1. 启动Redis
C:\cluster\redis\redis-server.exe redis.windows.conf

# 2. 启动Tomcat集群
C:\cluster\tomcat1\bin\startup.bat
C:\cluster\tomcat2\bin\startup.bat

# 3. 启动Nginx
C:\cluster\nginx\nginx.exe
# 或
start nginx

2. 验证命令

# 检查进程
tasklist | findstr "nginx tomcat redis"

# 测试端口
netstat -ano | findstr :80
netstat -ano | findstr :8080
netstat -ano | findstr :8081
netstat -ano | findstr :6379

# 测试Redis连接
C:\cluster\redis\redis-cli.exe -h localhost -p 6379
> ping
> keys *

# 重新加载Nginx配置
nginx -s reload

# 停止Nginx
nginx -s quit

3. 访问测试

浏览器访问 http://localhost/test-session.jsp 多次刷新,观察:
  • 请求是否分配到不同Tomcat
  • Session计数器是否持续递增(证明会话共享成功)

五、进阶配置

1. Nginx健康检查

upstream tomcat_cluster {
    server localhost:8080;
    server localhost:8081;

    # 被动健康检查
    check interval=3000 rise=2 fall=3 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

2. 配置SSL(HTTPS)

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate      cert.pem;
    ssl_certificate_key  cert.key;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://tomcat_cluster;
        # ... 其他配置
    }
}

3. Windows服务配置(开机自启)

创建启动脚本 start_cluster.bat

@echo off
title Web集群启动脚本

echo 启动Redis服务...
call net start RedisCluster 2>nul
if errorlevel 1 (
    echo Redis未安装为服务,直接启动...
    start "Redis" "C:\cluster\redis\redis-server.exe" "C:\cluster\redis\redis.windows.conf"
)

echo 启动Tomcat集群...
start "Tomcat1" "C:\cluster\tomcat1\bin\startup.bat"
timeout /t 5 /nobreak
start "Tomcat2" "C:\cluster\tomcat2\bin\startup.bat"

echo 启动Nginx...
cd /d "C:\cluster\nginx"
start nginx

echo 所有服务已启动!
echo 访问地址: http://localhost
pause

六、监控和维护

1. 监控脚本 monitor.bat

@echo off
echo === 集群状态监控 ===
echo.

echo [1] Nginx进程:
tasklist /fi "imagename eq nginx.exe"

echo.
echo [2] Tomcat进程:
tasklist /fi "imagename eq java.exe"

echo.
echo [3] Redis进程:
tasklist /fi "imagename eq redis-server.exe"

echo.
echo [4] 端口监听:
netstat -ano | findstr /c:":80 " /c:":8080" /c:":8081" /c:":6379"

echo.
echo [5] 访问测试:
curl -s http://localhost/test-session.jsp | findstr "服务器"
pause

2. 日志查看

# Nginx日志
tail -f C:\cluster\nginx\logs\access.log
tail -f C:\cluster\nginx\logs\error.log

# Tomcat日志
tail -f C:\cluster\tomcat1\logs\catalina.out
tail -f C:\cluster\tomcat2\logs\catalina.out

# Redis日志
type C:\cluster\redis\redis.log

七、故障排除

常见问题及解决方案:

端口冲突

netstat -ano | findstr :端口号
taskkill /F /PID 进程ID

Redis连接失败

  • 检查Redis是否启动
  • 检查防火墙设置
  • 验证密码配置

会话不共享

  • 检查tomcat-redis-session-manager的JAR版本
  • 确认context.xml配置正确
  • 查看Tomcat日志中的错误信息

Nginx 502错误

  • 检查Tomcat是否正常运行
  • 调整Nginx超时时间
  • 检查代理配置

这个方案可以实现高可用的Web集群,通过Redis实现了会话共享,Nginx提供了负载均衡和静态资源缓存,适合中小型项目的集群部署。

相关帖子
不同省市对于高温津贴计入最低工资的标准,是否存在差异?
不同省市对于高温津贴计入最低工资的标准,是否存在差异?
宿迁市殡葬服务车出租-葬礼灵堂,价格公道
宿迁市殡葬服务车出租-葬礼灵堂,价格公道
最低工资调整后,不同城市间的就业吸引力会发生怎样的变化?
最低工资调整后,不同城市间的就业吸引力会发生怎样的变化?
未来的智能台灯和家居照明,如何设计才能更好地呵护双眼?
未来的智能台灯和家居照明,如何设计才能更好地呵护双眼?
宿迁市一站式殡葬服务办理-殡葬花篮,价格公道
宿迁市一站式殡葬服务办理-殡葬花篮,价格公道
在食用当季蔬果时,有哪些有效的家庭处理方法可以减少农残疑虑?
在食用当季蔬果时,有哪些有效的家庭处理方法可以减少农残疑虑?
因手机信号或系统问题导致无法按时核销,会被误判为爽约吗?
因手机信号或系统问题导致无法按时核销,会被误判为爽约吗?
2026年中考综合素质评价越来越重要,小学阶段该怎么帮孩子攒素材?
2026年中考综合素质评价越来越重要,小学阶段该怎么帮孩子攒素材?
当有意外收入时,将其转为储蓄而非消费的心理技巧有哪些?
当有意外收入时,将其转为储蓄而非消费的心理技巧有哪些?
对于刚参加工作不久的年轻人,租房提取住房公积金有哪些便利条件与渠道?
对于刚参加工作不久的年轻人,租房提取住房公积金有哪些便利条件与渠道?
近年有哪些新兴的行业或赛道获得了更多的创业政策倾斜?
近年有哪些新兴的行业或赛道获得了更多的创业政策倾斜?
过桥垫资费用如何核算?结合计费规则看懂单日收费与总成本计算
过桥垫资费用如何核算?结合计费规则看懂单日收费与总成本计算
房产抵押贷款相关法规解读,学法懂法保障抵押借贷行为合法合规
房产抵押贷款相关法规解读,学法懂法保障抵押借贷行为合法合规
台风来临前窗外突然变得安静,真的是风暴已经过去了吗?
台风来临前窗外突然变得安静,真的是风暴已经过去了吗?
押车贷款办理流程详解,签订借据时借款用途怎么填写?
押车贷款办理流程详解,签订借据时借款用途怎么填写?
大暑三候
大暑三候"腐草为萤、土润溽暑、大雨时行"该怎么理解?
解读相关法律法规对“最终解释权归本店所有”这类单方声明的具体规定
解读相关法律法规对“最终解释权归本店所有”这类单方声明的具体规定
2026年有没有更智能的个人收款码账单管理与分析工具?
2026年有没有更智能的个人收款码账单管理与分析工具?
房产证红本抵押贷款办理流程全解析,从申请到放款只需七步
房产证红本抵押贷款办理流程全解析,从申请到放款只需七步
头伏饺子二伏面三伏烙饼摊鸡蛋,这套吃法背后是哪里的民俗习惯?
头伏饺子二伏面三伏烙饼摊鸡蛋,这套吃法背后是哪里的民俗习惯?