redhat6.5搭建nginx+tomcat负载均衡,memcached高速缓存

实验环境:

redhat6.5版本虚拟机3台:

        server1 :172.25.44.10,内存1024M,CPU双核

        server2:172.25.44.20,内存512M,CPU单核

        server3:172.25.44.30,内存512M,CPU单核

        这三台虚拟机iptables为关闭状态,selinux为disabled状态。

apache和nginx的区别

        nginx相对于apache的优点:轻量级,同样是web服务,nginx比apache占用更少的内存和资源。nginx处理请求是异步非阻塞的,而apache同步阻塞型的,nginx能保持低资源低消耗高性能,nginx的负载能力比apache高很多。

        apache相对于nginx的优点:rewrite功能比nginx的rewrite功能强大,模块多,一般来说,需要性能的web服务用nginx,如果不需要性能只求稳定,用apache。

异步非阻塞型和同步阻塞型的工作模式区别

        同步与异步的区别:同步就是发出一个指令,服务器进行处理,等待服务器将返回值传递给你才结束,就好比你打电话预约一个酒店房间,服务员给你查找房间,在这个查找过程中你需要等待,直到服务员给你答复(返回结果)。

异步就是发出一个指令,服务器进行处理,待服务器将返回值传递回来,不需要等待,就好比你打电话预约一个酒店房间,服务员直接告诉你我查一下啊,查好了告诉你,然后直接挂电话(不返回结果),等他查好了,然后主动打电话给你。

        阻塞与非阻塞的区别:就用上面的例子来说,如果是阻塞式调用,你就会一直什么都不干,一直拿着电话,直到得知有没有房间。如果是非阻塞式调用,你不管服务员有没有告诉你,自己一边玩去,不过你也要过几分钟检查以下服务员有没有给你返回结果。

实验过程:

在 server1 虚拟机上执行以下操作:

        从网站下载nginx1.8.1版本的tar包

        tar zxf nginx-1.8.1.tar.gz    #解压安装包

        cd nginx-1.8.1

        useradd -u 800 -M -d /usr/local/nginx -s /sbin/nologin nginx    #新建nginx用户,指定其uid800

        编译nginx需要关闭debug模式,配置文件为该目录的auto/cc的gcc文件,还需要改变nginx的版本信息,配置文件为该目录的src/core的nginx.h文件。

        wKiom1eBBzKgxZ85AACTxMXlfBc460.png-wh_50

        编译nginx,需要C编译

        yum install gcc -y

        在编译的过程中缺啥装啥

        yum install pcre-devel.x86_64 -y

        yum install openssl-devel.x86_64 -y

        make && make install

        编辑vim .bash_profile 将/usr/local/nginx/sbin加入变量

        vim /usr/local/nginx/conf/nginx.conf

        wKiom1eBC8KhnuJZAABeQGznCPE932.png-wh_50

        server1这台虚拟的的cpu为双核,所以 worker_processes 2;

        cpu捆绑,worker_cpu_affinity 01 10;            ##01为第一个CPU,10为第二个CPU。

        event工作模式选择epoll(异步非阻塞)模式。

在server2和server3虚拟机上都执行以下操作:19

        yum install httpd -y

        /etc/init.d/httpd start

        server2上创建测试网页文件 echo server2 > /var/www/html/index.html

        server3上创建测试网页文件 echo server3 > /var/www/html/iindex.html

在server1虚拟机上:

        vim /usr/local/nginx/conf/nginx.conf

        第19行     upstream westos {

        第20行     server 172.25.44.20:80;

        第21行     server 172.25.44.30:80;

        第22行     }

        第49,50行注释

        第51行     proxy_pass http://westos;

        nginx -t        #检查有没有错误

        nginx -s reload    #刷新nginx

        浏览器访问 172.25.44.10  ,刷新网页,server2和server3轮询显示

          vim /usr/local/nginx/conf/nginx.conf

         第19行     upstream westos {

         第20行     ip_hash;        #捆绑IP, 使得刷新网页时不轮询。

         第21行     server 172.25.44.20:80;

         第22行     server 172.25.44.30:80;

         第23行     }

         nginx -t

         nginx -s reload

         打开浏览器进行测试,如果一台客户端挂掉,会显示另一台客户端的内容,挂掉的客户端重新好了,不会自动调转显示刚坏的客户端的信息。

sticky:使用nginx  sticky实现基于cookie的负载均衡

        重新编译nginx,加入sticky模块。

        nginx -s stop     #先将nginx停掉

        将nginx-sticky-module-1.0.tar.gz压缩包下载到/mnt目录下

        tar zxf nginx-sticky-module-1.0.tar.gz -C nginx-1.8.1

        cd /mnt/nginx-1.8.1

        make clean    

        ./configure --prefix=/usr/local/nginx --with-http_ssl_module --user=nginx --group=nginx --add-module=nginx-sticky-module-1.0/

        make && make install

        vim /usr/local/nginx/conf/nginx.conf

        第20行    sticky;

        nginx -t

        nginx

        注:sticky no_fallback; 当一台客户端挂掉时,刷新网页不会显示另一台客户端的信息,而直接显示网页报错信息。

        server 172.25.44.20:80 weight=3;

        server 172.25.44.30:80;        ##weight的作用是一种权重关系,刷新网页显示server2三次才显示server3一次。backup为主备关系,如果一台客户机挂了,另一台客户机顶上工作,down为客户端服务是好的,但服务端down,使得无法轮询。

tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,是开发和调试JSP 程序的服务器。

在server2和server3虚拟机上执行:

tomcat安装

        sh jdk-6u26-linux-x64.bin

        mv jdk1.6.0_26/  /usr/local

        vim /etc/profile
        export JAVA_HOME=/usr/local/jdk
        export CLASSPATH=:$JAVA_HOME/lib
        export PATH=$PATH:$JAVA_HOME/bin

        source /etc/profile
         ln -s /usr/local/jdk1.6.0_26/    java

         tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local

         ln -s /usr/local/apache-tomcat-7.0.37 tomcat

         vim /usr/local/tomcat/webapps/ROOT/test.jsp

         server2 The time is: <%=new java.util.Date() %>    #在server3上写server3,方便我们实验测试

         cd /usr/local/tomcat

         bin/start.sh

在server1虚拟机上执行以下操作:

        vim /usr/local/nginx/conf/nginx.conf

        第19行        upstream westos {

        第20行        sticky;

        第21行        server 172.25.44.20:8080;

        第22行        server 172.25.44.20:8080;

        第23行        }

        第50行        root html;

        第51行        index index.html index.htm;

        第65行        location ~ \.jsp {                ##将jcp页面交给tomcat处理,动静分离

        第66行            proxy_pass http://westos;

        第67行        }

        nginx -t

        nginx -s reload

        浏览器检测

memcache: memcache是一个高性能的分布式缓存系统。它可以用来保存一些经常存取的数据。直接通过telnet在memcached服务器上可进行存取数据操作。

tomcat采用交叉存储的方式将数据存储在memcached上,这种交叉存储的优点是当T1和M1同时崩掉时,也不会丢失session会话,避免单点故障。

在server2和server3虚拟机上执行:

        yum install memcached -y

        /etc/init.d/memcached start

        /usr/local/tomcat/bin/shutdown.sh

        把以下这些软件放在/usr/local/tomcat/lib目录下

        kryo-1.03.jar
        kryo-serializers-0.8.jar
        memcached-2.5.jar
        memcached-session-manager-1.5.1.jar

        memcached-session-manager-tc7-1.5.1.jar
        minlog-1.2.jar
        msm-kryo-serializer-1.5.1.jar
        reflectasm-0.9.jar

        vim /usr/local/tomcat/conf/context.xml

        <Context>
            ......
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.44.20:11211,n2:172.25.44.30:11211"
        failoverNodes="n1"
        #在 node2 上此项设置为“n2”
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
        />
        </Context>

        以下为测试页面,保存到/usr/local/tomcat/webapps/ROOT/test.jsp

        <%@ page contentType="text/html; charset=GBK" %>
        <%@ page import="java.util.*" %>
        <html><head><title>Cluster App Test</title></head>
        <body>
        Server Info:
        <%
        out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
        <%
        out.println("<br> ID " + session.getId()+"<br>");
        String dataName = request.getParameter("dataName");
        if (dataName != null && dataName.length() > 0) {
        String dataValue = request.getParameter("dataValue");
        session.setAttribute(dataName, dataValue);
        }
        out.print("<b>Session list</b>");
        Enumeration e = session.getAttributeNames();
        while (e.hasMoreElements()) {
        String name = (String)e.nextElement();
        String value = session.getAttribute(name).toString();
        out.println( name + " = " + value+"<br>");
        System.out.println( name + " = " + value);
        }
        %>
        <form action="test.jsp" method="POST">
        name:<input type=text size=20 name="dataName">
        <br>
        key:<input type=text size=20 name="dataValue">
        <br>
        <input type=submit>
        </form>
        </body>
        </html>

   /usr/local/tomcat/bin/start.sh            #开启服务

     访问http://172.25.44.10/test.jsp   ,不同的主机访问时会调度到不同的 tomcat 实例上处理
来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实
例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。

                  

        

        


        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章