2年前一直折腾Apache,现如今更习惯Nginx。 搭建网站又遇到2年前遇到的问题——Session同步。 (参考我以前的帖子——征服 Apache + Tomcat)只不过现今担当负载均衡的Apache换成了Nginx! 
今天简要说明一下Nginx+Tomcat负载均衡实现,重点介绍Nginx+Tomcat+Session共享实现


相关内容: 
征服 Apache + SSL 
征服 Apache + SVN 
征服 Apache + SVN +  LDAP 
征服 Apache + Tomcat 
征服 Nginx 
征服 Nginx + Tomcat 

Nginx负载均衡,其实主要就是用upstream、server指令,再配以权重等等参数。如果为了让nginx支持session共享,还需要额外增加一个模块。

一、Nginx负载均衡 
在http{...}中配置一个upstream{...},参考如下:

引用
    upstream tomcat { 
        server 10.11.155.26:8080; 
        server 10.11.155.41:8080; 
    } 

接着修改location节点,配置代理:

引用
location / { 
      ... 
            proxy_pass http://tomcat;

... 
}

当访问根路径时,会轮播路由到两台服务器上,至于后端服务器是tomcat还是jetty之类的,都无所谓,照葫芦画瓢就是了。 
当然,有的机器性能好,或者负载低,可以承担高负荷访问量,可以通过权重(weight),提升访问频率。数值越高,被分配到的请求数越多。 
server指令参数如下:

  • weight——权重,数值越大,分得的请求数就越多,默认值为1。
  • max_fails——对访问失败的后端服务器尝试访问的次数。默认值为1,当设置为0时将关闭检查。
  • fail_timeout——失效超时时间,当多次访问失败后,对该节点暂停访问。
  • down——标记服务器为永久离线状态,用于ip_hash指令。
  • backup——仅当非backup服务器全部宕机或繁忙时启用。

例如,可以这样配置:

引用
    upstream tomcat { 
        server 10.11.155.26:8080 weight=5; 
        server 10.11.155.41:8080 weight=10; 
    } 

后者分得的请求数就会较高。

二、Nginx+Tomcat+Session共享 
为了让Nginx支持Tomcat的Session共享,需要对其升级,增加jvmroute模块。

1.下载nginx-upstream-jvm-route组件、对nginx源码做补丁。 
我把nginx-upstream-jvm-route下载到了/opt/software路径下。 
先切换到nginx源码目录下,执行:

  1. patch -p0 < /opt/software/nginx_upstream_jvm_route/jvm_route.patch
引用
patching file src/http/ngx_http_upstream.c 
Hunk #1 succeeded at 4095 (offset 358 lines). 
Hunk #3 succeeded at 4227 (offset 358 lines). 
Hunk #5 succeeded at 4326 (offset 358 lines). 
patching file src/http/ngx_http_upstream.h 
Hunk #1 succeeded at 90 (offset 5 lines). 
Hunk #3 succeeded at 118 (offset 5 lines).

说明补丁做好了!

2.升级nginx 
先别急着折腾nginx-upstream-jvm-route,先看看nginx当时安装时的参数:

  1. nginx -V
引用
nginx version: nginx/1.2.0 
configure arguments: --prefix=/opt/servers/nginx --user=nginx --group=www --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre=/opt/software/pcre-8.10 --with-zlib=/opt/software/zlib-1.2.5 --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module

记得先备份nginx.conf! 
使用追加参数(--add-module),增设nginx-upstream-jvm-route模块,--add-module=/opt/software/nginx_upstream_jvm_route,编译安装。

  1. ./configure --prefix=/opt/servers/nginx --user=nginx --group=www --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre=/opt/software/pcre-8.10 --with-zlib=/opt/software/zlib-1.2.5 --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module --add-module=/opt/software/nginx_upstream_jvm_route && make && make insatll

如果没有错误提示,nginx就成功升级了!

3.修改upstream配置 
要让Nginx支持Tomcat的jvmRoute,并共享session,在upstream下作如下修改:

引用
    upstream tomcat { 
        server 10.11.155.26:8080 srun_id=tomcat1; 
        server 10.11.155.41:8080 srun_id=tomcat2;

jvm_route $cookie_JSESSIONID|sessionid reverse; 
    } 

srun_id跟tomcat配置有关。

4.Tomcat集群配置(Tomcat6、7通用) 
该配置参考征服 Apache + Tomcat,以下仅作简要说明。 
a.修改server.xml 
找到Engine节点,并设置jvmRoute,这里指定tomcat1

  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

可以直接粘贴以下代码,并对应修改Receiver节点中的address属性,指向本机:

  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
  2. channelSendOptions="8">
  3. <Manager className="org.apache.catalina.ha.session.DeltaManager"
  4. expireSessionsOnShutdown="false"
  5. notifyListenersOnReplication="true"/>
  6. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  7. <Membership className="org.apache.catalina.tribes.membership.McastService"
  8. address="224.0.0.0"
  9. port="45564"
  10. frequency="500"
  11. dropTime="3000"/>
  12. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  13. address="10.11.155.26"
  14. port="4000"
  15. autoBind="100"
  16. selectorTimeout="5000"
  17. maxThreads="6"/>
  18. <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  19. <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
  20. </Sender>
  21. <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
  22. <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  23. </Channel>
  24. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
  25. filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
  26. <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
  27. <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  28. <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  29. </Cluster>

注:如果本机上有多个tomcat并存,Receiver节点中的port属性,使其绑定在不同的端口上。 
Membership节点address属性配置多播地址,可使用route命令将其打开,参考如下:

  1. route add -net 224.0.0.0/8 dev eth0

b.修改应用的web.xml 
在web.xml末尾增加<distributable />

  1. <web-app>
  2. ...
  3. <distributable />
  4. </web-app>

至此,已完成所有配置,重启tomcat、nginx,访问服务测试页面(见附件),强行关闭其中一台tomcat,令请求转向另一个台tomcat,测试session是否同步: 
 
session共享成功,非粘性实现。


相关内容: 
征服 Apache + SSL 
征服 Apache + SVN 
征服 Apache + SVN +  LDAP 
征服 Apache + Tomcat 
征服 Nginx 
征服 Nginx + Tomcat 

征服 Nginx + Tomcat的更多相关文章

  1. 征服 Nginx + Tomcat【转】

    征服 Nginx + Tomcat Server Architecture/Distributed nginxtomcatsessioncluster  2年前一直折腾Apache,现如今更习惯Ngi ...

  2. Nginx + Tomcat Windows下的负载均衡配置

     Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡?    Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...

  3. HappyAA服务器部署笔记1(nginx+tomcat的安装与配置)

    这是本人的服务器部署笔记.文章名称叫"部署笔记1"的原因是之后我对这个进行了改进之后,会有"部署笔记2","部署笔记3"...循序渐进,估计 ...

  4. nginx + tomcat配置负载均衡

    目标:Nginx做为HttpServer,连接多个tomcat应用实例,进行负载均衡. 注:本例程以一台机器为例子,即同一台机器上装一个nginx和2个Tomcat且安装了JDK1.7. 1.安装Ng ...

  5. Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享

    Nginx+Tomcat+Redis实现负载均衡.资源分离.session共享 CentOS安装Nginx http://centoscn.com/CentosServer/www/2013/0910 ...

  6. nginx+tomcat+二级域名静态文件分离支持mp4视频播放配置实例

    nginx+tomcat+二级域名静态文件分离支持mp4视频播放配置实例 二级域名配置 在/etc/nginx/conf.d/目录下配置二级域名同名的conf文件,路径改成对应的即可 statics. ...

  7. Nginx+Tomcat构建动、静分离WEB架构

    一.简介 二.环境介绍 三.后端服务器安装配置 四.安装论坛 五.安装配置前端Nginx服务器 六.验证服务 一.Tomcat简介 Tomcat是Apache 软件基金会(Apache Softwar ...

  8. nginx+tomcat+dubbo单机部署多台dubbo应用

    前面的博客已经介绍如何使用nginx+tomcat,今天做的是如何在单台服务器上如何部署多台dubbo 应用的集群. 由于在项目中遇到了这个问题,今天就把它记录下来. 1.

  9. 通过Nginx+tomcat+redis实现反向代理 、负载均衡及session同步

    一直对于负载均衡比较陌生,今天尝试着去了解了一下,并做了一个小的实验,对于这个概念有一些认识,在此做一个简单的总结 什么是负载均衡 负载均衡,英文 名称为Load Balance,指由多台服务器以对称 ...

随机推荐

  1. git恢复被修改的文件

    恢复到最后一次提交的改动: git checkout -- + 需要恢复的文件名 但是,需要注意的是,如果该文件已经 add 到暂存队列中,上面的命令就不灵光喽 需要先让这个文件取消暂存: git r ...

  2. C语言中的malloc和free

    最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...

  3. poj3274

    很不错的hash 优化有两个方面:1.根据题目换一个更优化的算法 2.在算法运行过程中优化 这题除了暴力好像没别的办法了吧? 但是暴力也是有策略的! 到第i只牛特征为j的总数为sum[i,j]; 找到 ...

  4. 通用权限管理系统Ver2.0

    通用权限管理系统Ver2.0平台采用kendo+mvc4+Nhibernate技术实现,底层采用自定义ORM实现数据库底层代码,支持Oracle.SqlServer.mysql等常用数据库,界面采用k ...

  5. CodeForces Round #287 Div.2

    A. Amr and Music (贪心) 水题,没能秒切,略尴尬. #include <cstdio> #include <algorithm> using namespac ...

  6. bzoj1015:1015: [JSOI2008]星球大战starwar

    应该是全部读入之后再添加边用并查集就可以了. yyl用空间换时间.u[]v[]等将边预存起来. #include<cstdio> #include<cstring> #incl ...

  7. [swustoj 1092] 二分查找的最大次数

    二分查找的最大次数(1092) 问题描述 这里是一个在排序好的数组A(从小到大)中查找整数X的函数,返回值是查找次数. int binarySearch(inta[],int n,int x)//数组 ...

  8. XUtils框架的学习(一)

    一  xutils框架引入到AndroidStudio工程,最简单的方法:① 在APP的build.gradle里面加入 compile 'org.xutils:xutils:3.3.36'.② 一定 ...

  9. LA 6540 Fibonacci Tree

    以前做过的题···重新做一遍之后怎么做怎么wa···后来GG了···第二天看不知道为啥A了···难道我失忆了? 题意:无向图,边有黑色和白色两种颜色,求是否存在一个生成树中白边的个数是斐波那契数. 解 ...

  10. HDU 3007 Buried memory & ZOJ 1450 Minimal Circle

    题意:给出n个点,求最小包围圆. 解法:这两天一直在学这个神奇的随机增量算法……看了这个http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066之后自己写了好久 ...