在實際項目中,因爲用戶的訪問量很大的緣由,每每須要同時開啓多個服務器才能知足實際需求。可是同時開啓多個服務又該怎麼管理他們呢?怎樣實現session共享呢?下面就來說一講如何使用tomcat+nginx搭建服務器集羣以及如何實現session共享。css
環境:html
apache-tomcat-6.0.29+apache-tomcat-6.0.29+jdk1.6+win7(因爲本身只是作了一個demo,j就沒有用到服務器系統了)java
1.首先咱們準備兩個tomcat(tomcat1,tomcat2),並將端口修改成不同。個人tomcat1是8089,tomcat2是9089。修改端口的位置在tomcat文件的conf->server.xml文件的位置:nginx
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>。web
3.接下來咱們開始準備nginx。nginx也是一個服務器,這裏咱們主要是用來作代理和負載均衡的。當咱們下載完nginx直接解壓就能夠用。要運行nginx能夠直接點擊nginx.exe,也可使用命令的模式:start nginx啓動nginx,nginx -s stop中止nginx。apache
4.啓動nginx後,咱們在瀏覽器輸入127.0.0.1,出現以下界面就表明nginx已近啓動了:瀏覽器
5.接下來咱們來配置nginx來作代理服務器和負載均衡:tomcat
打開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添加:session
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共享。
今天總結的這些只是一個簡單的應用,還有不少的細節沒有說。這些也是我才學會的。之後還有什麼好的東西會繼續和你們分享,你們共同探討!