1.在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
1.1.ip hash,根据客户端的IP,将请求分配到不同的服务器上;
1.2.cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者;
注意:cookie需要浏览器支持,且有时候会泄露数据
2.Sticky工作原理 :
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route。
2.1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.2.后端服务器处理完请求,将响应数据返回给nginx。
2.3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5(默认md5)、sha1等Hash值。
2.4.客户端接收请求,并保存带route的cookie。
2.5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
3.重新编译nginx增加nginx-sticky-module模块(第三方)
3.1.下载并解压
下载地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/downloads/
解压文件到/data/server/这个目录并重命名文件夹为nginx-sticky-module
备份/data/server/nginx/conf目录下的配置文件
3.2.查询当前的nginx编译参数可以使用以下命令:
使用./nginx -V命令查看编译时参数

[root@mgddrefsdf ~]# /data/server/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/data/server/nginx --with-http_ssl_module --add-module=/data/server/nginx-sticky-module

3.3.编译与安装

cd /data/server/nginx-1.14.0/
./configure --prefix=/data/server/nginx --with-http_ssl_module --add-module=/data/server/nginx-sticky-module
make
make install

3.4.配置文件
将之前备份的nginx配置文件覆盖/data/server/nginx/conf下的默认配置文件,并编辑:

upstream www.abc.com {
   sticky;
   server 10.0.0.11:8080;
   server 10.0.0.12:8080;
}

3.5.测试验证
打开网站进行测试,使用sticky的情况下,不管怎么刷新同一个会话会负载到同一个后端服务器。
每台后端真实服务器都会有一个唯一的route值,所以不管你真实服务器前端有几个装了sticky的nginx代理,它都是不会变化的。
3.6.sticky模块的使用

# 参数,解析
 sticky [name=route] [domain=.foo.com] [path=/] [expires=1h]
        [hash=index|md5|sha1] [no_fallback] [secure] [httponly];
 [name=route] 设置用来记录会话的cookie名称
 [domain=.foo.com] 设置cookie作用的域名
 [path=/]   设置cookie作用的URL路径,默认根目录
 [expires=1h] 设置cookie的生存期,默认不设置,浏览器关闭即失效,需要是大于1秒的值
 [hash=index|md5|sha1]   设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5
 [no_fallback] 设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置
 [secure]   设置启用安全的cookie,需要HTTPS支持
 [httponly]   允许cookie不通过JS泄漏


3.7.其他需要注意的
3.7.1.同一客户端的请求,有可能落在不同的后端服务器上
如果客户端启动时同时发起多个请求。由于这些请求都没带cookie,所以服务器会随机选择后端服务器,返回不同的cookie。当这些请求中的最后一个请求返回时,客户端的cookie才会稳定下来,值以最后返回的cookie为准。
3.7.2.cookie不一定生效
由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。
3.7.3.客户端可能不带cookie
Android客户端发送请求时,一般不会带上所有的cookie,需要明确指定哪些cookie会带上。如果希望用sticky做负载均衡,请对Android开发说加上cookie。
3.7.4.cookie名称不要和业务使用的cookie重名,Sticky默认的cookie名称是route,可以改成任何值。
3.7.5.客户端发的第一个请求是不带cookie的,服务器下发的cookie,在客户端下一次请求时才能生效。
3.7.6.Nginx sticky模块不能与ip_hash同时使用。