標籤:nginx tomcat memcached session 緩衝 叢集
一.簡介
我們系統經常要儲存使用者登入資訊,有Cookie和Session機制,Cookie用戶端儲存使用者資訊,Session在服務端儲存使用者資訊,如果瀏覽器不支援Cookie或者使用者把Cookie禁掉了,Cookie就用不了,還有不同的瀏覽器採用不用方式儲存Cookie,所以我們採用Session服務端來儲存,上一節我們有介紹了Tomcat叢集部署,怎麼樣叢集的Tomcat對同個使用者請求的都能擷取儲存在Session的使用者資訊,採用了Memcached管理Session,Memcached 是一個高效能的分布式記憶體對象緩衝系統,接下來我們介紹Nginx+Tomcat+Memcached實現Session共用。
二.Tomcat、Nginx、Memcached配置
第一步:Memcached的安裝部署Memcached部署 這查看這篇文章
第二步:Nginx的安裝 Nginx的安裝部署 這查看這篇文章
第三步:Tomcat和JDK的安裝和環境配置 Tomcat和JDK的安裝部署 這查看這篇文章
三.實現
我們採用Memcached管理Session,主要是memcached-session-manager開源tomcat外掛程式改變Tomcat原始的Session儲存機制,將session的儲存放到分布式緩衝Memcached中,從而實現對Session的共用。
第一步:我們在Apache-tomcat-8081和Apache-tomcat-8082 下的ROOT實現一個index.jsp,如下代碼所示:
Apache-tomcat-8081的index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>hello apache-tomcat-8081 index.jspsessionId:<%=session.getId()%> <BR>sessionIp:<%=request.getServerName()%> <BR>sessionPort:<%=request.getServerPort()%> </body></html>
Apache-tomcat-8082的index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>hello apache-tomcat-8082 index.jspsessionId:<%=session.getId()%> <BR>sessionIp:<%=request.getServerName()%> <BR>sessionPort:<%=request.getServerPort()%> </body></html>
第二步:啟動Memcached服務
#/opt/bin/memcached -d -m 5 -u root -l 192.168.74.129 -p 12000 -c 256 -P /tmp/memcached.pid ,:
第三步:Nginx作為了Proxy 伺服器,客服端請求伺服器端時,採用了負載平衡來處理,這樣就能平均的把客服端請求分發到每一天伺服器,這樣減少伺服器端的壓力。實現動靜態分離,配置Nginx下的nginx.conf檔案。
#vi /usr/local/nginx/conf/nginx.conf
<span style="color:#333333;">#user nobody;worker_processes 1;error_log logs/error.log;pid logs/nginx.pid;events { use epoll; worker_connections 1024;}http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on;keepalive_timeout 65;gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; </span><span style="color:#ff0000;">upstream localhost_server { ip_hash; server 192.168.74.129:8081; server 192.168.74.129:8082; }</span><span style="color:#333333;"> server { listen 80 default; server_name localhost; </span><span style="color:#ff0000;"> location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx處理靜態頁面</span><span style="color:#333333;"> { root /usr/tomcat/apache-tomcat-8081/webapps/ROOT; expires 30d; //緩衝到用戶端30天 } error_page 404 /404.html; #redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } </span><span style="color:#ff6666;"> location ~ \.(jsp|do)$ {//所有jsp的動態請求都交給Tomcat處理 </span><span style="color:#333333;"> </span><span style="color:#c0c0c0;">proxy_pass http://localhost_server; //來自jsp或者do的尾碼的請求交給tomcat處理</span><span style="color:#333333;"> proxy_redirect off; proxy_set_header Host $host; //後端的Web伺服器可以通過X-Forwarded-For擷取使用者真實IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; //允許用戶端請求的最大單檔案位元組數 client_body_buffer_size 128k; //緩衝區代理緩衝使用者端請求的最大位元組數 proxy_connect_timeout 90; //nginx跟後端伺服器連線逾時時間 proxy_read_timeout 90; //串連成功後,後端伺服器回應時間 proxy_buffer_size 4k; //設定Proxy 伺服器(nginx)儲存使用者頭資訊的緩衝區大小 proxy_buffers 6 32k; //proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定 proxy_busy_buffers_size 64k;//高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; //設定快取檔案夾大小,大於這個值,將從upstream伺服器傳 } } }</span>
第四步:修改了Apache-tomcat-8081和Apache-tomcat-8082下的conf/context.xml 檔案,修改session的儲存方式。
在<Context></Context>標籤裡加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="<span style="color:#ff0000;">n1:192.168.74.129:12000</span>" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"/>
說明:
1.requestUriIgnorePatter:過濾圖片等靜態檔案去觸發Session備份到Memcached。
2.sessionBackupAsync:指定Session是否應該被非同步儲存到Memcached中。
3.backupThreadCount :用來非同步儲存Session的線程數。
4.sessionBackupTimeout :預設100毫秒,操作超過時間那麼儲存失敗。
第五步: 要引入memcached-session-manager所需要的jar包
如果在tomcat/lib下沒引入時,會報找不到對應的類,:
需要的jar
memcached-session-manager-1.6.3.jar
javolution-5.5.1.jar
spymemcached-2.7.1.jar
memcached-session-manager-tc6-1.6.3.jar
msm-javolution-serializer-1.6.3.jar
msm-xstream-serializer-1.6.3.jar
到這裡下載 所需JAR
1.這邊需要注意的是,我們那時引入這個memcached-2.6.jar包,而不是映入spymemcached-2.7.1.jar時會報這個錯誤,:
2.memcached-session-manager-tc6-1.6.3.jar這個包時針對tomcat6
第六步:啟動Nginx、Tomcat服務
1.啟動Tomcat
#./bin/startup.sh;tail -f ./logs/catalina.out,這邊可以查看到修改儲存session的方式,並查看是否配置正確,:
2.啟動Nginx
#cd /usr/local/nginx
#sbin/nginx
第七步:訪問index.jsp
1.我們先試一下不通過Nginx反向 Proxy,我們直接存取tomcat是否能訪問jsp,並測試我們所寫的JSP是否正確,並sessionId能正常顯示,:
2.我們訪問Nginx反向 Proxy,我們部署了Apache-tomcat-8081和Apache-tomcat-8082兩個叢集,我們查看一下是否能共用一個session,我們在頁面列印出來,看sessionId是否一樣?
請求地址都是192.168.74.129/index.jsp,我們多刷幾次,頁面的連接埠就會改變,我們查看調用Apache-tomcat-8081的index.jsp與調用Apache-tomcat-8082的index.jsp的sessionId會不會改變,:
Apache-tomcat-8081的index.jsp並顯示SessionId
Apache-tomcat-8082的index.jsp並顯示SessionId
這時發現調用Apache-tomcat-8081的index.jsp與調用Apache-tomcat-8082的index.jsp的SessionId一樣,說明共用同一個session。
Nginx+Tomcat+Memcached 實現叢集部署時Session共用