Nginx+Tomcat+Memcached集羣Session共享

cookie是怎樣工作的? 
例如,我們創建了一個名字爲login的Cookie來包含訪問者的信息,創建Cookie時,服務器端的Header如下面所示,這裏假設訪問者的註冊名是“Michael Jordan”,同時還對所創建的Cookie的屬性如path、domain、expires等進行了指定。 

Set-Cookie:login=Michael Jordan;path=/;domain=msn.com; 
expires=Monday,01-Mar-99 00:00:01 GMT 

上面這個Header會自動在瀏覽器端計算機的Cookie文件中添加一條記錄。瀏覽器將變量名爲“login”的Cookie賦值爲“Michael Jordon”。注意,在實際傳遞過程中這個Cookie的值是經過了URLEncode方法的URL編碼操作的。 
這個含有Cookie值的HTTP Header被保存到瀏覽器的Cookie文件後,Header就通知瀏覽器將Cookie通過請求以忽略路徑的方式返回到服務器,完成瀏覽器的認證操作。 

此外,我們使用了Cookie的一些屬性來限定該Cookie的使用。例如Domain屬性能夠在瀏覽器端對Cookie發送進行限定,具體到上面的例子,該Cookie只能傳到指定的服務器上,而決不會跑到其他的如www.hp.com的Web站點上去。Expires屬性則指定了該Cookie保存的時間期限,例如上面的Cookie在瀏覽器上只保存到1999年3月1日1秒。當然,如果瀏覽器上Cookie太多,超過了系統所允許的範圍,瀏覽器將自動對它進行刪除。至於屬性Path,用來指定Cookie將被髮送到服務器的哪一個目錄路徑下。 
說明:瀏覽器創建了一個Cookie後,對於每一個針對該網站的請求,都會在Header中帶着這個Cookie;不過,對於其他網站的請求Cookie是絕對不會跟着發送的。而且瀏覽器會這樣一直髮送,直到Cookie過期爲止。


session又是如何工作的? 
    由於http是無狀態的協議,你訪問了頁面A,然後在訪問B,http無法確定這2個訪問來自一個人,因此要用cookie或session來跟蹤用戶,根據授權和用戶身份來顯示不同的頁面。比如用戶A登陸了,那麼能看到自己的個人信息,而B沒登陸,無法看到個人信息。還有A可能在購物,把商品放入購物車,此時B也有這個過程,你無法確定A,B的身份和購物信息,所以需要一個session ID來維持這個過程。
   cookie是服務器發給客戶端,並且保持在客戶端的一個文件,裏面包含了用戶的訪問信息(賬戶密碼等),可以手動刪除或設置有效期,在下次訪問的時候,會返給服務器。注意:cookie可以被禁用,所以要想其他辦法,這就是session。比如:你去商場購物,商場會給你辦一張會員卡,下次你來出示該卡,會有打折優惠。該卡可以自己保存(cookie),或是商場代爲保管,由於會員太多,個人需要保存卡號信息(session ID)。


爲什麼要持久化SESSION?
在客戶端每個用戶的Session對象存在Servlet容器中,如果Tomcat服務器重起/當機的話該session就會丟失,而客戶端的操作應爲session的丟失而造成數據丟失,而且當前用戶訪問量巨大,每個用戶的Session裏存放大量的數據的話,那麼就很佔用服務器大量的內存,從而是服務器的性能受到影響。


有關集羣幾種session同步方案請參考 http://blog.csdn.net/shimiso/article/details/8978922


有關Nginx 介紹和使用請參考 http://blog.csdn.net/shimiso/article/details/8690897


Nginx+Tomcat+Memcached實現tomcat集羣和session共享
一、Nginx部分
1.1、Nginx介紹
  Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲“engine X”, 是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。
  Nginx是由俄羅斯人 Igor Sysoev爲俄羅斯訪問量第二的 Rambler.ru站點開發的,它已經在該站點運行超過兩年半了。Igor Sysoev在建立的項目時,使用基於BSD許可。
  據說他當初是F5的成員之一,英文主頁:http://nginx.net 。
1.2、Nginx優點
  Nginx 是一個很牛的高性能Web和反向代理服務器, 它具有有很多非常優越的特性: 
  在高連接併發的情況下,Nginx是Apache服務器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟件平臺之一. 能夠支持高達 50,000 個併發連接數的響應, 感謝Nginx爲我們選擇了 epoll and kqueue作爲開發模型. 
  Nginx作爲負載均衡服務器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作爲 HTTP代理服務器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多. 
  作爲郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作爲郵件代理服務器), Last.fm 描述了成功並且美妙的使用經驗. 
  Nginx 是一個 安裝非常的簡單 , 配置文件 非常簡潔(還能夠支持perl語法), Bugs非常少的服務器: Nginx 啓動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動. 你還能夠 不間斷服務的情況下進行軟件版本的升級.
1.3、Nginx安裝
  到官網http://nginx.org/en/download.html下載最新的穩定版本,目前是0.7.67。

  1. [root@localhost ~]# wget http://nginx.org/download/nginx-0.7.67.tar.gz            
  2. --2010-09-24 14:48:12--  http://nginx.org/download/nginx-0.7.67.tar.gz            
  3. Resolving nginx.org... 81.19.68.137                                               
  4. Connecting to nginx.org|81.19.68.137|:80... connected.                            
  5. HTTP request sent, awaiting response... 200 OK                                    
  6. Length: 608462 (594K) [application/octet-stream]                                  
  7. Saving to: `nginx-0.7.67.tar.gz'                                                  
  8. 100%[<========================================>] 608,462     44.5K/s   in 18s       
  9. 2010-09-24 14:48:32 (32.8 KB/s) - `nginx-0.7.67.tar.gz' saved [608462/608462]     
  10.                                                                                   
  11. [root@localhost ~]# tar -zxvf nginx-0.7.67.tar.gz    /解壓壓縮文件                
  12. [root@localhost ~]# cd nginx-0.7.67                  /進入安裝文件目錄            
  13. [root@localhost nginx-0.7.67]# ./configure –prefix=/usr/local/nginx      /指定安裝到/usr/local/nginx目錄下,可用./configure –help查看需要哪些編譯參數         
  14. [root@localhost nginx-0.7.67]#make                  /make                         
  15. [root@localhost nginx-0.7.67]#make install          /安裝                         
  16. [root@localhost nginx-0.7.67]# ll /usr/local/nginx/      /查看是否安裝成功        
  17. drwxr-xr-x 2 root root 4096 Sep 24 15:12 conf                                     
  18. drwxr-xr-x 2 root root 4096 Sep 24 15:12 html                                     
  19. drwxr-xr-x 2 root root 4096 Sep 24 15:12 logs                                     
  20. drwxr-xr-x 2 root root 4096 Sep 24 15:12 sbin                                     
  21. [root@localhost nginx-0.7.67]#/usr/local/nginx/sbin/nginx –t     /測試Nginx配置文件是否正確                                                                    
  22. [root@localhost nginx-0.7.67]#/usr/local/nginx/sbin/nginx         /啓動Nginx     

下面驗證Nginx是否正常啓動,瀏覽器中輸入nginx服務器地址,出現如下圖說明nginx正常工作。




二、利用memcached配置Nginx、Tomcat實現負載均衡和session共享
Tomcat、memcached安裝這裏就不講了,主要介紹如何配置Nginx實現Tomcat的負載均衡和利用memcached實現session共享。
配置Nginx+Tomcat集羣實現負載均衡
這裏主要修改nginx的配置文件nginx.conf
  1. [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf       /編輯nginx配置文件,內容如下  
  2. user  nobody;  
  3. worker_processes  4;  
  4. error_log  logs/error.log;  
  5. events {  
  6.     worker_connections  1024;  
  7. }  
  8.   
  9.   
  10. http {  
  11.     include       mime.types;  
  12.     default_type  application/octet-stream;  
  13.     sendfile        on;  
  14.     keepalive_timeout  65;  
  15.     gzip  on;  
  16.     upstream  www.huiyi99.com   {  
  17.               server   192.168.1.11:8080;  
  18.               server   192.168.1.101:8080;  
  19.     }  
  20.     server {  
  21.         listen       80;  
  22.         server_name  www.huiyi99.com;  
  23.         charset utf-8;  
  24.         location / {  
  25.             root   html;  
  26.             index  index.html index.htm;  
  27.             proxy_pass        http://www.huiyi99.com;  
  28.             proxy_set_header  X-Real-IP  $remote_addr;  
  29.             client_max_body_size  100m;  
  30.         }  
  31.   
  32.   
  33.         location ~ ^/(WEB-INF)/ {   
  34.             deny all;   
  35.         }   
  36.   
  37.   
  38.         error_page   500 502 503 504  /50x.html;  
  39.         location = /50x.html {  
  40.             root   html;  
  41.         }  
  42.   
  43.   
  44.     }  
  45. }  

注意:紅色字體部分是需要修改的地方。
www.huiyi99.com的域名更換爲自己需要的域名。
server   192.168.1.11:8080
server   192.168.1.10:8080     
更換爲後端Tomcat的ip的ip和端口,如果有多個按照該格式添加即可。


1.2、Tomcat配置
  使用memcached-session-manager這個開源項目(http://code.google.com/p/memcached-session-manager,下面簡稱msm)配置Tomcat和memcached實現session共享。
首先將下面的包下載到Tomcat的lib目錄下,這些包都是msm所依賴的包。
  1. [root@localhost ~]# cd /usr/local/tomcat/lib/  
  2. [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar   
  3. [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar   
  4. [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar   
  5. [root@localhost lib]# wget http://spymemcached.googlecode.com/files/memcached-2.4.2.jar   
  6. [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar  

  下面修改Tomcat配置文件,讓Tomcat結合memcached實現session共享
[root@localhost lib]# vi /usr/local/tomcat/conf/server.xml
  在配置文件中加入如下內容

  1. <Context docBase="/var/www/html" path="" reloadable="true">  
  2. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"   
  3.     memcachedNodes="n1:localhost:11211"   
  4.     requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"   
  5.     sessionBackupAsync="false"   
  6.     sessionBackupTimeout="100"   
  7.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   
  8.     copyCollectionsForSerialization="false" />  
  9. </Context>  

說明:
這裏的memcachedNodes是填寫memcached節點,多個節點時可以以空隔分開,如: 
 n1:localhost:11211 n2:localhost:11212     /localhost改爲安裝memcached的服務器的IP
sessionBackupTimeout的單位爲分鐘
/var/www/html改爲Tomcat服務器web根目錄的路徑
修改後重啓兩個TOMCAT和nginx即可,這個時候已經解決SESSION的共享問題.


測試Nginx和Tomcat
  測試Nginx是否實現負載均衡已經Tomcat能否共享session信息,分別在兩個Tomcat服務器的/var/www/html目錄下新建兩個test.jsp頁面
Tomcat1
  1. [root@localhost lib]# vi /var/www/html/test.jsp     /輸入如下內容  
  2. SessionID:<%=session.getId()%>  
  3. <BR>  
  4. SessionIP:<%=request.getServerName()%>  
  5. <BR>  
  6. SessionPort:<%=request.getServerPort()%>  
  7. <%  
  8. out.println("This is Tomcat Server 111111!");  
  9. %>  

Tomcat2
  1. [root@localhost lib]# vi /var/www/html/test.jsp     /輸入如下內容  
  2. SessionID:<%=session.getId()%>  
  3. <BR>  
  4. SessionIP:<%=request.getServerName()%>  
  5. <BR>  
  6. SessionPort:<%=request.getServerPort()%>  
  7. <%  
  8. out.println("This is Tomcat Server 222222!");  
  9. %>  

通過瀏覽器訪問Nginx服務器,如下圖將訪問地址改成Nginx所在服務器。

反覆刷新瀏覽器,如果SessionID一直不變,下面的SessionPort的內容在不斷變化則說明配置成功。

發佈了35 篇原創文章 · 獲贊 25 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章