• 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(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发

  • 相关阅读:
    html基础学习
    Git 内部原理
    SHA1
    生日攻击
    在使用bat 批处理 时将运行结果显示并保存到文件中 echo
    _vimrc
    b/s 起点
    收集几个html和element-ui的录入控件
    electron、vue.js、vuex、element-ui、sqlite3
    准备在electron上用vue,结果卡在了sqlite3
  • 原文地址:https://www.cnblogs.com/fx2008/p/4154720.html
Copyright © 2020-2023  润新知