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。
- [[email protected] ~]# wget http://nginx.org/download/nginx-0.7.67.tar.gz
- --2010-09-24 14:48:12-- http://nginx.org/download/nginx-0.7.67.tar.gz
- Resolving nginx.org... 81.19.68.137
-
Connecting to nginx.org|81.19.68.137|:80... connected.
- HTTP request sent, awaiting response... 200 OK
- Length: 608462 (594K) [application/octet-stream]
- Saving to: `nginx-0.7.67.tar.gz'
- 100%[<========================================>] 608,462 44.5K/s in 18s
- 2010-09-24 14:48:32 (32.8 KB/s) - `nginx-0.7.67.tar.gz' saved [608462/608462]
- [[email protected] ~]# tar -zxvf nginx-0.7.67.tar.gz /解壓壓縮檔案
- [[email protected] ~]# cd nginx-0.7.67 /進入安裝檔案目錄
- [[email protected] nginx-0.7.67]# ./configure –prefix=/usr/local/nginx /指定安裝到/usr/local/nginx目錄下,可用./configure –help檢視需要哪些編譯引數
- [[email protected] nginx-0.7.67]#make /make
- [[email protected] nginx-0.7.67]#make install /安裝
- [[email protected] nginx-0.7.67]# ll /usr/local/nginx/ /檢視是否安裝成功
- drwxr-xr-x 2 root root 4096 Sep 24 15:12 conf
- drwxr-xr-x 2 root root 4096 Sep 24 15:12 html
- drwxr-xr-x 2 root root 4096 Sep 24 15:12 logs
- drwxr-xr-x 2 root root 4096 Sep 24 15:12 sbin
- [[email protected] nginx-0.7.67]#/usr/local/nginx/sbin/nginx –t /測試Nginx配置檔案是否正確
- [[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
- [[email protected] ~]# vi /usr/local/nginx/conf/nginx.conf /編輯nginx配置檔案,內容如下
- user nobody;
- worker_processes 4;
- error_log logs/error.log;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- sendfile on;
- keepalive_timeout 65;
- gzip on;
- upstream www.huiyi99.com {
- server 192.168.1.11:8080;
- server 192.168.1.101:8080;
- }
- server {
- listen 80;
- server_name www.huiyi99.com;
- charset utf-8;
- location / {
- root html;
- index index.html index.htm;
- proxy_pass http://www.huiyi99.com;
- proxy_set_header X-Real-IP $remote_addr;
- client_max_body_size 100m;
- }
- location ~ ^/(WEB-INF)/ {
- deny all;
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
- }
注意:紅色字型部分是需要修改的地方。
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所依賴的包。
- [[email protected] ~]# cd /usr/local/tomcat/lib/
- [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar
- [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar
- [[email protected] lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar
- [[email protected] lib]# wget http://spymemcached.googlecode.com/files/memcached-2.4.2.jar
- [[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
在配置檔案中加入如下內容
- <ContextdocBase="/var/www/html"path=""reloadable="true">
- <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"
- memcachedNodes="n1:localhost:11211"
- requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
- sessionBackupAsync="false"
- sessionBackupTimeout="100"
- transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
- copyCollectionsForSerialization="false"/>
- </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
- [[email protected] lib]# vi /var/www/html/test.jsp /輸入如下內容
- SessionID:<%=session.getId()%>
- <BR>
- SessionIP:<%=request.getServerName()%>
- <BR>
- SessionPort:<%=request.getServerPort()%>
- <%
- out.println("This is Tomcat Server 111111!");
- %>
Tomcat2
- [[email protected] lib]# vi /var/www/html/test.jsp /輸入如下內容
- SessionID:<%=session.getId()%>
- <BR>
- SessionIP:<%=request.getServerName()%>
- <BR>
- SessionPort:<%=request.getServerPort()%>
- <%
- out.println("This is Tomcat Server 222222!");
- %>
通過瀏覽器訪問Nginx伺服器,如下圖將訪問地址改成Nginx所在伺服器。
反覆重新整理瀏覽器,如果SessionID一直不變,下面的SessionPort的內容在不斷變化則說明配置成功。