Sticky模块
简述:
之前公司部署了一套网站及时发布系统,架构如下图所示;Nginx做前端代理,发布系统用tomcat运行,一台共享存储,一台数据库服务器;由于网站及时发布系统涉及到了用户登录操作,要保障客户端的会话完整,用nginx自带的ip_hash进行分发,但实际生产环境下出现了问题;系统大多是公司内部编辑人员进行编辑网页时访问,出口IP都一致,Nginx会把请求分发到一台服务器上,两台服务器并没有合理分配请求资源;所以这种情况下得用到sticky模块
sticky应用场景
在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐
注:如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的
编译安装
[root@wcmweb1 ~]# tar zxvf nginx-1.7.0.tar.gz ###解压nginx源代码包
[root@wcmweb1 ~]# tar zxvf nginx-sticky-module-1.1.tar.gz ###然后解压sticky模块
[root@wcmweb1 ~]# mv nginx-sticky-module-1.1 nginx-1.7.0 ###拷贝模块到nginx安装目录下
[root@wcmweb1 ~]# ./configure --prefix=/data/nginx --with-http_stub_status_module --add-module=nginx-sticky-module-1.1 ###进入安装目录编译
[root@wcmweb1 ~]# make && make install 编译安装
注:nginx-1.8版本不知为何,sticky模式启用后,浏览器刷新后经常出现不稳定状况,会让用户重新登录
下载地址-》》https://pan.baidu.com/s/1hskFPDM
注意事项
nginx-1.5.x和nginx-sticky-module-1.1编译会有点问题,应该是nginx新版本没有相应的nginx-sticky-module
解决办法是把nginx-sticky-module-1.1/ngx_http_sticky_misc.c的281行修改为:
digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in), digest->data, len, 1);
由于编译需要,编译安装Nginx之前,要先安装openssl yum -y install openssl-devel
Nginx配置文件
省略..................... upstream backserver {
sticky;
server 192.168.x.xx:8080;
server 192.168.x.xx:8080;
} server {
listen 80;
server_name localhost; #charset koi8-r; access_log logs/host.access.log main;
location ~* ^(.*)$ {
#limit_req zone=allips burst=1 nodelay; proxy_pass http://backserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 8m;
} 省略................
}
重新启动nginx服务 nginx-sticky-module的cookie过期时间,默认浏览器关闭就过期,也就是会话方式