memcache+tomcat7.0.37+nginx實現session共享

1、session工做原理css

因爲http是無狀態的協議,當咱們訪問了頁面A,而後訪問頁面B,http沒法肯定這2個頁面的訪問是來自同一我的。所以,咱們要用cookie或session來跟蹤用戶,根據受權和用戶身份來顯示不一樣的頁面。例如:用戶a和b同時進行了把商品加入購物車,這時咱們不能區分a和b,因此須要一個session ID來維持這個過程。Cookie是服務器發送給客戶端的,而且把信息保存在客戶端的一個文件中,裏面包含用戶訪問信息,便於下一此訪問直接對到對應的後端服務器。Cookie能夠被禁用,而session id至關於本身的一個屬性,表明本身的身份。 咱們使用session共享,是爲了防止tomcat服務器重啓或掉了以後的數據丟失狀況;維持多個節點之間數據的一致性。html

如下爲基於memcache緩存的session共享: tomcat1和tomcat2將session分別存儲在memcached2和memcached1中(實現交叉存儲),當memcached2不可用時,纔將tomcat1的數據存儲在memcache1中,這樣好處是,當tomcat1和memcached1同時崩潰時也不會丟失session會話,避免單點故障。 java

nginx  --->  tomcat  --->  memcached
node

2、實驗步驟linux

Server6: 172.25.2.6   nginx  tomcat  memcached 
nginx

Server1: 172.25.2.1   tomcat memcachedweb

真機中進行測試。
apache

1) 在server6和server1中安裝jdk。   vim

--->  tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/ 後端

--->  cd /usr/local

--->  ln  -s  jdk-7u79/  java        # 作一個軟連接,方便使用

--->  vim /etc/profile               # 配置java的環境變量

---> source  /etc/profile            # 從新加載配置文件

2)對安裝好的jdk進行檢測

--->  Vim  test.java       # 在java中,類名要和文件名相同;且文件名後綴爲.java

--->  javac test.java     # 生成.class文件

--->  java test           # 執行後的運行結果爲hello xniu~

3)在server6和server1中安裝tomcat

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

--->  cd /usr/local

--->  ln -s  apache-tomcat-7.0.37/  tomcat     # 軟鏈接

4)在tomcat的默認發佈目錄編寫.jsp文件測試,查看apache是否安裝成功(在此以server6做爲實例演示,server1步驟與6相同)

 

--->  cd /usr/local/tomcat/webapps/ROOT        # tomcat的默認發佈目錄 

 

--->  vim test.jsp

 

The  time is <%=new  java.util.Date() %>

 

--->  /usr/local/tomcat/bin/startup.sh         # 啓動tomcat服務

#在瀏覽器中,使用172.25.2.6:8080/test.html來進行查看

5)對server6的nginx服務進行配置。

--->  vim  /usr/local/nginx/conf/nginx.conf

 

server {
        listen       80;
        server_name  localhost;        # 經過apache服務訪問tomcat 
        location ~ \.jsp$ {
            proxy_pass   http://127.25.2.6:8080;     
        }

 

6)在server6和server1中下載memcached服務,並啓動服務。

--->  yum  install  -y  memcached       # 在yum倉庫中有,可直接下載

--->  /etc/init.d/memcached  start

--->  netstat -antlp| grep 11211        # memcached服務默認端口爲11211

7)在server6和server1中編輯tomcat的配置文件,添加以下信息

--->  vim /usr/local/tomcat/conf/content.xml     # 添加在最後

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n6:172.25.2.6:11211,n1:172.25.2.1:11211"

failoverNodes="n6"   #在 node2 上此項設置爲「n1」

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />


8) 修改server1和server6下的test.jsp頁面。內容以下

--->  vim /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>

10) 將jar包放在server6和server1的/usr/local/tomcat/lib下。

11) 打開server6的tomcat,nginx;server1的tomcat(因爲以前啓動了memcache,在這就不啓動了)

--->  /usr/local/tomcat/bin/startup.sh

--->  nginx 

# 此時,咱們能夠在日誌中查看memcache的節點信息

--->  cat /usr/local/tomcat/logs/cataline.out

12) 此時,咱們的配置大體完成了,能夠在瀏覽器中輸入172.25.2.6/test.jsp

# 安裝telnet,查看memcache的存儲記錄

--->  yum install -y telnet

--->  telnet localhost 11211    # localhost爲主機ip;11211爲端口號(使用get id號來查看)

 

若出現server1的memcache壞掉,則session會跑到server6上。 ##注意:不一樣主機訪問時,會調用到不一樣的tomcat主機上,來自同一主機會交給同一個tomcat實例進行處理;若此時down掉正在響應的tomcat,nginx會自動把用戶的請求交給另外一個tomcat服務實例。實現serssion的共享
 
相關文章
相關標籤/搜索