专栏首页故久nginx负载均衡session共享解决方案

nginx负载均衡session共享解决方案

服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题:

1、不使用session,换用cookie

session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session然后把它放到cookie里面,当你的请求被分配到B服务器时,服务器B先判断服务器有没有这个session,如果没有,再去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到服务器B,这样就可以实现session的同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

2、session存在数据库(MySQL等)中

可以配置将session保存在数据库中,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。

3、ip_hash

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

[plain]view plaincopyprint?

upstream backend {

server 127.0.0.1:8001;

server 127.0.0.1:8002;

ip_hash;

}

upstream backend { server 127.0.0.1:8001; server 127.0.0.1:8002; ip_hash;}

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

4.upstream_hash

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于spring整合hibernate使用update无异常但没有效果(不输出sql语句)

    在没有使用spring控制事务时,使用的是sessionFactory.openSession()。这样每个方法都会新建一个session,必须在方法中控制和关...

    用户4478423
  • Springboot+redis实现session共享

    用一个容器保存 session,就能共享了。容器可以是数据库,缓存,文件等。当然这里性能最高的还是

    用户4478423
  • salesforce实现日历列表

    主要是在页面中加入日历插件Fullcalendar.js我下载是新版本fullcalendar-4.2.0

    用户4478423
  • 计算机网络基础知识总结 转

    计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不...

    wuweixiang
  • Hibernate 的延迟加载(懒加载)简介1

    qubianzhong
  • shiro中改造成restful无状态服务的DisabledSessionException问题分析与解决

    运行后,在调用 subject.login(token)方法时报错,报错信息如下:

    开发架构二三事
  • Cookie与Session的今世前缘

    之前在学习JavaWeb的时候,学习过Cookie与Session的内容,当时也进行了相关的记录,写了一篇学习笔记,具体的学习笔记小伙伴儿们可以自行点击查看(第...

    鹏-程-万-里
  • 计算机网络基础回顾

    对于程序员来说,计算机网络的知识是很重要也很基础的。尤其是做web开发就要对http或者https很熟。有的时候涉及到域名,还会碰到跨域问题。这些其实都是计算...

    用户1154259
  • Hibernate api 之常见的类(配置类,会话工厂类,会话类)

    1:Configuration :配置管理类对象   1.1:config.configure():      加载主配置文件的方法(hibernate.cfg...

    别先生
  • Web应用系统介绍-TCP/IP协议

    大家先冷静一下上了一天班的大脑先~~~ 然后我们再讲理论~ 以下内容非常枯燥,但是也是非常有用~ 在我们开始CTF的道路之前,希望你们能知道并理解下面基本概念...

    用户1631416

扫码关注云+社区

领取腾讯云代金券