memcache在tomcat中實現session交叉存放
###jdk 首先從官網下載jdk包 tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/loacl ##-C 指定路徑 cd /usr/local/ ls ln -s jdk1.7.0_79 java ##做軟連結 ll -d /usr/local/java
##加永久的環境變數 vim /etc/profile ##在最後面加 export JAVA_HOME=/usr/local/java export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin source /etc/profile
##檢視環境變數時候載入成功 echo $PATH ##輸出環境變數 echo $JAVA_HOME ##/usr/local/java
java javac cd
###編譯測試 vim test.java public class test { public static void main(String[] args) { System.out.println("hello world!"); } }
javac test.java ##編譯 ll test.class java test ##顯示hello world
##做apache-tomcat加速 去官網下載 apache-tomcat包 tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local cd /usr/local ls ln -s apache-tomcat-7.0.37 tomcat
cd tomcat bin/startup.sh #開啟tomcat netstat -antlp | grep :8080
在瀏覽器訪問 tomcat.apache.org http://172.25.254.1:8080 #也能看見tomcat
/opt/nginx/nginx/sbin/nginx -s stop ##關閉不含有openstrey的nginx nginx cd /usr/local/lnmp/nginx/conf vim nginx.conf ##修改配置檔案 加入 location ~ \.jsp$ { proxy_pass http://172.25.254.1:8080; }
nginx -t nginx -s reload cd /usr/local/tomcat/webapps/ROOT vim test.jsp the time is: <%=new java.util.Date() %>
在瀏覽器訪問 172.25.17.11/test.jsp
##這時我們需要開啟另外一臺虛擬機器 ###將apacha和jdk軟體包考到server2裡面 6 cd 7 scp apache-tomcat-7.0.37.tar.gz jdk-7u79-linux-x64.tar.gz [email protected]:/root 在server2裡面解壓 117 tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local 118 tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local 119 cd /usr/local 120 ls 121 ln -s jdk1.7.0_79/ java 122 ln -s apache-tomcat-7.0.37/ tomcat
在server1裡面改環境變數 8 vi /etc/profile 將環境變數複製到server2裡面##有關java的 124 vi /etc/profile 125 source /etc/profile
在server2裡面啟動tomcat 126 ls 127 cd tomcat/ 128 ls 129 bin/startup.sh 130 netstat -antlp #檢視埠
進去server1裡面 9 cd /usr/local/lnmp 10 cd nginx 11 ls 12 cd conf 13 ls 14 vi nginx.conf http { upstream tomcat { server 172.25.17.11:8080; server 172.25.17.12:8080; #增加後端埠 } include mime.types; default_type application/octet-stream;
location ~ \.jsp$ { proxy_pass http://tomcat; #迴圈模式改為tomcat模式 }
15 nginx -t 16 nginx -s reload cd .. cd .. 17 cd .. 18 cd tomcat/ 19 ls 20 cd webapps/ROOT/ 21 ls 22 scp test.jsp 172.25.17.12:/usr/local/tomcat/webapps/ROOT/ ##發給server2 24 vi test.jsp #為了區分,可以給裡面加入伺服器的名稱 server1 the time is: <%=new java.util.Data() %> 在server2裡面也改 可以給裡面加入伺服器的名稱 server2 the time is: <%=new java.util.Data() %> 132 cd webapps/ROOT/ 133 ls 134 vi test.jsp 測試:在真機測試,可以看見迴圈 http://172.25.17.11/test.jsp
為了不要出現迴圈,加入sticky模組 26 cd /usr/local/lnmp/nginx/conf/ 27 ls 28 vi nginx.conf http { upstream tomcat { sticky; server 172.25.17.11:8080; server 172.25.17.12:8080; #增加後端埠 } include mime.types; default_type application/octet-stream;
29 nginx -t 30 nginx -s reload 發現此時是靜態的不輪詢
31 cd /usr/local/tomcat/webapps/ROOT/ 32 ls 34 vi 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>
35 scp test.jsp [email protected]:/usr/local/tomcat/webapps/ROOT/ #把測試頁面傳到server2裡 在真跡測試:http://172.25.17.11/test.jsp 新增使用者名稱和密碼
在server1裡面做 36 cd .. 37 ls 38 cd .. ##此時pwd為/usr/local/tomcat 39 bin/shutdown.sh ##讓tomcat掛掉,
在真跡測試:http://172.25.17.11/test.jsp 新增使用者名稱和密碼,發現以前新增的都在,雖然server2接管了
三.在tomcat中實現session共享 什麼是session:
session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶 在應用程式的 Web 頁之間跳轉時,儲存在 Session物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以 將該資訊儲存在 Session 物件中。
為了對資料的儲存更加牢靠,我們選擇交叉存放session的方法,即將訪問tomcat1上的資料存放在memcache2中,將訪問tomcat2上的資料存放在memcache1中,這樣存放,當某個tomcat服務斷了之後,訪問它的客戶session並不會消失,而是存放在了對立的memcache,如果存放session的memcache壞了,那麼它的資料會立即切換到另一個memcached中....
nginx+memcache+tomcat的實現 在server1和server2上都下在memcache yum install -y memcached /etc/init.d/memcached start cd /usr/local/tomcat/conf ls vim context.xml##在最後面加下列程式碼要在<Context>裡面加 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.25.17.11:11211,n2:172.25.17.12:11211" failoverNodes="n1" ##server2要改為n2,預設為互動式,互動式有問題了,找自己,所以設為n2 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
##在server2裡面也要做 cd /usr/local/tomcat/conf ls vim context.xml##在最後面加下列程式碼 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.25.17.11:11211,n2:172.25.17.12:11211" failoverNodes="n2" ##server2要改為n2,預設為互動式,互動式有問題了,找自己,所以設為n2 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
在server1裡面做 cd /usr/local/tomcat/lib/ ls 去官網下載jar有關的東西,傳到/usr/local/tomcat/lib/裡面 /pub/docs/lamp/jar mget * rm -f memcache-session-manager-tc6-1.6.3.jar ##因為我們是版本7的tomcat ,所以我們刪除6 的東西
cd /usr/local/tomcat bin/shutdown.sh netstat -antlp bin/startup.sh
cat logs/catalina.out##會看到節點資訊,出現節點資訊才會正確
在server2裡面 cd /usr/local/tomcat/lib/ ls 去官網下載jar有關的東西,傳到/usr/local/tomcat/lib/裡面 /pub/docs/lamp/jar mget * rm -f memcache-session-manager-tc6-1.6.3.jar ##因為我們是版本7的tomcat ,所以我們刪除6 的東西 cd /usr/local/tomcat bin/shutdown.sh netstat -antlp bin/startup.sh cat logs/catalina.out##會看到節點資訊,出現節點資訊才會正確
在真跡測試:http://172.25.17.11/test.jsp 新增使用者名稱和密碼 去server1裡面做 telnet localhost 11211 get id號 是否會有顯示
在server2裡面做 yum install -y telnet telnet localhost 11211 get id號 quit##退出 補充:停掉了一個服務機的memcache,則在另一個機子中會有相應新增的資訊的顯示,當停掉的服務及開啟的時候,並不會接管資訊,而是當接管的服務掛掉的時候,他會再次接管,並且會顯示全部資訊 /etc/init.d/memcached stop tomcat 和 memcache 是兩個服務 tomcat是上層服務,memcache是下層服務,上層互動利用下層,下層停掉了,才會在另一個機子中顯示