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。
- [root@localhost ~]# 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]
- [root@localhost ~]# tar -zxvf nginx-0.7.67.tar.gz /解壓壓縮文件
- [root@localhost ~]# cd nginx-0.7.67 /進入安裝文件目錄
- [root@localhost nginx-0.7.67]# ./configure –prefix=/usr/local/nginx /指定安裝到/usr/local/nginx目錄下,可用./configure –help查看需要哪些編譯參數
- [root@localhost nginx-0.7.67]#make /make
- [root@localhost nginx-0.7.67]#make install /安裝
- [root@localhost 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
- [root@localhost nginx-0.7.67]#/usr/local/nginx/sbin/nginx –t /測試Nginx配置文件是否正確
- [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
- [root@localhost ~]# 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所依賴的包。
- [root@localhost ~]# cd /usr/local/tomcat/lib/
- [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar
- [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar
- [root@localhost lib]# wget http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar
- [root@localhost lib]# wget http://spymemcached.googlecode.com/files/memcached-2.4.2.jar
- [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
在配置文件中加入如下內容
- <Context docBase="/var/www/html" path="" reloadable="true">
- <Manager className="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
- [root@localhost 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
- [root@localhost 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的內容在不斷變化則說明配置成功。