nginx会话保持nginx-sticky-module
模块
在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
– ip hash,根据客户端的IP,将请求分配到不同的服务器上;
– cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者,注意:cookie需要浏览器支持,且有时候会泄露数据
– 基于服务端的Session会话共享(mysql/memcache/redis)
Sticky工作原理:
Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route
1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。
模块下载地址:
https://github.com/bymaximus/nginx-sticky-module-ng
wget https://github.com/bymaximus/nginx-sticky-module-ng/archive/master.zip
编译时加上--add-module=/tmp/nginx-sticky-module-ng-master
(这里的路径使用模块的实际路径),如果是升级nginx,直接在原来的编译参数后加上即可。
有关nginx平滑升级请参考:https://www.gl.sh.cn/2019/05/22/tian_jia_nginx_mo_kuai_sheng_ji_nginx.html
Sticky配置的语法
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h]
[hash=index|md5|sha1] [no_fallback] [secure] [httponly];
name:用户跟踪cookie的名称:默认是route
domain:cookie有效的域,默认的值是nothing,对哪个域生效
cookie:缓存在客户端上的有效期
hash:cookie利用那种方式生成,index|md5|sha1
no_fallbask:当设置的时候,如果请求附带cookie并且相应的后端不可用,这Nginx返回502错误
secure:启用安全的cookie,仅能通过https传输
httponly:使cookie不会通过js(脚本)泄露
配置实例
upstream blog {
sticky name=guilin expires=1h domain=.ct99.cn hash=md5 secure path=/;
server 192.168.1.5;
server 192.168.1.6;
}
// 只需要在upsteram里面加上sticky即可
此时再次请求网站时,会多一个cookie信息