tomcat+memcached在阿里云ECS上实现session共享不成功 10C

首先,配置是在本地经过验证的,可以实现共享。
1、两个tomcat配置都检查了两遍是OK的,启动之后访问页面登录之后也能有session进入到memcached中,说明tomcat和memcached服务器的连接是OK的;
2、使用MSM管理session的那段配置,确定是no-skity的,也查过资料和官网配置,本身配置其实不多,直接照搬来改的,也是OK的。
但是,其中一台tomcat登录后,另一台怎么刷新也还是在登录页,直接访问主页也会被拦截器拦截下来,说明没有session不让登入,观察memcached服务器里面,发现有第一台的session;然后第二台我直接手动登录后,发现memcached又有了第二个session。

反正就是这俩tomcat根本没有共享session,memcached也有值,不知道还有哪里有问题。
###########################################
第二次测试,我用一个小的test工程打包,里面就只有一个jsp页面来获取session,部署到服务器上去测试了一下,发现只要一刷新,memcached服务器里面就会多一个session值,而且每次刷新都是新的session装入memcached。

日了狗了啊,配置确定没问题,就是导入jar包和修改context.xml,版本也检查过了是正确的。o(╥﹏╥)o
###########################################
接下来是第三次测试,我直接把项目打包部署在本地自己电脑的两个不同端口的tomcat上,启动后访问,发现竟然可以实现session共享?!连接的memcached服务器依旧是阿里云的,观察session没问题,session共享是OK的!

但是我把项目部署到阿里云的两台机器的tomcat上之后,访问之后发现就不行了,一台登录的时候往memcached塞入了session,但是另一台刷新还是拿不到session,打印出来session值是空的!!
###########################################
崩溃了......
这到底是为什么呢?本地不同端口的两个tomcat就可以session共享,但是搬到阿里云上面就不行了,端口确定都打开了,因为不打开的话根本不能往memcached里面set进值。
那到底还有什么原因呢?难道是阿里云还有啥限制?和本地测试唯一的区别就是,本地是不同端口的两个tomcat测试的,阿里云上的两台是不同的服务器,tomcat的ip和端口都不同,可问题是他们都是互通的啊,Telnet了memcached服务器也都是通的。
郁闷死了!
求大佬给点思路啊!

4个回答

qq_40686229
qq_40686229 https://www.cnblogs.com/h--d/p/6729172.html
大约一年之前 回复
xiangyangsanren
鬼见愁 这个我看过的,配置都是这么配的,但是不成功,我觉得跟阿里云服务器有关系,但不知道哪里的问题。
大约一年之前 回复

补充:
第四次测试,我把两个tomcat全部都放到一台阿里云ECS上了,然后tomcat改成不同端口,部署项目启动,验证,发现session共享成功!

至此,我能确定一个问题了,在同一服务器上不同端口没问题,但是不同服务器就不行,我猜测的可能原因:

1、阿里云ECS还有什么额外的限制,我没有开通某个策略之类的。(目前安全组策略都开通了,服务器上的防火墙也都开了相应的端口。)

2、跨域问题,因为服务器ip不同,所以导致session无法共享,但是memcahed作为第三方缓存服务不就是解决这个问题的吗?

以上,是我这两天在阿里云ECS上部署项目测试MSM的测试过程,希望有遇到过的或者有思路的同学能给点建议,也希望老师百忙之余能帮忙一起看下这个问题。

你的memcahed装在哪台服务器上?

已解决,原因是在同一台服务器上,虽然端口不同,但是浏览器的jsessionid是相同的,所以可以实现。而在不同服务器上,ip不同,所以浏览器的jsessionid是不一样的,而memcached的MSM机制只是作为复制sessionid的作用,jsessionid不一致所以保存的就是两个jessionid,所以就无法实现session共享。
解决的方法:
1、使用nginx做代理,这样多台tomcat服务器被代理后就是nginx服务器的ip,浏览器认为ip都指向同一台,所以就分配一个jsessionid,memcached保存的也就是这个jsessionid,就可以实现多台tomcat间的session共享;
2、代码中手动编码,使用memcached或者redis的API来操作,将sessionid保存到缓存服务器中,判断的时候也从里面来取,不过这样就没必要用MSM或者RSM这种机制了,纯粹是靠编码来实现session的共享;

个人两种都试过了,第二种目前也有很多公司在用,因为编码的地方其实不多,就是操作API,优势主要体现在可控性更强。
而我推荐第一种,因为更方便,彻底不用考虑session共享的问题,仅仅配置一下tomcat就可以专注于业务开发了,优势是session共享实现极其简单,,劣势是不可控,如果这种机制自己出现问题,会比较难排查原因。

结论:如果是中小型项目,推荐使用MSM或者RSM机制,便于快速开发,集群环境实现更容易。
如果是大型项目,推荐使用操作缓存API来存放session的方式,可控性更强,后期维护更有操作性。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!