在部署一个Tomcat玩玩的时候,发现在做nginx负载均衡时,网站显示不正常,图片会变得很大。测试了半天都没成功,最后查找资料,才发现Tomcat负载均衡时Session处理有问题,Session是Tomcat服务器上的内存空间,如果一个用户发出多个请求,却发到了多个tomcat服务器中,那么就会出现Session不同步的问题:

       解决方案1:将一个用户的请求锁定到某一台服务器上,简单,但是缺乏容错性,一旦某个服务器发生故障,Session可能丢失,(但是服务器发生故障是一个低概率事件,如果一个服务器经常挂掉,要么是硬件有问题,要么是应用有问题);可以使用用户IP哈希实现。
       解决方案2:Session复制策略,基于网络的广播策略,一个节点Session变化,其他节点同步复制,具有容错性,但节点多或复制量大时对网络负荷大,使网络效率低下,甚至阻塞。
       ① 在/conf/server.xml文件中开启Session复制的选项,将<Cluster>注释去掉,7.0默认值以配置好,需要接收器<Receiver>绑定内网(一般服务器都有两块网卡)网卡地址,修改端口>。
       ② 在应用中指定应用是在分布式部署之下,在web.xml中添加<distributable/>选项。
        解决方案3:额外创建一个共享的空间用来存放Session,所有服务器共享一个Session。
        最后在upstream模块下面添加ip_hash,完美解决。
worker_processes  ;
events {
worker_connections ;
}
http {
upstream oldboy {
server 10.0.0.17:;
server 10.0.0.17:;
ip_hash;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ;
server {
listen ;
server_name www.oldboy.com;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}

1.nginx中的的ip_hash机制

Nginx中的ip_hash技术能够将某个ip 的请求定向到同一台后端web机器中,这样一来这个ip 下的客户端和某个后端 web机器就能建立起稳固的session.

ip_hash机制能够让某一客户机在相当长的一段时间内只访问固定的后端的某台真实的web服务器,这样会话就会得以保持,在网站页面进行login的时候就不会在后面的web服务器之间跳来跳去了,也不会出现登录一次的网站又提醒重新登录的情况.

2.Ip_hash机制缺陷:

(1).nginx不是最前端的服务器

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

(2).nginx的后端还有其它负载均衡

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

最新文章

  1. python文件读取
  2. 应用Druid监控SQL语句的执行情况
  3. CentOS常用指令
  4. 全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程
  5. AngularJS小试牛刀
  6. LeetCode33 Search in Rotated Sorted Array
  7. Unity3D脚本中文系列教程(十六)
  8. 万台规模下的SDN控制器集群部署实践
  9. 【 NOIP2015 DAY1 T2 信息传递】带权并查集
  10. lsmod
  11. 用core dump来调试程序段错误
  12. 阐述linux IPC(两):基于socket进程间通信(下一个)
  13. [转载] 快速理解Kafka分布式消息队列框架
  14. poj2100(尺取法)
  15. 【原创】Java基础之简单修改jar包中的class
  16. 定时任务BlockingScheduler
  17. Mysql8 连接提示 Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法
  18. C/C++ ASCII码表
  19. vue input 赋值无效
  20. Cenots7对lvm逻辑卷分区大小的调整

热门文章

  1. bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】
  2. 在RedHat中安装新字体
  3. Python中的浮点数原理与运算分析
  4. docker使用记录二:mysql安装与配置
  5. RSA加密、解密实现原理
  6. C++标准库的初探
  7. v8引擎的优化
  8. 【BZOJ2138】stone
  9. sciencedirect 网站抓取过程
  10. 中文字符集编码unicode,gb2312,cp936,GBK,GB18030介绍