1. 程式人生 > >Nginx+Tomcat+Memcached叢集Session共享

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裡存放大量的資料的話,那麼就很佔用伺服器大量的記憶體,從而是伺服器的效能受到影響。

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. [[email protected] ~]# 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. [[email protected] ~]# tar -zxvf nginx-0.7.67.tar.gz    /解壓壓縮檔案                
  11. [[email protected] ~]# cd nginx-0.7.67                  /進入安裝檔案目錄            
  12. [[email protected] nginx-0.7.67]# ./configure –prefix=/usr/local/nginx      /指定安裝到/usr/local/nginx目錄下,可用./configure –help檢視需要哪些編譯引數         
  13. [[email protected] nginx-0.7.67]#make                  /make                         
  14. [[email protected] nginx-0.7.67]#make install          /安裝                         
  15. [[email protected] nginx-0.7.67]# ll /usr/local/nginx/      /檢視是否安裝成功        
  16. drwxr-xr-x 2 root root 4096 Sep 24 15:12 conf                                     
  17. drwxr-xr-x 2 root root 4096 Sep 24 15:12 html                                     
  18. drwxr-xr-x 2 root root 4096 Sep 24 15:12 logs                                     
  19. drwxr-xr-x 2 root root 4096 Sep 24 15:12 sbin                                     
  20. [[email protected] nginx-0.7.67]#/usr/local/nginx/sbin/nginx –t     /測試Nginx配置檔案是否正確                                                                    
  21. [[email protected] 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. [[email protected] ~]# 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. http {  
  9.     include       mime.types;  
  10.     default_type  application/octet-stream;  
  11.     sendfile        on;  
  12.     keepalive_timeout  65;  
  13.     gzip  on;  
  14.     upstream  www.huiyi99.com   {  
  15.               server   192.168.1.11:8080;  
  16.               server   192.168.1.101:8080;  
  17.     }  
  18.     server {  
  19.         listen       80;  
  20.         server_name  www.huiyi99.com;  
  21.         charset utf-8;  
  22.         location / {  
  23.             root   html;  
  24.             index  index.html index.htm;  
  25.             proxy_pass        http://www.huiyi99.com;  
  26.             proxy_set_header  X-Real-IP  $remote_addr;  
  27.             client_max_body_size  100m;  
  28.         }  
  29.         location ~ ^/(WEB-INF)/ {   
  30.             deny all;   
  31.         }   
  32.         error_page   500 502 503 504  /50x.html;  
  33.         location = /50x.html {  
  34.             root   html;  
  35.         }  
  36.     }  
  37. }  

注意:紅色字型部分是需要修改的地方。
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. [[email protected] ~]# cd /usr/local/tomcat/lib/  
  2. [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar   
  3. [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar   
  4. [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar   
  5. [[email protected] lib]# wget http://spymemcached.googlecode.com/files/memcached-2.4.2.jar   
  6. [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar  

  下面修改Tomcat配置檔案,讓Tomcat結合memcached實現session共享
[[email protected] lib]# vi /usr/local/tomcat/conf/server.xml
  在配置檔案中加入如下內容
  1. <ContextdocBase="/var/www/html"path=""reloadable="true">
  2. <ManagerclassName="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. [[email protected] 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. [[email protected] 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的內容在不斷變化則說明配置成功。