目录
4.实验三:nginx给两台tomcat的RealServer做负载均衡,返回Session不同并解决Session一致性的问题
1.写在前面
接下来拿着Nginx做几个比较常见的实验。
2.实验一:实现nginx的虚拟服务器功能
在做实验前,我们需要提前修改本机windows中host文件,设置ip与域名映射关系。
接下来,我们直接在linux服务器中修改nginx.conf文件即可:
结果展示:
3.实验二:解决Nginx链接跳转问题
我们通过nginx反向代理访问www.baidu.com,如果我们通过http来访问,则会发生页面跳转问题。我们可以看到:
-
-
现象
-
nginx的location配置
-
访问www.wymnode01.com/oxox,发现发生了页面跳转,跳转到www.baidu.com
-
nginx的location配置
- 结果分析:由于Client通过反响代理和http访问百度,请求也确实经过了nginx到达了百度,但是由于现在的大网站都是https的协议。百度服务器收到http请求后,会给Client返回一个跳转连接,那么Client通过跳转连接则会和百度服务器直接建立连接而跳过nginx。所以我们要避免这种情况
-
问题解决:在114行将http改成https就可以了
-
现象
4.实验三:nginx给两台tomcat的RealServer做负载均衡,返回Session不同并解决Session一致性的问题
- 问题描述:假设nginx后面RealServer集群(R1和R2)搭载tomcat,并有着用户登录和用户主页访问的功能,那么如果我们的Client先访问R1并登录获取了R1发送的Session,这时候连接断开,Client携带Session访问RealServer集群,但是nginx将这个请求负载给了R2,由于R2的Session和R1的Session不一样,就会引发登录重定向,要求用户重新登陆。这样的情况和京东淘宝的登陆情况是不同的,因为两个网站都没有需要重复登陆的问题,在解决问题之前我们先将问题复现
-
问题复现
- 将R1与R2(node02和node03)装上,并进入tomcat的主页文件进行修改,将之前的主页index.jsp备份成为index.jsp.bak,对主页进行如下修改
- node02
- node03
- node02
- 在node01也就是nginx.conf中给R1和R2配置负载均衡,并监听8080端口,防火墙也放开8080端口
- 添加upstream
- 添加location
-
结果演示:两者session不同
-
负载给node02
-
刷新后负载给node03
-
负载给node02
-
问题解决:session不同的问题我们可以在RealServer集群后加一台服务器(S1),让RealServer集群将Session统一写到S1中,即使负载均衡给了不同的RealServer,那么这台RealServer只需要查询S1的Session表中是否有对应的Session,不需要和自己产生的Session进行匹配了。但是问题又会出现,这台S1会承载大量的RealServer的IO请求,如果S1是一台mysql,则会非常慢,因为IO速度成为了限制瓶颈(硬盘IO速度很慢)。我们可以使用Redis集群来解决这个问题,将IO速度提升为内存IO速度,从而提升了性能。我们这里先不用Redis,先用memcached来实现,后续引出Redis。因为session不一致问题不是出现在nginx,所以我们只需要将缓存服务器搭建在tomcat的集群之外的服务器就可以了,这里我们选择搭建在nginx服务器上。
-
解决步骤:
-
安装memcahed:这里下图的蓝色IP就是nginx服务器的IP,装到那一台换即可
-
安装memcahed:这里下图的蓝色IP就是nginx服务器的IP,装到那一台换即可
- 启动memcached,如上图红色指令
-
修改RealServer集群中tomcat文件夹下的context.xml文件,让tomcat将Session写到memcached服务器中,只需要在Context字段下添加Manager字段
-
给RealServer集群添加响应的jar包,添加到tomact的lib目录下,也就是Mananger字段中的所提到的jar包
-
结果演示:
- node02
- node03
-
遗留问题:这里应该刷新过后session是不变的,但是还是发生了变化,没有导入jar包会报404错误,导入jar包后不会出现404错误但是出现了session变化问题,具体原因还有待商榷,初步判定应该是没有导入正确版本的jar包。
-
遗留问题解决:
- 1.首先考虑到的是jar包版本问题,重新翻阅博客找到了新的jar包,但是还是出现了session变化问题。
- 2.后来考虑到了RealServer的集群时间,nginx的服务器时间以及客户端时间是否是一致的问题,因为如果客户端时间或者nginx时间比RealServer的时间早,那么RealServer会判定这个session已经过期了。就会发送新Session,那么就会出现session变化,但是发现nginx服务器的时间不会影响结果。但是还是要保证当前项目下服务器的时间一定要是一致的。
- 3.之后怀疑是否是session本身存活时间过短,但是查看tomcat的server.xml发现session存活时间默认是30分钟,所以排除
-
4.最终原因:memcached的端口11211没有打开,最后发现是这个原因,也就明白了,因为session结果是从memcached中查询得到的,那么如果没有打开11211端口,RealServer就不能对memcached进行读写操作,那么一旦发生负载均衡出现Client拿着R1的Session去访问R2,RealServer不能访问memcached,只能自己生成新Session给Client。也就发生了即使配置了memcached,也会存在session不一致的情况
-
解决后结果演示:
-
node02
-
刷新后node03
-
node02
-
解决后结果演示:
-
遗留问题解决:
- 补充点:集群时间很重要,一个集群的机器的时间一定要设置成为一样的。不然session会出现过期的现象,这样服务器就会重新创建一个session,那又会出现之前的重复登陆问题了!!
- node02
-
解决步骤:
- 将R1与R2(node02和node03)装上,并进入tomcat的主页文件进行修改,将之前的主页index.jsp备份成为index.jsp.bak,对主页进行如下修改