Nginx的session一致性问题教程

2019-09-14由程序员日记发表于系统教程 浏览31次

目录

session共享:

首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题

Session一致性解决方案
1、session复制
tomcat 本身带有复制session的功能。
2、共享session
需要专门管理session的软件,
memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session。

安装memcached

以下配置可以在nginx所在主机中
1、安装memcached
yum –y install memcached
2、启动memcached
memcached -d -m 128m -p 11211 -l 192.168.56.11 -u root -P /tmp/
-d:后台启动服务
-m:缓存大小
-p:端口
-l:IP
-P:服务器启动后的系统进程ID,存储的文件
-u:服务器启动是以哪个用户名作为管理用户

以下配置在tomcat所在的主机中:
配置session共享如下:
3、拷贝jar到tomcat的lib下
在这里插入图片描述
4、配置tomcat,每个tomcat里面的context.xml中加入(在tomcat/conf目录下)

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
    memcachedNodes="n1:192.168.56.11:11211" 
    sticky="false" 
    lockingMode="auto"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 
/>

在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  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  0;
    #keepalive_timeout  65;

    #gzip  on;

    upstream tom {
        server 192.168.56.12:8080;
        server 192.168.56.13:8080;
        }

    server {
        listen       80;
        server_name  www.sxthenhao.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /cat {
            proxy_pass http://tom/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}
    

注意:要保持集群的时间一致,否则可能导致session不匹配