之前有写过ubuntu环境下搭建nginx环境,今天来谈一下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、session存在memcache或者redis中

memcache可以做分布式,程序配置文件中设置存储方式为memcache,这样程序自己会建立一个session集群,将session数据存储在memcache中。

说明:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

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

upstream nginx.example.com
{server 127.0.0.1:8080;server 127.0.0.1:808;ip_hash;
}
server
{listen 80;location /{proxy_passhttp://nginx.example.com;}
}

ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:

<1>nginx不是最前端的服务器。

ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。

<2>nginx的后端还有其它方式的负载均衡。

假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用 location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。

5、upstream_hash

为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享。
<1>fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{server server1;server server2;fair;
}

<2>url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:upstream resinserver{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}

在需要使用负载均衡的server中增加
proxy_pass http://resinserver/;

解决nginx负载均衡的session共享问题相关推荐

  1. Nginx负载均衡+tomcat+session共享

    为什么80%的码农都做不了架构师?>>>    本文,是笔者工作之余写的,第一是把之前打系统框架的步骤记录下来.第二是将这个过程,谈不上经验,奉献给正在撘这种框架遇到各种bug,各种 ...

  2. nginx负载均衡的session共享问题的解决方法

    查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享 PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session ...

  3. Nginx+Tomcat+Redis负载均衡实现Session共享

    Nginx+Tomcat+Redis负载均衡实现Session共享 环境描述 tomcat1:192.168.194.100:18080 tomcat2:192.168.194.100:28080 N ...

  4. 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离

    写这篇文章花费了我近一周的时间,参考网上许多优秀的博客文章,我不敢说写的很好,至少很全很详细.本文先介绍原理部分,然后再进行实战操作,我认为这样才会有更深的理解,不过这也导致了文章篇幅很长.但是,如果 ...

  5. nginx+tomcat+redis负载均衡及session共享

    概述 本文档是用来详细描述 nginx+tomcat+redis负载均衡实现session共享 所需软件及下载地址 软件名称 下载地址 功能说明 Nginx-v1.6.0 http://nginx.o ...

  6. 解决nginx负载均衡高可用keepalived只针对物理机的问题

    在高可用keepalived软件,在默认的情况下仅仅在对方机器宕机或keepalived停掉的时候才会接管业务. 但是在实际工作过程中,例如在nginx负载均衡工作实例中,nginx服务已停止,而ke ...

  7. nginx+tomcat+memcache实现负载均衡、session共享

    实验架构图: Table of Contents 1.配置tomcat 2.安装memcache 3.查看tomcat和memcache是否配置好 4.nginx实现负载均衡: 5.客户端进行测试: ...

  8. nginx和tomcat实现反向代理、负载均衡和session共享

    这类的文章非常多,nginx和tomcat实现反向代理.负载均衡实现非常easy,能够參照http://blog.csdn.net/liuzhigang1237/article/details/888 ...

  9. 使用 Nginx+SpringBoot+Redis 实现负载均衡以及session共享

    一.所需的环境 Redis 存储Session信息 两个Spring Boot 应用,均将session信息托管到上面的Redis Nginx 配置负载均衡策略 反向代理到SpringBoot应用 二 ...

最新文章

  1. 10月21日!API 大赛决赛暨移动云开发者论坛邀您见证数字创新的力量
  2. 硬分叉升级越来越近,BCH社区都在做什么?
  3. matlab中计算不等式的解,matlab解不等式
  4. 20172324 2017-2018-2《程序设计与数据结构》实验三报告
  5. 2.6 子窗口赋值给父窗口并关闭子窗口 我的程序猿之路:第十六章
  6. 联想微型计算机功率,解锁全部潜力,联想这款笔记本可以将CPU功耗提升至24W
  7. 公私钥,数字证书,https
  8. HTTP传输二进制初探
  9. 论文笔记_S2D.13-2017-3DV-稀疏不变的卷积神经网络(Sparsity Invariant CNNs)
  10. MOSS2007匿名调查列表使用分页符导致的错误分析
  11. python 离线安装numpy_Python本地安装numpy包
  12. Python实现简单的层次聚类算法以及可视化
  13. 用Python手撕一个批量填充数据到excel表格的工具,解放双手!
  14. java.sql.SQLException: The server time zone value ' й ׼ʱ ' is unrecognized or represents more tha
  15. 2018年软件测试行业状态报告
  16. 敏捷实践 | 分不清Kanban和看板的人只剩你了
  17. 微信小程序开发踩坑经验——小蜗社群
  18. flink学习思维导图
  19. android 充电电压过压保护值修改
  20. 如何成为技术大神(文末有抽奖)

热门文章

  1. HA: SHERLOCK 靶机渗透取证
  2. 面试常碰到++p/p--问题到底结果是什么?
  3. Dissecting BERT Part 1: The Encoder 解析BERT解码器(transformer)
  4. NLP进阶之(七)膨胀卷积神经网络
  5. LeetCode简单题之最近的请求次数
  6. GStreamer 1.18.4稳定的错误修复版本
  7. 用OpenCV4实现图像的超分别率
  8. [C] [最短路] 只有5行的算法:Floyd-Warshall
  9. [C] 图的广度优先搜索——最少转机
  10. Spinner 使用的使用 报错:ArrayAdapter requires the resource ID to be a TextView