Nginx+Tomcat+memcached负载均衡实现session共享

http://blog.csdn.net/love_ubuntu/article/details/8464983

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%configcontext.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启动最好用命令。

原文地址:https://www.cnblogs.com/bluejoe/p/5116019.html