一直以来做的都是内网oa系统,今天学习了一下分布式系统部署,记录一下实践过程及问题:
一、配置
tomcat8.5 下载地址:http://tomcat.apache.org/
redis 下载地址:https://github.com/tporadowski/redis/releases
nginx 下载地址: http://nginx.org/en/download.html
我的测试目录:
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共享问题