设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] Nginx+Tomcat+memcached负载均衡实现session共享

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-8 10:00:22 | 显示全部楼层 |阅读模式
1.  安装各个软件不用说了。

2.  到tomcat的安装目录lib中,加入:

memcached-2.6.jar(http://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文件中加入】

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

4.  测试发现,有人说:也可在server.xml配置文件的<Host>...<Host>中添加配置

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

我发现测试没通过。


5. nginx的配置


    #user  nobody;  
    worker_processes  1;  
      
    #error_log  logs/error.log;  
    #error_log  logs/error.log  notice;  
    #error_log  logs/error.log  info;  
      
    #pid        logs/nginx.pid;  
      
      
    events {  
        worker_connections  10240;  
    }  
      
      
    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;  
        #tcp_nopush     on;  
        #keepalive_timeout  0;  
      
        tcp_nopush     on;  
        keepalive_timeout 60;  
      
        tcp_nodelay on;  
      
         client_body_buffer_size  512k;  
         proxy_connect_timeout    5;  
         proxy_read_timeout       60;  
         proxy_send_timeout       5;  
         proxy_buffer_size        16k;  
         proxy_buffers            4 64k;  
         proxy_busy_buffers_size 128k;  
         proxy_temp_file_write_size 128k;  
      
        #gzip  on;  
        gzip on;  
        gzip_min_length  1k;  
        gzip_buffers     4 16k;  
        gzip_http_version 1.1;  
        gzip_comp_level 2;  
        gzip_types       text/plain application/x-javascript text/css application/xml;  
        gzip_vary on;  
      
        upstream   localhost{  
             #weigth参数表示权值,权值越高被分配到的几率越大  
             server 127.0.0.1:9001 weight=1  max_fails=2 fail_timeout=30s;  
             server 127.0.0.1:9004 weight=1  max_fails=2 fail_timeout=30s;  
         server 127.0.0.1:9007 weight=1  max_fails=2 fail_timeout=30s;   
         #ip_hash;  
        }  
        server {  
            listen       80;  
            server_name  localhost;  
            charset utf-8;  
      
            #access_log  logs/host.access.log  main;  
      
            location / {  
                root   html;  
                index  index.html index.htm;  
            proxy_pass    http://localhost;  
            }  
      
            location ~ ^/(WEB-INF)/ {   
            deny all;   
            }   
      
            #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;  
            }  
      
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
            #  
            #location ~ \.php$ {  
            #    proxy_pass   http://127.0.0.1;  
            #}  
      
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
            #  
            #location ~ \.php$ {  
            #    root           html;  
            #    fastcgi_pass   127.0.0.1:9000;  
            #    fastcgi_index  index.php;  
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
            #    include        fastcgi_params;  
            #}  
      
            # deny access to .htaccess files, if Apache's document root  
            # concurs with nginx's one  
            #  
            #location ~ /\.ht {  
            #    deny  all;  
            #}  
        }  
      
      
        # another virtual host using mix of IP-, name-, and port-based configuration  
        #  
        #server {  
        #    listen       8000;  
        #    listen       somename:8080;  
        #    server_name  somename  alias  another.alias;  
      
        #    location / {  
        #        root   html;  
        #        index  index.html index.htm;  
        #    }  
        #}  
      
      
        # HTTPS server  
        #  
        #server {  
        #    listen       443;  
        #    server_name  localhost;  
      
        #    ssl                  on;  
        #    ssl_certificate      cert.pem;  
        #    ssl_certificate_key  cert.key;  
      
        #    ssl_session_timeout  5m;  
      
        #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
        #    ssl_ciphers  HIGH:!aNULL:!MD5;  
        #    ssl_prefer_server_ciphers   on;  
      
        #    location / {  
        #        root   html;  
        #        index  index.html index.htm;  
        #    }  
        #}  
      
    }  



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共享。



    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
      <head>  
        <base href="<%=basePath%>">   
        <title>My JSP 'session.jsp' starting page</title>  
        <meta http-equiv="pragma" content="no-cache">  
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
        <meta http-equiv="description" content="This is my page">  
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->  
      </head>  
      <body>  
        <%  
         System.out.println(session.getId());  
         out.println("<br> This is (TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");  
        %>  
      </body>  
    </html>  

要打印出n1,tomcat等字样才表示session共享成功。

8. 注意的问题。memcached最好安装成windows服务。tomcat的端口不要冲突。nginx启动最好用命令。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-148330-1-1.html 上篇帖子: Tomcat安装、配置、案例分析 下篇帖子: memcached-session-manager配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表