用 Nginx 反向代理多台服务器的时候,会出现 session 不同步的问题,如用户在tomcat1中登录,保存了用户信息进 session 中,但是tomcat2中的 session 中没有该用户信息,如果用户再次发出请求时分配到了 tomcat2 中,就会出现 找不到用户 session信息,重新调整到登录页面的情况,所以,采用redis 缓存数据库来保存session 的方式,这样就解决了问题。
步骤:
tomcat部分:
部署两台(或者多台)tomcat,如果是同一台电脑的话可以参考我的另一篇博客:https://blog.csdn.net/DGH2430284817/article/details/90417905
到每一个tomcat中的conf目录下打开 context.xml ,添加配置,连接redis数据库
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60"
/>
在每一个tomcat 的 lib目录下,放入以下所需要的jar包:
commons-pool-1.5.4.jar
commons-pool2-2.0.jar
jedis-2.2.0.jar
tomcat-redis-session-manager-1.2-tomcat-7.jar (其他包都可以maven里面找,这个比较不好找,点击这里下载)
tomcat-util.jar
web项目部分:
web项目中可以添加一个jsp页面,用来查看不同的tomcat的session 是否相同(index2.jsp):
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body class="signin">
tomcat01 <br>
session:<%=session.getId()%>
</body>
</html>
把项目的war包放到每一个 tomcat 的 webapps 目录下,这样在 tomcat 启动的时候,会自动解压部署web项目
nginx部分:
修改conf目录下的 nginx.conf 文件:
upstream tomcatServer{
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcatServer/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
配置完成,先启动redis数据库 , 具体可以看另一篇博客 https://mp.csdn.net/postedit/87696552
再启动 nginx 和 tomcat 跑起项目,然后不断刷新 index2.jsp 页面,看session信息是否相同。
我的访问地址是http://127.0.0.1/medical-web-boss/index2.jsp,根据不同的项目名,
你们可自行修改http://127.0.0.1/项目名/index2.jsp
结果:
tomcat01
tomcat02
成功!!