#什么是Sticky?# 为了理解Sticky的工作原理,我们可以先考虑一个问题:负载均衡怎么做?
DNS解析,在域名解析时分配给不同的服务器IP;
IP Hash,根据客户端的IP,将请求分配到不同的服务器上;
cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发行者。
Sticky就是基于cookie的一种负载均衡解决方案,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。请求来了,服务器发个cookie,并说:下次来带上,直接来找我。
为方便叙述,文中的cookie都指sticky使用的cookie。
#Sticky工作原理 Sticky是nginx的一个模块,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上。sticky的处理过程如下(假设cookie名称为route):
1.客户端首次发起请求,请求头未带route的cookie。nginx接收请求,发现请求头没有route,则以轮询方式将请求分配给后端服务器。
2.后端服务器处理完请求,将响应头和内容返回给nginx。
3.nginx生成route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并创建route的cookie。
5.客户端再次发送请求时,带上route。
6.nginx接收到route,直接转给对应的后端服务器。
--------------------------------------------------------------------------------------------------
(1)ngx_http_sticky_misc.c
解压:
tar -xzvf nginx-sticky-module-1.1.tar.gz
进入nginx-1.9.3目录
编译时出现错误:
cc1: warnings being treated as errors
ngx_http_sticky_module.c: In function ‘ngx_http_get_sticky_peer’:
/ngx_http_sticky_module.c:333: 警告:赋值时将整数赋给指针,未作类型转换
ake[1]: *** [objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_module.o] 错误 1
根据资料 把ngx_http_sticky_misc.c 的281行修改如下
原digest->len = ngx_sock_ntop(in,digest
->data, len, 1);
改后digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in),digest
->data, len, 1);
(2)ngx_http_sticky_module.c
第6行添加:
#include <nginx.h>
第340行左右修改(iphp->rrp.current = iphp->selected_peer;)为:
#if defined(nginx_version) && nginx_version >= 1009000
iphp->rrp.current = peer;
#else
iphp->rrp.current = iphp->selected_peer;
#endif
#解压后,直接复制以下的文件到目录/usr/local/nginx-sticky-module-1.1/,将旧的文件覆盖
rm -rf /usr/local/nginx-sticky-module-1.1/ngx_http_sticky_module.c
rm -rf /usr/local/nginx-sticky-module-1.1/ngx_http_sticky_misc.c
#sticky模块 直接用配置好模板