`

[转]多台web服务器之间共享session

阅读更多

       

      默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下:

session.save_handler = files
session.save_path = "N;/path"

      第一个配置项是指定使用files(文件形式)存储session数据。

      第二个参数指定保存的路径。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)

 

      当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似 sess_74dd7807n2mfml49a1i12hkc45的文件。

      php.ini中还有一个关键配置项,如下:

session.name = PHPSESSID

      PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。

      根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。比如值为74dd7807n2mfml49a1i12hkc45,载入的为"sess_74dd7807n2mfml49a1i12hkc45"。

      注:当你调用php的函数session_start(),才表明你需要使用session文件了。不然平白无故就去载入文件,浪费性能。

 

      根据如上原理。session的数据默认是保存在磁盘文件中。假设这种情况:多台php服务器进行负载均衡的时候,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。


       上面的图是nginx+fpm部署图。可以看到多台php服务器进行负载均衡。

 

       生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。负载均衡的目的本来就是要为了平均分配请求,所以没有固定第一次访问和第二次访问是同一台服务器,实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器。

       所以同一个登录会员,实际上就会出现:第一秒访问第一台php服务器,第二秒访问的是第二台服务器。登录的信息一般是保存在session中的。这样子登录保存的session数据就需要进行共享了。不然的话会出现,访问第一台服务器生成了一个session数据。第二秒负载请求到第三台服务器,结果获取不到刚才生成的session数据。

       我的理解是:只有涉及到多台多台后端服务器(php,java等处理服务器)的时候,才涉及到session读取不到的问题。

       在php环境中,只有多台php服务器(php服务器而非web服务器,session文件是php引擎生成的)的情况下,才会涉及到session共享的问题。单台php服务器,存储都在一台主机上, 不涉及到共享问题。因为session直接存储在这台服务器磁盘上是能够被本机读取到的。如果是:一台php服务器,多台mysql服务器。这种也是负载均衡,这种负载均衡不涉及到共享问题。因为怎么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了。目前很多门户网站采用这种方式。缺点很明显了,就是要收费了,硬件设备肯定需要购买成本的,不过对于专业或者大型应用来讲,是比较合理并且值得的。

 

参考文章:

http://www.cnblogs.com/wangtao_20/archive/2013/10/29/3395518.html

http://blog.csdn.net/lerdor/article/details/8138825

 

  • 大小: 72.5 KB
  • 大小: 85.1 KB
  • 大小: 74.6 KB
分享到:
评论

相关推荐

    web服务器集群(多台web服务器)session同步、共享的3种解决方法

    一、利用数据库同步session 在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法: 1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件...

    Tomcat 同一服务器上 不同web项目共享session的

    NULL 博文链接:https://rainbow702.iteye.com/blog/1312307

    PHP 实现多服务器session共享之memcache共享

    本文是 PHP实现多服务器session共享之NFS共享的延续,不过这次,我采用memcache来存储session了,memcache的安装请看这里: 搭建高效、可靠、稳定的WEB服务器

    PHP实现多服务器session共享之memcache共享

    本文是 PHP实现多服务器session共享之NFS共享的延续,不过这次,我采用memcache来存储session了,memcache的安装请看这里: 搭建高效、可靠、稳定的WEB服务器;

    web服务器和应用服务器.docx

    就像文件服务器为很多用户提供文件一样,使用程序服务器让多个用户可以同时使用使用程序(通常是客户创建的使用程序)" 通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而使用程序服务器提供的是客户端...

    nginx+tomcat+memcached实现session共享

    通过nginx和tomcat和memcached实现session在web服务器之间的共享

    memcached实现session远程分布式存储

    为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享

    Tomcat实现session共享(session 会话复制)

    1、请求精确定位:session sticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失,会话不复制。

    sna集中式session管理实现服务器集群及客户端程序

    sna集中式session管理实现服务器集群及客户端程序,以“单点登陆、session共享解决方案(2)”为基础建立的服务器机群应用,运行server.bat启动服务器端,将client包导入web工程,通过Client.sessionPut()等方法调用。...

    Session服务器配置指南与使用经验.doc

    所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Session共享问题.本文介绍.NET平台下建立Session服务器的几种办法, 并介绍在使用Session时的各种经验和技巧。

    PHP实现分布式memcache设置web集群session同步的方法

    主要介绍了PHP实现分布式memcache设置web集群session同步的方法,结合实例形式分析了php设置与使用memcache实现web集群session同步的相关操作技巧与注意事项,需要的朋友可以参考下

    配置tomcat-redis-session共享架包

    配置tomcat-redis-session共享架包,tomcat8,web服务器

    分布式session方案

    第一种:粘性session、第二种:服务器session复制、第三种:session共享机制、第四种......详细请参考文档

    xsession:A java web servlet filter for distributed session cached . 分布式Java Web Session缓存

    支持Tomcat,netty等Web服务器,理论上j2ee的Web服务器都支持; 支持标准的session api,可以和其它组件无缝对接; 注意事项 假定是类似下面的部署结构: nginx -> tomcat1 -> tomcat2 -> tomcat3 则nginx最好配置...

    Session服务器配置指南与使用经验的深入解析

    使用独立的Session服务器可以解决负载均衡场景中的Session共享问题.本文介绍.NET平台下建立Session服务器的几种办法, 并介绍在使用Session时的各种经验和技巧. 二.关于Session,SessionID和CookiesSession数据保存在...

    SpringSession+Redis实现集群会话共享的方法

    小型应用在一台服务器上安装Tomcat并部署WEB应用. 随着访问量增大, Tomcat的压力会越来越大, 直至崩溃. 为了保证WEB应用的承载能力, 需要对WEB应用进行集群处理. 技术发展到今天, 集群/负载均衡已经变的相对简单了....

    Nginx+Tomcat负载平衡,Redis管理session存储

    分布式web server集群部署后需要实现session共享,针对 tomcat 服务器的实现方案多种多样,比如 tomcat cluster session 广播、nginx IP hash策略、nginx sticky module等方案,本文主要介绍了使用 redis 服务器进行...

    Nginx服务器详解加配置教程

    目录 常见WEB服务器 1 1、Nginx简介 2 2、反向代理Web服务器的“经纪人” 2 2.1反向代理初印象 2 2.2反向代理的作用 3 3、安装及配置 5 3.1下载 5 ...4.1.1 配置Tomcat的session共享可以有三种解决方案: 13

    IISHostRemoting(使用IIS作为Remoting服务器的宿主)

    前一段时间思考分布式系统的缓存设计时,考虑到使用多个Web应用程序(甚至包括Console,WinForm程序)一起共享数据的实现,就想到了使用Remoting的架构。Remoting服务器可以被所有类型的前端程序访问,所以能实现...

Global site tag (gtag.js) - Google Analytics