解决方案:

1、使用客户端的cookie作为存放登录信息的媒介

cookie是将用户登录信息存储在用户终端的数据载体,与session的最大区别就是,session是存储在服务器端的;所以这就很容易解决这种session的多台服务器共享问题。当我们客户端进行登录的时候,访问的是服务器a,登录成功之后我们将session抽取出来存放在客户端的cookie里面;然后当我们客户端第二次进行访问的时候,访问的是服务器b,这次我们先在服务器b去查找是否有登录成功的session,如果为空,我们再对客户端的cookie进行查找,如果cookie里面已经存储有session,那么再将cookie里面的session同步到服务器b,那么整个流程就能走通了,用户也不用再次登录;

优点:这种方法实现起来简单,方便,很容易上手操作,不会加大数据库的负担;

缺点:如果客户端把cookie禁掉了的话,那么session就无法同步了,而且cookie的安全性不高,很容易外部被伪造使用;

2、使用mysql数据库存储session

既然每个服务器都需要使用同一个session,那么我们可以将session存放在同一个数据库里面,每次访问的时候,我们去数据库check一下是否有这个session或者这个session是否过期,然后就可以进行多台服务器的session同步了;

优点:使用这种方法简单、方便,很容易上手操作;

缺点:使用数据库来同步session,会加大数据库的IO,增加数据库的负担;同时,每次访问都需要拦截请求、查询数据库,导致多一层访问的业务层以及浪费读取数据库session时间;

3、使用memcache或者redis等缓存机制存放session

使用memcache或者redis等分布式缓存机制存放session数据,是现在很多大型项目负载均衡同步session的热门方案;它的原理是项目都使用的是同一个地方的memcache或者redis的缓存,当用户登录的时候,会把session存放在缓存里面,之后不管访问的是项目的那一台服务器,都会从同一个地方去获取session缓存,这样就很轻松实现了session同步;

优点:用缓存来同步session,不会加大数据库的负担,也不用手动去判断session是否存在或过期,省去部分业务逻辑,同时,由于redis等缓存是存放于服务器端,安全性也大大提高;

缺点:memcache或redis把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache或redis不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

把php.ini里的session save handler设置为memcache 或者 redis. 推荐使用memcache 如果用redis的话,目前没有好用的cluster解决方案,而redis还会

把数据回写到硬盘上,完全没必要。而memcache只需要很少的配置就能做cluster

4、ip_hash

nginx中的ip_hash技术能够将某个ip的请求固定到同一台后端应用服务器,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

  

upstream backend {

    server 127.0.0.1:8001;

    server 127.0.0.1:8002;

    ip_hash;

}

优点:ip_hash算法可以把一个ip映射到一台服务器上,这样可以解决session同步的问题。这样每个访客固定访问一个后端服务器,可以解决session的问题;

缺点:使用ip_hash进行session共享,它的原理是为每个访问者提供一个固定的访问ip,让用户只能在当前访问的服务器上进行操作,保持了session同步的,但是也造成了负载不均衡的问题,如果当前用户访问的服务器挂了的话,那就会出现问题了;

说明:因为这种方式只能用IP来分配后端,所以要求nginx一定要是最前端的服务器,否则nginx会取不到真实的客户端ip,那ip_hash就失效了。例如在服务器架构中使用squid做前端高速缓存,那么nginx取到的就是squid服务器的ip,用这个ip来做ip_hash肯定是不对的。再有,如果nginx的后端还有其他的负载均衡,将请求又分流了,那么对于某个客户端的请求,肯定不能定位到同一台应用服务器(例如php的fast-cgi服务器等),这样也不能做到session共享,如果在nginx后面再做负载均衡,我们可以再搭一台squid,然后再直接到应用服务器,或者用 location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端

5、upstream_hash

upstream_hash 是nginx 的一个第三方模块,支持采用nginx 内部的各种变量作hash,然后针对生成的hash 值,用求余的方式分布到后端(backend)服务器上,达到负载均衡的目的。该模块一般情况下是用做url_hash的,但是也可以做session共享。

假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:

可见这篇文档:

链接地址

在文档中是使用$request_uri做因子,稍微改一下:

hash $http_x_forwarded_for;

这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:

hash $cookie_jsessionid;

假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:

链接地址

nginx负载均衡session共享解决方案的更多相关文章

  1. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  2. 负载均衡session共享问题

    负载均衡+session共享(memcached-session-manager实现) http://www.cnblogs.com/youzhibing/p/5094460.html http:// ...

  3. nginx负载均衡 - session失效

    最近迷上了Nginx,真实麻雀虽小,五脏俱全..功能实在强大.. nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以 ...

  4. [nginx] - 使用nginx实现反向代理,动静分离,负载均衡,session共享

    反向代理概念 先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个FQ软件,通过FQ软件才能访问youtube. FQ软件就叫做正向代理.所谓的反向代理,指的是用户要访问youtube ...

  5. Nginx负载均衡session会话保持方法

    负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...

  6. 负载均衡+session共享(memcached-session-manager实现)

    前言 先给大家伙拜个年,祝大家:新的一年健健康康,平平安安! 本文的形成参考了很多人的博客,最多的应该是青葱岁月兄的这篇博客,大家可以先去看下,熟悉一些内容,因为本文是直接实践,一些理论性的知识就需要 ...

  7. nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams (一)

    该文章来源于互联网,目前找不到原作者,放在这里的目的是记录healthcheck_nginx_upstreams 的安装过程和相关配置,在起初安装成功后不能够正常运行healthcheck_nginx ...

  8. nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams模块测试 (二)

    在这里详细讲解healthcheck_nginx_upstreams模块中存在的bug,对于healthcheck_nginx_upstreams模块的安装和使用请阅读上一篇blog进行学习. 测试环 ...

  9. Nginx + Memcached 实现Session共享的负载均衡

    session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Se ...

  10. Nginx负载均衡 后端服务器怎么共享Session 问题

    Nginx负载均衡 Nginx负载均衡一些基础知识: nginx 的 upstream目前支持 4 种方式的分配 1).轮询(默认)       每个请求按时间顺序逐一分配到不同的后端服务器,如果后端 ...

随机推荐

  1. PageOffice实现文件在线安全预览——禁止编辑、下载、复制等

    实际应用中,很多时候不仅需要在线编辑文件,还需要在线安全预览文件,要求不能复制.下载.另存到本地等情况.pageoffice可以实现文件在线安全预览,禁止:编辑.复制.粘贴.右键菜单.选择.下载.另存 ...

  2. avue组件自定义按钮/标题/内容/搜索栏

    话不多说 笔记直接分享!! 一.自定义crud搜索栏组件 <template slot-scope="scope" slot="provinceCodeSearch ...

  3. vue绑定对象,绑定的值不改变的问题

    在使用vue结合elmentui的table组件,对数组绑定,需要编辑数组里一些属性的值.我的情况是,需要在打开这个表时,根据条件插入一些对象到table里,经测试,到这里是没问题的,可以显示新插入的 ...

  4. C# wpf 实现截屏框实时截屏功能

    wpf截屏系列第一章 使用GDI+实现截屏第二章 使用DockPanel制作截屏框第三章 实现截屏框实时截屏(本章)第四章 使用ffmpeg命令行实现录屏 文章目录wpf截屏系列前言一.实现步骤1.获 ...

  5. 《HelloGitHub》第 98 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  6. AI 画图真刺激,手把手教你如何用 ComfyUI 来画出刺激的图

    目前 AI 绘画领域的产品非常多,比如 Midjourney.Dalle3.Stability AI 等等,这些产品大体上可以分为两类: 模型与产品深度融合:比如 Midjourney.Dalle3 ...

  7. 开源一站式敏捷测试管理平台 itest(爱测试) 6.6.1 发布,安全升级及新增强

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行 ...

  8. uniapp 拨打电话功能

    phoneNumber进行动态调用时候一定要添加引号,否则会报错 1 call() { 2 uni.makePhoneCall({ 3 phoneNumber: 'this.leads.tel' // ...

  9. 一文教你在MindSpore中实现A2C算法训练

    本文分享自华为云社区<MindSpore A2C 强化学习>,作者:irrational. Advantage Actor-Critic (A2C)算法是一个强化学习算法,它结合了策略梯度 ...

  10. xv6 文件系统

    文件系统 公众号:Rand_cs 本文继续来看 x v 6 xv6 xv6 的文件系统部分, x v 6 xv6 xv6 将文件系统的设计分为 7 层: 磁 盘 → 缓 存 区 → 日 志 → i n ...