在部署一个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分流,剩下的走其它后端去。

Tomcat负载均衡图片显示不正常解决方法的更多相关文章

  1. asp.net 负载均衡下session存储的解决方法

    转自:http://www.cnblogs.com/david100zhang/archive/2011/12/28/2304917.html 在WEB场中,动态网页往往会因为几台主机做了负载而产生S ...

  2. 基于apache的tomcat负载均衡和集群配置

    最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群. ...

  3. Nginx+tomcat负载均衡时静态页面报404

    百度到的问题解决BLOG http://os.51cto.com/art/201204/326843.htm nginx+2台tomcat负载均衡,应用程序已部署,单独访问tomcat时,可以访问到所 ...

  4. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  5. Nginx+keepalived做双机热备加tomcat负载均衡

    Nginx+keepalived做双机热备加tomcat负载均衡 环境说明: nginx1:192.168.2.47 nginx2:192.168.2.48 tomcat1:192.168.2.49 ...

  6. nginx多tomcat负载均衡

    目的 先说说我要干什么,如题:使用nginx实现多个tomcat服务器的负载均衡. nginx 大名鼎鼎,相信很多人都听过,以前感觉很厉害,用了之后发现真的很厉害.nginx可以做以下几件事: 反向代 ...

  7. Ngnix + Tomcat负载均衡架构

    一.nginx Nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.  其特点是占有内 ...

  8. Nginx+Tomcat负载均衡、动静分离群集

    Nginx+Tomcat负载均衡.动静分离群集 目录 Nginx+Tomcat负载均衡.动静分离群集 一.Tomcat 1. Tomcat简介 2. Tomcat重要目录 二.Nginx负载均衡原理 ...

  9. nginx+tomcat负载均衡

    最近练习nginx+tomcat负载均衡.根据一些资料整理了大体思路,最终实现了1个nginx+2个tomcat负载均衡. 安装JDK 1>进入安装目录,给所有用户添加可执行的权限 #chmod ...

随机推荐

  1. HDU - 6621 K-th Closest Distance 主席树+二分答案

    K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...

  2. paper 160:python 知识点概要 更新ing

    1.python json  http://www.runoob.com/python/python-json.html Python的json模块提供了一种很简单的方式来编码和解码JSON数据. 其 ...

  3. 51nod 1486 大大走格子(容斥+dp+组合数)

    传送门 解题思路 暴力容斥复杂度太高,无法接受,考虑用\(dp\).设\(f(i)\)表示从左上角开始不经过前面的阻断点,只经过\(i\)的阻断点.那么可以考虑容斥,用经过\(i\)的总方案数减去前面 ...

  4. 【前端技术】一篇文章搞掂:WeX5

    一.组件 Data组件 http://docs.wex5.com/data/ 遍历输出

  5. Ubuntu配置jdk环境变量

    下载jdk,解压到你想要的目录 在/etc/profile里最后添加 export JAVA_HOME=/home/zzs0/Programs/jdk1.8.0_102export JRE_HOME= ...

  6. Modular arithmetic and Montgomery form 实现快速模乘

    题目: 电音之王 题解: 求数列前n项相乘并取模 思路: ①.这题的乘法是爆long long的,可以通过快速幂的思想去解决(按数位对其中的一个数进行剖分).当然你的乘法会多出一个log的复杂度... ...

  7. Python 进阶_OOP 面向对象编程_类和继承

    目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...

  8. day 97 VUE第一天

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 报警插件Alertmanager 安装与使用

    Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组.删除重复等处理,并将它们通过路由发送给正确的接收器:告警方式可以按照不同的规则发送给不同的模块负 ...

  10. Java并发Lock接口

    java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块.新的锁定机制更灵活,提供比同步块更多的选项. 锁和同步块之间的主要区别如下: 序列的保证 - 同步块不 ...