多台web服务器之间共享session

很多 开发中涉及到用户的Session验证很保留的问题,这个问题比较有意思,总结了几种方案,只供参考。


  [  问题提出 ]

  为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够继续使用客户的Session?

  (以下描述方案只是针对Linux/Unix + Apache + Mysql +PHP的开发架构,当然,也可以扩展到其他平台。)


  [  问题解决方案 ]

  既然我们的问题已经摆在面前了,那么就要从技术角度去解决问题,给我们的客户更好的体验,总结了几个方案。

  1. 写客户端Cookie的方式

  当用户登陆成功以后,把网站域名、用户名、密码、token、session有效时间全部采用cookie的形式写入到客户端的cookie里面,如果用户从一台Web服务器跨越到另一台服务器的时候,我们的程序主动去检测客户端的cookie信息,进行判断,然后提供对应的服务,当然,如果cookie过期,或者无效,自然就不让用户继续服务了。当然,这种方法的弊端就不言而喻了,比如客户端禁用了cookie或者cookie被黑客窃取了呢?

  2. 服务器之间Session数据同步的方式

  假设Web服务器A是所有用户登陆的服务器,那么当用户验证登陆一下,session数据就会写到A服务器里,那么就可以自己写脚本或者守护进程来自动把session数据同步到其他Web服务器,那么当用户跳转到其他服务器的时候,那么session数据是一致的,自然就能够直接进行服务无须再次登陆了。缺点是,可能会速度慢,不稳定,如果是单向同步的话,登陆服务器出现问题,那么其他服务器也无法服务,当然也可以考虑双向同步的问题。

  3. 利用NFS共享Session数据的方式

  其实这个方案和下面的Mysql方案类似,只是存储方式不一样。大致就是有一台公共的NFS服务器(Network File Server)做共享服务器,所有的Web服务器登陆的时候把session数据写到这台服务器上,那么所有的session数据其实都是保存在这台NFS服务器上的,不论用户访问那太Web服务器,都要来这台服务器获取session数据,那么就能够实现共享session数据了。缺点是依赖性太强,如果NFS服务器down掉了,那么大家都无法工作了,当然,可以考虑多台NFS服务器同步的形式。
(关于NFS的经典文章:http://linux.vbird.org/linux_server/0330nfs.php)


  4. 利用Mysql数据库共享Session数据的方式

  这个方式与NFS的方式类似,也是采用一台Mysql服务器做共享服务器,把所有的session的数据保存到Mysql服务器上,所有Web服务器都来这台Mysql服务器来获取Session数据。缺点也是依赖性太强,Mysql无法工作了影响所有的Web服务器,当然,可以考虑多太Mysql数据库来共享session,使用同步Mysql数据的方式。

  (Mysql同步我写过文章:http://blog.csdn.net/heiyeshuwu/archive/2005/10/31/520007.aspx)

  5. 使用硬件设备

  这个算是比较成熟的解决方案了,使用类似BIG-IP的负载设备来实现资源共享,那么就能够又稳定又合理的的共享Session了。目前很多门户网站采用这种方式。缺点很明显了,就是要收费了,硬件设备肯定需要购买成本的,不过对于专业或者大型应用来讲,是比较合理并且值得的。
(关于BIG-IP设备:http://www.f5.com.cn/channel.php?channel=product&type=BIG-IP-%D3%A6%D3%C3%C1%F7%C1%BF%B9%DC%C0%ED&id=36)
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用Redis作为JBoss的Session共享存储,需要配置以下步骤: 1. 首先,在JBoss服务器上安装Redis服务器和相关的Java Redis客户端 2. 在JBoss服务器的standalone.xml文件中添加以下配置: ``` <subsystem xmlns="urn:jboss:domain:infinispan:6.0" default-cache-container="web" jndi-name="infinispan"> <cache-container name="web" jndi-name="infinispan/web"> <transport lock-timeout="60000"/> <distributed-cache name="sessions" mode="SYNC" segmented="false"> <expiration max-idle="1800000"/> <persistence passivation="false"> <file-store path="${jboss.server.temp.dir}/infinispan/web/sessions" /> </persistence> <partition-handling when-split="MERGE" merge-policy="REMOVE_ALL" /> <file-store /> <remote-store> <property name="hotrod-client-properties" value="hotrod-client.properties"/> <property name="remote-cache-name" value="sessions"/> <property name="raw-values" value="false"/> <property name="shared" value="true"/> <property name="preload" value="true"/> </remote-store> </distributed-cache> </cache-container> </subsystem> ``` 3. 新建一个hotrod-client.properties文件,内容如下: ``` infinispan.client.hotrod.server_list=redis_host:redis_port ``` 其中,redis_host是Redis服务器的地址;redis_port是Redis服务器的端口号。 4. 将hotrod-client.properties文件放在JBoss服务器的classpath下。 5. 在Web应用程序的web.xml文件中添加以下配置: ``` <session-config> <session-store-name>infinispan</session-store-name> <cookie-config> <path>/</path> </cookie-config> </session-config> ``` 6. 重新启动JBoss服务器,即可使用Redis作为Session共享存储。 注意: 多个JBoss服务器之间通过Redis共享Session时,需要保证Redis使用的是同一个实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值