征服 Nginx + Tomcat

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源码目录下,执行:

Shell代码  

  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当时安装时的参数:

Shell代码  

  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,编译安装。

Shell代码  

  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

Xml代码  

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

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

Xml代码  

  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命令将其打开,参考如下:

Shell代码  

  1. route add -net 224.0.0.0/8 dev eth0

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

Xml代码  

  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 

时间: 2024-12-20 12:22:12

征服 Nginx + Tomcat的相关文章

征服 Nginx + Tomcat【转】

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

nginx+tomcat 使用教程

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

Docker构建Nginx+Tomcat动静分离架构

随着主流Nginx WEB服务器的发展,现在基于Nginx的WEB服务器已广泛应用于各大互联网企业.今天我们来使用docker构建我们的Linux+Nginx+Tomcat动静分离服务器. 1)    启动docker镜像 查看当前系统存在的镜像,我这里为centos6.6,大家可以参考我第一篇文章进行下载相应的镜像文件,然后启动. 启动方式如下:   docker run -i -t  centos6.6:v2 /bin/bash 然后进入新的docker容器里,查看ip为172.17.0.6

Nginx+tomcat显示真实IP地址

对于nginx+tomcat这种架构,如果后端tomcat配置保持默认,那么tomcat的访问日志里,记录的就是前端nginx的IP地址,而不是真实的访问IP.因此,需要对nginx.tomcat做如下配置: 1)nginx配置  在nginx.conf配置中修改 server{ listen            80; server_name       www.abc.com; location / { proxy_connect_timeout       3; proxy_send_t

Nginx+Tomcat web站(Linux) &nbsp; +windows

Nginx+Tomcat web站(Linux) 1.Nginx+Tomcat  Web站 2.JDK+Apache Tomcat (jsp)服务器配置(Windows) OS IP 子网掩码 路由网关 Centos6.6 nginx Eth0:192.168.26.211 255.255.252.0 192.168.25.3 Eth1:192.168.30.3 24 Centos6.6 tomcat Eth0:192.168.30.1 24 Win7 client Eth0:192.168.2

nginx+tomcat集群+redis(memcache)session共享!

nginx+tomcat+redissession共享 常用保持session的方式: 1.一些代理(比如nginxIP_hash) 1.使用数据库来存储Session 2.使用Cookie来存储Session                       3.使用Redis来存储Sesssion(memcache也可以) --   环境: 192.168.1.220   nginx    centos6.6   端口:80 版本:1.9.2 192.168.1.224   tomcatA  ce

nginx+tomcat实现动静分离

一.构建java语言环境Jdk用于设置java程序运行环境,当需要运行java语言时,则必须先设置jdk环境.1. 获取二进制文件.# sh jdk-6u32-linux-x64.bin# mv jdk1.6.0_32/ /usr/local/jdk2.给jdk1.6.0_32/做软链接,方便jdk更新# ln -s /usr/local/jdk/ java3.设置java命令运行环境,并使其生效.# vim /etc/profileexport JAVA_HOME=/usr/local/jdk

nginx+tomcat集群配置(1)---根目录设定和多后端分发配置

前言: 对于javaer而言, nginx+tomcat集群配置, 已然成了web应用部署的主流. 大公司如此, 小公司亦然. 对于个人开发者而言, 资源有限, 往往多个web应用混部于一台服务器(云主机), 如何隔离访问这些服务资源? 彼此又不影响呢? nginx来为你排忧解难, ^_^. 本文将介绍tomcat的简单配置和部署, 以及nginx作为反向代理, 如何分流. 基础架构: 不成文的约定: 1). 一个tomcat容器部署一个webapp应用实例 2). url根目录访问webapp

Nginx+tomcat配置集群负载均衡

转自:http://blog.csdn.net/bruce_6/article/details/38228299 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那究竟它有什么作用呢?可能很多人未必了解. 说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了.摘一段百度百科上的描述: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回