Nginx+Tomcat+Memcached 實現集羣部署時Session共享javascript
一.簡介css
咱們系統常常要保存用戶登陸信息,有Cookie和Session機制,Cookie客戶端保存用戶信息,Session在服務端保存用戶信息,若是瀏覽器不支持Cookie或者用戶把Cookie禁掉了,Cookie就用不了,還有不一樣的瀏覽器採用不用方式保存Cookie,因此咱們採用Session服務端來保存,上一節咱們有介紹了Tomcat集羣部署,怎麼樣集羣的Tomcat對同個用戶請求的都能獲取保存在Session的用戶信息,採用了Memcached管理Session,Memcached 是一個高性能的分佈式內存對象緩存系統,接下來咱們介紹Nginx+Tomcat+Memcached實現Session共享。html
二.Tomcat、Nginx、Memcached配置java
第一步:Memcached的安裝部署Memcached部署 這查看這篇文章nginx
第二步:Nginx的安裝 Nginx的安裝部署 這查看這篇文章web
第三步:Tomcat和JDK的安裝和環境配置 Tomcat和JDK的安裝部署 這查看這篇文章apache
三.實現後端
咱們採用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.jsp sessionId:<%=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.jsp sessionId:<%=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做爲了代理服務器,客服端請求服務器端時,採用了負載均衡來處理,這樣就能平均的把客服端請求分發到每一天服務器,這樣減小服務器端的壓力。實現動靜態分離,配置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; //設置代理服務器(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
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反向代理,咱們直接訪問tomcat是否能訪問jsp,並測試咱們所寫的JSP是否正確,並sessionId能正常顯示,如圖所示:
2.咱們訪問Nginx反向代理,咱們部署了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。