1. 程式人生 > >nginx+tomcat+memcached搭建伺服器叢集及負載均衡

nginx+tomcat+memcached搭建伺服器叢集及負載均衡

 在實際專案中,由於使用者的訪問量很大的原因,往往需要同時開啟多個伺服器才能滿足實際需求。但是同時開啟多個服務又該怎麼管理他們呢?怎樣實現session共享呢?下面就來講一講如何使用tomcat+nginx搭建伺服器叢集以及如何實現session共享。

    環境:

     apache-tomcat-6.0.29+apache-tomcat-6.0.29+jdk1.6+win7(由於自己只是做了一個demo,j就沒有用到伺服器系統了)

  1.首先我們準備兩個tomcat(tomcat1,tomcat2),並將埠修改為不一樣。我的tomcat1是8089,tomcat2是9089。修改埠的位置在tomcat檔案的conf->server.xml檔案的位置:

   

2.為了後面區分我們到底訪問的是哪個tomcat,所以這裡我們修改一下tomcat首頁的資訊,在tomcat1資料夾下webapps->ROOT->index.html,在最前面我加上了<span style="color:red">this is tomcat          one</span>,同樣在tomcat2下新增<span style="color:red">this is tomcat two</span>。

3.接下來我們開始準備nginx。nginx也是一個伺服器,這裡我們主要是用來做代理和負載均衡的。當我們下載完nginx直接解壓就可以用。要執行nginx可以直接點選nginx.exe,也可以使用命令的模式:start nginx啟動nginx,nginx -s stop停止nginx。

  

4.啟動nginx後,我們在瀏覽器輸入127.0.0.1,出現如下介面就代表nginx已近啟動了:

   

5.接下來我們來配置nginx來做代理伺服器和負載均衡:

開啟nginx檔案下的conf->nginx.conf檔案,在hettp中新增

upstream 127.0.0.1{//這個127.0.0.1可以隨便取個名字
    server 127.0.0.1:8088 weight=1; #伺服器A
    server 127.0.0.1:9088 weight=1; #伺服器B
}

在server中的location新增:

 proxy_pass  http://127.0.0.1;  #訪問js,圖片等需要做代理

其他的現在不用配置,配置完了如下:

  說明:

  1)server後的ip即使tomcat的ip,weight表示權重,weight越大,對應伺服器被訪問的概率越大,若是相等,幾個伺服器輪流被訪問;

     2)proxy_pass  後的http必須加上;

 這是我們啟動tomcat1,tomcat2,nginx,在瀏覽器中輸入127.0.0.1,然後重新整理,這時我們會看到tomcat1和tomcat2的頁面交替顯示,這就表示nginx已經負載了兩個tomcat,可以將請求轉發到不同的tomcat。

6.下面我們就來解決session的問題了

  這裡需要將以下jar包放到tomcat的lib檔案裡面

這些jar包我已上傳,下載地址:http://files.cnblogs.com/mouseIT/nginx%2Cmemcached%EF%BC%8Ctomcat%E9%9B%86%E7%BE%A4%E7%9A%84jar%E5%8C%85.rar

 然後在tomcat的context.xml中新增以下資料:

複製程式碼

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
                    memcachedNodes="n1:127.0.0.1:11211"  
                    sticky="false"  
                    sessionBackupAsync="false"  
                    lockingMode="auto"  
                    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
                    transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"  
                    />

複製程式碼

如下:

為了實現session共享,這裡我們還需要使用的memcached。

將下下來的memcached直接解壓,點選memcached.exe。這是隻有一個視窗,什麼都看不見,回車後輸入命令stats,看見如下表示正常:

為了測試,我們建一個web專案,記得要在web.xml的web-app中新增<distributable/> 這樣伺服器才知道這是分散式的。

同時我們建立預設的登陸頁面,內容如下:

複製程式碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
this is tomcat one
Server Info:
<%
String path = request.getContextPath();
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
  out.println("<br> ID " + session.getId()+"<br>");
  // 如果有新的 Session 屬性設定
  String dataName = request.getParameter("dataName");
  if (dataName != null && dataName.length() > 0) {
     String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
  }
  out.println("<b>Session 列表</b><br>");
  System.out.println("============================");
  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="<%=path%>/login.jsp" method="POST">
    名稱:<input type="text" size=20 name="dataName">
     <br>
    值:<input type="text" size=20 name="dataValue">
     <br>
    <input type="submit">
   </form>
</body>
</html>

複製程式碼

這個是在網上收的,具體的原理我就不再闡述了。

然後我們依次啟動memcached->tomcat->nginx。注意一定要最先啟動memcached,不然啟動tomcat時會出錯。

然後我們訪問127.0.0.1/tomcat下的web專案名

進入主頁面後,我們輸入名稱和值,然後點選提交(這時注意tomcat的視窗),我輸入的是abc,123,點選提交後,tomcat1出現如下:

然後我們重新整理瀏覽器,觀察tomcat2的視窗,也會出現上面的資料:

這就表示tomcat2獲得了session的資料,tomcat1,tomcat2實現了session共享。

今天總結的這些只是一個簡單的應用,還有很多的細節沒有說。這些也是我才學會的。以後還有什麼好的東西會繼續和大家分享,大家共同探討!