Nginx+Tomcat+Memcached 實現叢集部署時Session共用

來源:互聯網
上載者:User

標籤: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共用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.