zoukankan      html  css  js  c++  java
  • nginx+tomcat集群负载均衡(实现session复制)

    Nginx+tomcat 做负载均衡

    架构描述

    前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat)

    优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去

    一,配置nginx

    1,  下载包

    Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz

    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

    2,  安装nginx包

        a.安装pcre

        tar zxvf pcre-7.2.tar.gz

        cd pcre

    ./configure  --prefix = /pcre

    Make;make install

    b,安装nginx

    tar zxvf nginx-0.6.32.tar.gz

    cd nginx-0.6.32

    ./configure  --prefix=/nginx –with-pcre=/pcre  --with-http_rewrite_module

    Make;make install

    3, 修改配置文件

    Vi /nginx/conf/nginx.conf



    #用户组

    user nobody nobody;                 

    #cpu个数,可以按照实际服务器来计算

    worker_processes  8;                

    worker_rlimit_nofile 51200;         

    events {

        use epoll;

    #连接数

        worker_connections  8192 ;      

    }

    http {

        include       mime.types;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 128;

    #    access_log  off;

    #    access_log  logs/access.log;

    #缓存的时间,(可以根据不同文件设置不同时间)

    #   expires           2h;      

        tcp_nodelay on;

        keepalive_timeout  30;      

        gzip  on;

        gzip_min_length  10;

        gzip_buffers     4 8k;

        gzip_http_version 1.1;

        gzip_types       text/plain application/x-javascript text/css text/html application/xml;

            sendfile         on;

            tcp_nopush       on;

            reset_timedout_connection  on;

         client_max_body_size 30m; 

    #设定负载均衡列表       

    upstream  backend           

    {                      

    server   172.23.254.2:8080;   

    server   172.23.254.3:8080;

    }



    #设定虚拟主机

    server {

            listen       80;

            server_name  www.abc.com;

    #对 / 所有做负载均衡 (本机nginx采用完全转发,所有请求都转发到后端的tomcat集群)

           location / {       

            root /web/www ;

           index index.jsp index.htm index.html;

                proxy_redirect         off;

    #保留用户真实信息

                proxy_set_header       Host $host;

                  proxy_set_header  X-Real-IP  $remote_addr;

            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_pass  http://backend;   

           }

    }

    }

    主要在配置proxy与upstream

    Upstream具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。





    4,启动程序

    /nginx/sbin/nginx

    5,编写启动脚本

    Vi nginx.sh

    #!/bin/sh

    CWD=`pwd`


    case $1 in
            start)
                    /nginx/sbin/nginx;
                            ;;
            stop)
                    kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print $2}' `
                            ;;
            restart)
                    cd "$CMD"
                    $0 stop
                    $0 start
            ;;
            *)
            echo $"Usage: $0 {start|stop|restart}"
            exit 1
    esac
    exit 0



        二,配置tomcat

    1,  下载tomcat5.59

    tar zxvf tomcat5.59

            2,修改配置文件

                a,配置数据源

                b,优化tomcat最大并发数

                        <Connector port="8080" maxHttpHeaderSize="8192"

                   maxThreads="2048" minSpareThreads="100" maxSpareThreads="200"

                   enableLookups="false" redirectPort="8443" acceptCount="500"

                   connectionTimeout="20000" disableUploadTimeout="true" />

                c,添加虚拟主机

    (注,主转发的虚拟主机必须用localhost,否则nginx不能通过内网ip转发,而只有通过域名转发

                d,测试

                    打开http://ip:8080

                    页面能访问则正常

    2,  其他的tomcat服务器也用同样的配置

    三,做tomcat集群

        两台机器 172.23.254.2  172.23.254.3

        做集群需要修改的文件配置有三个地方

        1,修改conf/server.xml配置文件
            a. 找到Engine标签,加入属性 jvmRoute="worker1"

    b.找到Cluster标签,去掉注释,同时修改tcpListenAddress为本机ip 172.23.254.2 (注:这一段Cluster必须放在hosts里面)

        

    2,  修改应用的web.xml

    修改web应用里面WEB-INF目录下的web.xml文件,加入标签

    <distributable/>

    直接加在</web-app>之前就可以了

    这个是加入tomcat的session复制的,做tomcat集群必须需要这一步,否则用户的session就无法正常使用。

    3,  开启防火墙

    这两个tomcat之间必须开启防火墙信任。

    分别启动两个tomcat,查看每一个tomcat是否都启动了8080端口以及4001端口

    再用netstat –an 查看链接情况

    tcp        0      0 172.23.254.2:43320      172.23.254.3:4001       ESTABLISHED

    tcp        0      0 172.23.254.2:46544      172.23.254.3:4001       TIME_WAIT  

    tcp        0      0 172.23.254.2:40118      172.23.254.3:4001       ESTABLISHED

    tcp        0      0 172.23.254.2:4001       172.23.254.3:48804      ESTABLISHED

    tcp        0      0 172.23.254.2:4001       172.23.254.3:34254      ESTABLISHED

    如果两台机器的4001端口分别建立了连接,则说明集群配置成功,可以进行session复制。





    可能存在的问题

    1,  session复制问题

    以前用apache做负载均衡的时候,是选择了用 session sticky的模式,这样的话,用户每次进来都会是同一个服务器中的session,不会被转发到其他的服务器上。在这样的情况下,tomcat即使不做session复制也不会影响用户访问。但是nginx并不支持sticky功能。所以必须要做session复制。否则很多地方就根本没法用。比如登录过程,先等到了第一个tomcat上,产生了一个session,在刷新页面,刷到另外一个tomcat的机器上,没有这个session,就会出现问题了。所以程序员在写jsp的时候也要注意这一点

      举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:
    User user = (User)request.getSession().getAttribute(“user”);
    User.setName(“my name”);
        这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证SESSION的同步:
    Request.getSession().setAttribute(“user”, user);
        所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。



      可能经常会遇到session复制不正常的情况。除了在服务端找原因再也程序上找下原因。都是有可能导致session复制不正常的



    2.页面同步

         为确保后面tomcat的服务器上的页面程序是一致的,可以采用如下方式

         a,rsync同步,或者做成页面按钮,提供给编辑,修改了程序即使点击同步

         b,共享区域存储,或者采取drbd网络raid模式



    3,确认nginx可以转发成功,

    在nginx上wget一下后面转发的url(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发
  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/baidu/p/1524071.html
Copyright © 2011-2022 走看看