Nginx+Tomcat+memcached負載均衡實現session共享

1.  安裝各個軟件不用說了。

2.  到tomcat的安裝目錄lib中,加入:

memcached-2.6.jarhttp://spymemcached.googlecode.com/files/memcached-2.6.jar

javolution-5.4.3.1.jar

memcached-session-manager-1.5.1.jar

memcached-session-manager-tc7-1.5.1.jar

msm-javolution-serializer-1.5.1.jar

msm-kryo-serializer-1.5.1.jar

msm-xstream-serializer-1.5.1.jar

3. 配置tomcat. 在%TOMCAT_HOME%\config\context.xml文件中加入】

  1.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  2. memcachedNodes="n1:localhost:11211,n2:localhost:11212"            
  3. requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;  
  4. sessionBackupAsync="false"  
  5. sessionBackupTimeout="1800000"  
  6. copyCollectionsForSerialization="false"  
  7. transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"  
  8.            
  9.      />  

4.  測試發現,有人說:也可在server.xml配置文件的<Host>...<Host>中添加配置

  1. <Context docBase="F:/tomcats/tomcat-7.0.2_2/webapps"  path"/msm"  reloadable"true"  >  
  2.       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  3. memcachedNodes="n1:localhost:11211,n2:localhost:11212"            
  4. requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;  
  5. sessionBackupAsync="false"  
  6. sessionBackupTimeout="1800000"  
  7. copyCollectionsForSerialization="false"  
  8. transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"  
  9.            
  10. />  
  11. </Context>  

我發現測試沒通過。


5. nginx的配置

[java] view plaincopy
  1. #user  nobody;  
  2. worker_processes  1;  
  3.   
  4. #error_log  logs/error.log;  
  5. #error_log  logs/error.log  notice;  
  6. #error_log  logs/error.log  info;  
  7.   
  8. #pid        logs/nginx.pid;  
  9.   
  10.   
  11. events {  
  12.     worker_connections  10240;  
  13. }  
  14.   
  15.   
  16. http {  
  17.     include       mime.types;  
  18.     default_type  application/octet-stream;  
  19.   
  20.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  21.     #                  '$status $body_bytes_sent "$http_referer" '  
  22.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  23.   
  24.     #access_log  logs/access.log  main;  
  25.   
  26.     sendfile        on;  
  27.     #tcp_nopush     on;  
  28.     #keepalive_timeout  0;  
  29.   
  30.     tcp_nopush     on;  
  31.     keepalive_timeout 60;  
  32.   
  33.     tcp_nodelay on;  
  34.   
  35.      client_body_buffer_size  512k;  
  36.      proxy_connect_timeout    5;  
  37.      proxy_read_timeout       60;  
  38.      proxy_send_timeout       5;  
  39.      proxy_buffer_size        16k;  
  40.      proxy_buffers            4 64k;  
  41.      proxy_busy_buffers_size 128k;  
  42.      proxy_temp_file_write_size 128k;  
  43.   
  44.     #gzip  on;  
  45.     gzip on;  
  46.     gzip_min_length  1k;  
  47.     gzip_buffers     4 16k;  
  48.     gzip_http_version 1.1;  
  49.     gzip_comp_level 2;  
  50.     gzip_types       text/plain application/x-javascript text/css application/xml;  
  51.     gzip_vary on;  
  52.   
  53.     upstream   localhost{  
  54.          #weigth參數表示權值,權值越高被分配到的機率越大  
  55.          server 127.0.0.1:9001 weight=1  max_fails=2 fail_timeout=30s;  
  56.          server 127.0.0.1:9004 weight=1  max_fails=2 fail_timeout=30s;  
  57.      server 127.0.0.1:9007 weight=1  max_fails=2 fail_timeout=30s;   
  58.      #ip_hash;  
  59.     }  
  60.     server {  
  61.         listen       80;  
  62.         server_name  localhost;  
  63.         charset utf-8;  
  64.   
  65.         #access_log  logs/host.access.log  main;  
  66.   
  67.         location / {  
  68.             root   html;  
  69.             index  index.html index.htm;  
  70.         proxy_pass    http://localhost;  
  71.         }  
  72.   
  73.         location ~ ^/(WEB-INF)/ {   
  74.         deny all;   
  75.         }   
  76.   
  77.         #error_page  404              /404.html;  
  78.   
  79.         # redirect server error pages to the static page /50x.html  
  80.         #  
  81.         error_page   500 502 503 504  /50x.html;  
  82.   
  83.         location = /50x.html {  
  84.             root   html;  
  85.         }  
  86.   
  87.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  88.         #  
  89.         #location ~ \.php$ {  
  90.         #    proxy_pass   http://127.0.0.1;  
  91.         #}  
  92.   
  93.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  94.         #  
  95.         #location ~ \.php$ {  
  96.         #    root           html;  
  97.         #    fastcgi_pass   127.0.0.1:9000;  
  98.         #    fastcgi_index  index.php;  
  99.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  100.         #    include        fastcgi_params;  
  101.         #}  
  102.   
  103.         # deny access to .htaccess files, if Apache's document root  
  104.         # concurs with nginx's one  
  105.         #  
  106.         #location ~ /\.ht {  
  107.         #    deny  all;  
  108.         #}  
  109.     }  
  110.   
  111.   
  112.     # another virtual host using mix of IP-, name-, and port-based configuration  
  113.     #  
  114.     #server {  
  115.     #    listen       8000;  
  116.     #    listen       somename:8080;  
  117.     #    server_name  somename  alias  another.alias;  
  118.   
  119.     #    location / {  
  120.     #        root   html;  
  121.     #        index  index.html index.htm;  
  122.     #    }  
  123.     #}  
  124.   
  125.   
  126.     # HTTPS server  
  127.     #  
  128.     #server {  
  129.     #    listen       443;  
  130.     #    server_name  localhost;  
  131.   
  132.     #    ssl                  on;  
  133.     #    ssl_certificate      cert.pem;  
  134.     #    ssl_certificate_key  cert.key;  
  135.   
  136.     #    ssl_session_timeout  5m;  
  137.   
  138.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
  139.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  140.     #    ssl_prefer_server_ciphers   on;  
  141.   
  142.     #    location / {  
  143.     #        root   html;  
  144.     #        index  index.html index.htm;  
  145.     #    }  
  146.     #}  
  147.   
  148. }  


6.  

   1、 session存儲到memchached實現方案時。他主要功能是修改tomcat的session存儲機制,使之能夠把session序列化存放到memcached中。

       2、Manager標籤屬性說明:

             className

                    此屬性是必須的。

             memcachedNodes

                        此屬性是必須的。這個屬性必須包含你所有運行的memcached節點。每個節點的定義格式爲<id>:<host>:<port>。

                   多個之間用空格或半角逗號隔開(如:memcachedNodes="n1:localhost:11211,n2:localhost:11212")。

                       如果你設置單個memcache節點<id>是可選的,所以它允許設置爲<host>:<port>(memcachedNodes="localhost:11211")。

             failoverNodes

                      可選項,屬性只能用在非粘連Session機制中。

                      此屬性必須包含memcached節點的Id,此節點是Tomcat作爲備份使用。多個之間用空格或逗號隔開

              memcachedProtocol

                   可選項,默認爲text。出屬性指明memcached使用的存儲協議。只支持text或者binary。

              sticky 可選項,默認爲true。

                    指定使用粘性的還是非粘性的Session機制。

              lockingMode 可選項, 此屬性只對非粘性Session有用,默認爲none。

                     指定非粘性Session的鎖定策略。他的只有

                        (1)、none:從來不加鎖

                        (2)、all: 當請求時對Session鎖定,直到請求結束

                        (3)、auto:對只讀的request不加鎖,對非只讀的request加鎖

                        (4)、uriPattern:<regexp>: 使用正則表達式來比較requestRUI + "?" + queryString來決定是否加鎖,

             requestUriIgnorePattern  可選項

                        此屬性是那些不能改備份Session的請求的正則表達式。如果像css,javascript,圖片等靜態文件被同一個Tomcat和同一個應用上下文來提供,這些

                   請求也會通過memcached-session-manager。但是這些請求在一個http會話中幾乎沒什麼改變,所以他們沒必要觸發Session備份。所以那些靜態文件

                   沒必要觸發Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規範。

            sessionBackupAsync 可選項,默認true

                        指定Session是否應該被異步保存到Memcached中。 如果被設置爲true,backupThreadCount設置起作用,如果設置false,通過sessionBackupTimeout

                   設置的過期時間起作用。

            backupThreadCount 可選項,默認爲CPU內核數。

                       用來異步保存Session的線程數(如果sessionBackupAsync="true")。

            sessionBackupTimeout  可選項,默認100,單位毫秒

                       設置備份一個Session所用的時間,如果操作超過時間那麼保存失敗。此屬性只在sessionBackupAsync="false"是起作用。默認100毫秒

            sessionAttributeFilter 可選項 從1.5.0版本有

                       此屬性是用來控制Session中的那個屬性值保存到Memcached中的正則表達式。鄭則表達式被用來匹配Session中屬性名稱。如

                  sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"屬性保存到Memcached中。

                  依賴於選擇的序列化策略。

            transcoderFactoryClass 可選,默認爲 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

                       此屬性值是創建序列化和反序列化保存到Memcached中的Session的編碼轉換器的工廠類名。這個指定的類必須實現了de.javakaffee.web.msm.TranscoderFactory

                 和提供一個無參的構造方法。例如其他的有效的實現在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.

            copyCollectionsForSerialization 可選項,默認false。

            customConverter 可選項

                  

            enableStatistics 可選項,默認true

                   用來指定是否進行統計。

            enabled 可選項,默認true

                    指定Session保存到Memcached中是否可用和是否可以通過JMX進行改變。只用於粘性Session。


7.  編輯session.jsp 進行測試是否session共享。

[html] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  7. <html>  
  8.   <head>  
  9.     <base href="<%=basePath%>">    
  10.     <title>My JSP 'session.jsp' starting page</title>  
  11.     <meta http-equiv="pragma" content="no-cache">  
  12.     <meta http-equiv="cache-control" content="no-cache">  
  13.     <meta http-equiv="expires" content="0">      
  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  15.     <meta http-equiv="description" content="This is my page">  
  16.     <!-- 
  17.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  18.     -->  
  19.   </head>  
  20.   <body>  
  21.     <%  
  22.      System.out.println(session.getId());  
  23.      out.println("<br> This is (TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");  
  24.     %>  
  25.   </body>  
  26. </html>  
要打印出n1,tomcat等字樣才表示session共享成功。

8. 注意的問題。memcached最好安裝成windows服務。tomcat的端口不要衝突。nginx啓動最好用命令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章