zoukankan      html  css  js  c++  java
  • 征服 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 

  • 相关阅读:
    ETL的两种架构(ETL架构和ELT架构)
    SQL 优化通用方法
    数据建模
    Python Pandas Merge, join and concatenate
    Python Pandas -- Panel
    win-msys2安装使用配置
    BeyondCompare4过期解决办法
    Git本地仓库推送到别的仓库
    IDEA调试可执行JAR包
    Oracle常见问题排查
  • 原文地址:https://www.cnblogs.com/fx2008/p/4154726.html
Copyright © 2011-2022 走看看