架构图:
使用资源:
nginx主服务器:192.168.0.90
tomcat项目服务器1:192.168.0.91
tomcat项目服务器2:192.168.0.92
redis服务器:192.168.0.93
注意访问时需要配置防火墙规则,或者关闭防火墙
一、前言:上一篇文章讲到了Nginx实现反向代理和负载均衡,最后虽然看到了效果,但是还有一个问题就是在负载均衡的情况下session不能实现集服务之间共享,比如用户登录时被分配到192.168.0.91服务器,这台服务器记录下用户session,而在跳转到首页时分配到192.168.0.92服务器,这台服务器没有用户session信息,导致用户是未登录状态,这样很明显是不友好的。
二、session共享办法
1、nginx提供了ip_hash策略,就是根据请求ip进行hash计算,根据hash值将用户分配到一台固定的服务器。
2、session保存在redis或memcache中,把session抽取出来放到内存数据库中,读取速度快,实现session在多台服务器之间共享。
三、session+redis实现session共享
1、指定一台redis服务器安装redis,安装redis也很简单,请自行百度。
2、修改redis.conf
设置允许连接redis的ip(图一)或者关闭保护模式(图二)
设置守护线程,后台启动,貌似redis3.X版本以后这个参数默认是true
3、启动redis
./redis-server redis.conf
4、配置tomcat服务器tomcatA192.168.0.91和tomcatB192.168.0.92;
引入jar包放到tomcat的lib目录下(commons-pool2-2.0.jar+jedis-2.5.0.jar+tomcat-redis-session-manager-2.0.0.jar);
建议tomcat7引入这三个jar包版本尽量要和我的一样,如果报错基本都是jar包版本问题,反正我是引入其他版本报各种问题唉;
jar包下载链接:https://pan.baidu.com/s/1geZVozx#list/path=%2F;
tomcat8目前不支持session共享,也有解决办法,链接:https://www.cnblogs.com/cgli/p/7920573.html
5、配置tomcat的context.xml,在context节点增加如下内容
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="redis服务地址"
port="6379"
database="0"
maxInactiveInterval="60" />
6、启动tomcatA和tomcatB,如果报类找不到或者其他错误,一般就是jar包版本问题。
7、启动ngin,这块需要和上一篇文章nginx实现反向代理和负载均衡连起来实现。
8、访问192.168.0.90:81,nginx地址
session不变,即使一台服务器挂掉,访问另一台服务器也能拿到session
redis已保存session
9,session 实现共享。