共享 SESSION
为什么需要共享 SESSION
假设某个网站是由多台服务器提供服务,Nginx 采用轮询机制做负载均衡,那么同一个 IP 访问该网站时,请求就可能会被分配到不同的服务器上,如果 Session 没有实现共享,就会出现重复登陆授权的情况。
共享 SESSION 的几种方式
方案一:基于 NFS 的 Session 共享
NFS(Net File System),顾名思义,也就是网络文件系统,即将 Session 存储目录挂载到所有的服务器上,实现 Session 的读写。该方案实现简单、快速,无需在应用程序上做太多操作。但是缺点也很明显,一是只适合小规模的网站,二是文件读写速度严重依赖网络速度,几台服务器在同一局域网内还能接受,如果跨机房就很容易受到影响,而且安全问题也是需要考虑的,三是需要实时监控每一台服务器目录挂载情况。
方案二:基于 Cookie 的 Session 共享
简单的说就是登陆时将创建的 Session 信息经过加密处理后一并保存在客户端的 Cookie 里,其他服务器响应请求时,先判断本地服务器是否有已保存的 Session,如果没有就再将客户端的 Cookie 里保存的 Session 信息同步到本地服务器。这种方式的缺点就是受客户端的影响较大,而且安全性无法得到保障。
方案三:基于数据库的 Session 共享
该方案就是将 Session 数据直接存储在数据库中。该方案操作性较强、安全性高,缺点就是 Session 的并发读写能力取决于数据库的性能,而且需要应用程序支持或者编写一个额外的维护脚本,实现 Session 的更新和过期删除。
方案四:基于 Memcache/Redis 的 Session 共享
该方案时可以看作时方案三的升级版,该方案不仅性能好而且安全性也得到了保障,更重要的是Memcache/Redis原生支持数据的 Expire 过期淘汰。