Nginx负载均衡的SESSION共享问题解决方案

Nginx是什么?:

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,目前中国使用nginx公司有:百度、京东、新浪、网易、腾讯、淘宝等。

什么是反向代理以及什么是正向代理:

1、反向代理方式,是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

2、正向代理,是一个位于客户端和原始服务器之间的服务器为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理

关于反向和正向 proxy推荐LINK:

LINK: https://baijiahao.baidu.com/s?id=1566988836622068&wfr=spider&for=pc

什么是动静分离:

将静态资源(html,js,jquery,img等)资料和后端代码分开放置在反向代理服务器上(或者cdn服务器),后端应用提供API,根据前端的请求进行处理,并将处理结果通过JSON格式返回至前端。

什么是负载均衡:

数据流量分摊到多个服务器上执行,减轻每台服务器的压力,多台服务器共同完成工作任务,从而提高了数据的吞吐量。

例如:一台反向代理服务器和两台应用服务器

一台反向代理服务器通过ip_hash来限制每个请求的ip发放给指定的应用服务器,这样可以避免session共享问题;

负载均衡策略:

1.轮询
这种是默认的策略,把每个请求按顺序逐一分配到不同的server

缺点是:可靠性低和负载分配不均衡。

upstream  suyi {   
    server    127.0.0.1:8080; 
    server    127.0.0.1:8090;  
} 

2.最少连接
把请求分配到连接数最少的server

upstream  suyi {
    least_conn;
    server    127.0.0.1:8080; 
    server    127.0.0.1:8090;  
} 

3.权重
使用weight来指定server访问比率,weight默认是1。用于后端服务器性能不均的情况。

upstream  suyi {   
    server    127.0.0.1:8080 weight=6;//60%
    server    127.0.0.1:8090 weight=4;//40%  
}

4.ip_hash
每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。

upstream  suyi {
    ip_hash;
    server    127.0.0.1:8080; 
    server    127.0.0.1:8090;  
}

ip_hash可以和weight结合使用。

 

5.fair(第三方)

  按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

upstream suyi{ 
    server 127.0.0.1:9001; server 127.0.0.1:9002; fair; 
}

 

5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

配置

进入nginx\conf目录,编辑nginx.conf,在#gzip on;这一行下开始配置

关于Nginx.conf的配置推荐LINK: https://www.cnblogs.com/youzhibing/p/7327342.html

upstream  suyi {   
    server    127.0.0.1:8080; 
    server    127.0.0.1:8090;  
} 

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass http://suyi;
            index  index.html index.htm;
        }
    }

配置两个地方,第一个是upstream,另一个是proxy_pass http:// xxx
注意upstream 后面的名字需要和server中的location下的proxy_paxx http:// 后的内容相同

Session共享问题解决方案:

由于请求先通过Nginx代理服务器,再有nginx服务器分配请求到具体的应用服务器中间就会遇到Session共享问题:

1.ip_hash 根据ip分配请求的应用服务器

2.不使用session,换cookie就不会存在此问题,但是网站安全度降低

3.使用cookie和redis缓存(建议此方案,方便扩展,缓存中速度高效)

               例如:生成一个uuid作为用户信息的key存放在redis缓存中,再将uuid作为cookie的值写会客户端,cookie的key可以用固定值(常量)

4.放到MySQL数据库中,不推荐(增加数据库的io)

 

推荐文章:

多个Nginx如何实现集群初步研究LINK: https://www.cnblogs.com/EasonJim/p/7807794.html

你可能感兴趣的:(Nginx,Nginx)