一直以来做的都是内网oa系统,今天学习了一下分布式系统部署,记录一下实践过程及问题:
一、配置
tomcat8.5 下载地址:http://tomcat.apache.org/
redis 下载地址:https://github.com/tporadowski/redis/releases
nginx 下载地址: http://nginx.org/en/download.html
另外需要下载jar包:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/4.0

我的测试目录:

1、配置多个tomcat
tomcat 8.5复制几遍,我这里复制了三个,修改tomcat的server.xml保证三个tomcat端口不一样:
例:
tomcat1:
tomcat2:

2、配置nginx
nginx 端口默认80,我这边修改为8060(nginx-1.18.0/conf/nginx.conf)

接下来配置集群:
在http下增加如下配置:
upstream tomcat_client {
#ip_hash;#此为根据IP地址分配,同一个ip总会分配到同一个服务
#weight权重,默认1,权重越大访问概率越大
server localhost:8081 weight=5;
server localhost:8082 weight=5;
server localhost:8083 weight=5;
}

开启反向代理:在location /中增加如下代码:
proxy_pass http://tomcat_client; #与upstream 设置名称相同
proxy_redirect default;
#设置代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
图:

此时集群已经配置好,启动三个tomcat 与 nginx ,访问 nginx,会轮流分配到三个tomcat。为每个tomcat设置不同首页,不停刷新可以看出来。
3、配置redis
设置redis内存最大值:我这里设置512mb(Redis-x64-5.0.9/redis.windows.conf)

4、最后配置tomcat支出redis的jar包啦:
还记得之前下载的jar包么:

解压:

照例需要配置:(tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties)

ip与端口要和redis一致。
然后将conf 和lib 两个文件夹,覆盖进 tomcat 的conf和lib ,每个tomcat都要覆盖哦。
最最最后一步,修改tomcat的配置文件,增加以下代码:(apache-tomcat-8.5.39(1)/conf/context.xml)
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
图:

可以从jar包解压文件夹中的readme中拷贝,自己拼写千万不要写错字。
5、最后,启动redis、nginx、tomcat,查看你的成果吧!
二、测试
1、启动redis
命令行:cmd 移动到 redis 主目录,然后执行 redis-server.exe redis.windows.conf
关闭 : 直接叉掉窗口即可。
2、启动nginx
直接双击 nginx.exe ,启动之后不会有窗口。
关闭:命令行:cmd 移动到nginx主目录,执行 nginx -s quit
3、启动tomcat
重写tomcat ROOT 中的jsp页面:
tomcat1:
<%@ page pageEncoding="UTF-8" import="java.util.*" contentType="text/html; charset=UTF-8" %>
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%
request.getSession().setAttribute("mzd","123");
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
String date=simpleDateFormat.format(new Date());
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title></title>
</head>
<body>
SessionID:<%=session.getId()%>
<BR>
当前时间为:<%=date%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
mzd的值为:<%=session.getAttribute("mzd")%>
<BR>
<%
out.println("tomcat1");
%>
</body>
</html>
tomcat2:
<%@ page pageEncoding="UTF-8" import="java.util.*" contentType="text/html; charset=UTF-8" %>
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
String date=simpleDateFormat.format(new Date());
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title></title>
</head>
<body>
SessionID:<%=session.getId()%>
<BR>
当前时间为:<%=date%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
mzd的值为:<%=session.getAttribute("mzd")%>
<BR>
<%
out.println("tomcat2");
%>
</body>
</html>
测试结果:

刷新:

成功!session同步了!
三、问题:
在配置过程中还是遇到一些问题的,比如:
1、redis 启动无反应,执行命令行之后,没有报错也没有任何反应

原因:maxmemory 前面不能有空格

2、配置完tomcat 的context.xml后启动报错:
注意配置代码是否拼写错误,valve 不是value,写错会报 failed to start component..... 错误
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
className 不同版本的jar包也可能不同,可以解压查看文件名称是否正确。
四、最后,感谢这位兄弟的博客:nginx集群tomcat,session共享问题
本文详细介绍了如何使用Tomcat、Redis和Nginx搭建分布式系统,包括配置多实例Tomcat、Nginx反向代理和负载均衡,以及通过Redis实现session共享。解决了配置过程中的常见问题,并提供了测试方法。
701

被折叠的 条评论
为什么被折叠?



