问题:刚搭建好nginx,用ip_hash来保证用户每次登陆去同一服务器,但是会出现一些问题
1.当这台服务器挂了,用户去其他服务器需要重新登录
2.因为是根据ip的hash值来前往固定的服务器,同一局域网下太多用户会导致负载均衡失败
3.每台服务器上有一部分功能,用户需要跳转服务器来实现所有功能(我遇到的就是这个问题,有点像单点登录)
解决方案:使用缓存服务器来处理session,在搭建nginx前看过session共享的博客,点这儿。里面提供了4种方法思路,但是感觉实用的也就ip_hash和缓存。我先试用了Redis,因为我们项目上已经配置好了Redis,Linux上也配置好了,我自己之前也听过一节的Redis培训(公司老大讲的)电脑上面也安装了Redis感觉很轻松,就去看Redis了动手的时候,老大说不要用Redis(PS:项目中的Redis是未启用的),用了就不能实时更新了,让我去使用memcached
解决步骤:
1.安装memcached
先下载安装包,具体命令点这儿,感觉我就是一个搬运工啊。干了几天,Linux操作命令倒是熟悉了不少
2.具体介绍
我这边是1个nginx+2个Tomcat+1个memcached
nginx端口号是80,两个Tomcat端口号分别是18081和18082,memcached为11211
nginx+Tomcat配置之前已经做好了,我现在只需要下载好memcached 然后使用memcached_session_manager就可以了
3.配置介绍
修改每一个Tomcat的context.xml 如下图
<!-- 在此复制 -->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.3.32:11211"
sticky="false"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"/>
同时每一个Tomcat的lib包下上传jar包
具体参考这儿这个很不错,刚开始看的其他人博客,基本每个人jar包都只是给了个名字,他这儿还提供了下载地址,只要是序列化方法提供了很多种,我之前试了javolution序列化,和kryo序列化都不行,最后用了内置的JAVA序列化才行了,
4.测试因为添加项目麻烦,我直接修改了Tomcat的webapps/ROOT/index.jsp页面(这就是小猫的页面),我加了一句<%=request.getSession().getId() %>
可以看出,不论是哪一个Tomcat他们的session用的是同一个
PS:后续又有一个问题,我这边的项目上传后还是不能实现想要的功能,老大说可能是项目登陆模块的问题,我这边继续看看,不知道最后可不可以实现(以前以为登陆模块很简单,账号密码验证一下就可以了,现在才发现很难,我到现在连登陆在哪儿验证的都没找到,反射这玩意用多了,代码位置不好找啊)