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 也沒有丟掉。

                  

        

        


        

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