nginx 基于cookie分流

一、概述

为了保障公司业务不受单点机房故障影响;需要做机房双活;把流量分别导向不同的IDC机房,按比例分配;方法有多种,本文所讲的就是模拟按客户端不同cookie分流实现;nginx plug+自带cookie分配,就是商业版支持,对于 大多的创业公司用的是源生的开源nginx则可以通过应用层给不同的客户端分配cookie值来导向到不同的IDC机房;这么说容易理解点;本文就是通过模拟不同的客户端cookie导向到不同的IDC机房;
架构如下:

图中的高可用负载既可以是单个机房的,也可以是多个机房的入口;下面的IDCA ,IDCB等机房,既可以是具体的web,也可以是多个机房;

功能实现:
nginx商业版自带的cookie分配默认是通过客户端携带的cookie做hash分配到各后端;这里是通过应用层给客户端分配cookie并导向到指定后端;实现过程如下:
应用程序给客户端分配生成特定cookie键值,如ickey=”yunhnagweb201801”,安全公司或高可用负载设备通过匹配cookie值,将流量分配到不同的IDC机房;键值以01结尾分配到IDCA;键值以02结尾分配到IDCB;

二、测试

本次测试由于没有应用层分配cookie,通过模拟方式进行即生成cookie是在负载设备上通过请求ip的后缀来生成cookie并将请求分配到指定web(或叫IDC)上;
测试环境:
测试所用三台主机:nginx 均是通过epel库yum安装即可!
负载设备:10.8.11.203 Centos7 nginx 1.12 域名:test.test.com
Web1(模拟IDCA): 10.8.11.144 域名:test.test.com
Web2(模拟IDCB): 10.8.11.181 域名:test.test.com
以上域名在本地和三台hosts做对应解析;
当用户访问负载设备test.test.com时 通过请求的来源ip后缀来确定流量分配到那台IDC上;

配置
入口负载设备 nginx配置

[[email protected] conf.d]# cat test_map_cookie.conf
map $COOKIE_ickey $group {
~*[0-5]$ zone01;     #cookie 0-5结尾走zone01
~*[6-9]$ zone02;     # cookie 6-9 结尾走zone02
default root;          #默认
  }

upstream zone01

server 10.8.11.144:8080 weight=1 max_fails=1 fail_timeout=30s;
 }

upstream zone02 {
server 10.8.11.181:8080 weight=1 max_fails=1 fail_timeout=30s;
 } 

upstream root {
server 10.8.11.203:80 weight=1 max_fails=1 fail_timeout=30s;
 }

server {
add_header Set-Cookie "ickey=bqx1x3x5hhda0000000002${remote_addr}";  #模拟客户端访问时带的cookie(一般是应用层分配好)
listen 80;
server_name test.test.com;
access_log logs/access_log main;
error_log logs/error_log;

location / {
proxy_pass http://$group;
proxy_set_header X-Forwarded-For $remote_addr;
 }
 }

这里注意的是 后端web侦听的端口不要和上层负载设备端口一样;实测中这样会行不通!

两台web配置
为了能看到来自那台web(IDC)响应,各自返回的web内容加以区别;

Web1(IDCA):

[[email protected]_redis-144 conf.d]# cat web144.conf
server{
    listen 8080;
    server_name test.test.com;
    root /home/dongyc/web144/;
        index index.html;
        access_log  /var/log/nginx/test.ickey.cn_nginx.log  main;
}

查看web内容:

[[email protected]_redis-144 conf.d]# cat /home/dongyc/web144/index.html
<h1>test web web144 form IDCA.</h1>

Web2(IDCB):

[[email protected]_redis-181 conf.d]# cat web181.conf
server{
        listen 8080;
        server_name test.test.com;
        root /home/dongyc/web181/;
        index index.html;
        access_log  /var/log/nginx/test.ickey.cn_nginx.log  main;

}

查看web内容:

[[email protected]_redis-181 conf.d]# cat /home/dongyc/web181/index.html
<h1>test web 181 from IDCB.</h1>

三、测试效果

由于客户端cookie模拟时以客户端ip结尾,同时 0-5结尾的分配到IDCA,6-9分配到IDCB;因此找两台ip结尾分别在以上两个区间即可看到效果,本次找的一台是65 和66结尾的客户端请求,以便 看到效果;
10.8.11.65请求:

10.8.11.66请求:

请求通过入口负载设备;通过cookie的值分配请求发往何处;此方案可行并得到验证;
线上可通过改造应用层给各客户端分配特定cookie,安全公司通过cookie按比例分配到不同IDC;并在并个IDC出现故障时;切换流量到正常IDC中!

影响:
当某IDC故障时,需要即时切换,并会丢失故障IDC登录用户的连接状态;

原文地址:http://blog.51cto.com/dyc2005/2299567

时间: 2024-08-29 03:46:59

nginx 基于cookie分流的相关文章

nginx根据cookie分流

nginx根据cookie分流众所周知,nginx可以根据url path进行分流,殊不知对于cookie分流也很强大,同时这也是我上篇提到的小流量实验的基础.二话不说,先看需求,两台服务器分别定义为apache001:192.168.1.1:8080apache002:192.168.1.2:8080默认服务器为:default:192.168.1.0:8080前端nginx服务器监听端口8080,需要根据cookie转发,查询的cookie的键(key)为abcdexpid,如果该cooki

基于cookie在nginx实现业务灰度发布

基于cookie在nginx实现业务灰度发布 背景 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式. 灰度发布可以保证整体系统的稳定, 在初始灰度的时候就可以发现.调整问题,以保证其影响度. 业务存在灰度发布的需求, 可以通过nginx+lua形式实现业务的灰度发布, 目前这一形式已在广平互动广告相关业务已经实现. 流程 用户使用帐号登录后,判断用户帐号是否在灰度发布的名单中,如果再则给用户的cookie中增加灰度发布标识,然后刷新页面. 当用户访问页面时,业务接入层的nginx方向代理会

nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)

目前的项目网站架构中使用了F5和nginx,F5用来做负载均衡,nginx只用作反向代理服务器.最近应客户的要求准备去掉F5,使用软负载.大家都知道nginx抗并发能力强,又可以做负载均衡,而且使用nginx对我们目前的网站架构不会有大的变动,所以首选方案是nginx.但问题来了,nginx在会话保持这方面比较弱,用ip_hash做会话保持有很大的缺陷,它是通过客户端ip来实现,根据访问ip的hash结果分配请求到后端的app服务器,负载不会很均匀.之前在一个小项目前中使用过这种方法,已经得到验

使用nginx sticky实现基于cookie的负载均衡

在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器.如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐. 如果浏览器不支持coo

使用nginx sticky实现基于cookie的负载均衡【转】

在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器.如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐. 如果浏览器不支持coo

分布式架构下的会话追踪实践【基于Cookie和Redis实现】

分布式架构下的会话追踪实践[基于Cookie和Redis实现] 博客分类: NoSQL/Redis/MongoDB session共享rediscookie分布式架构session 在单台Tomcat应用中,通常使用session保存用户的会话数据.面对高并发的场景,一台Tomcat难当大任,通常我们会使用Nginx在前端拦截用户请求,转发给后端的Tomcat服务器群组.在集群环境下,怎么才能做到session数据在多台Tomcat之间的共享呢? 当然我们可以在多台Tomcat之间进行sessi

基于cookie的session sticky lnmt实现

  架构图 环境说明 所有主机基于centos 6.5 后端主机:ha111  IP: 192.168.61.139 安装tomcat 后端主机:ha222  IP: 192.168.61.140 安装tomcat 负载均衡调度主机:rs1  IP: 192.168.61.131 安装nginx ha111主机配置  1. jdk安装,可以用sun或openjdk,这里用sun的   下载地址,下载linuxx64 rpm安装包即可http://www.oracle.com/technetwor

HAProxy基于cookie实现客户端会话保持

HAProxy基于cookie实现客户端会话保持 使用ip_hash时,如果有众多用户使用相同的公网地址去访问同一个服务时,由于这些用户所使用的公网IP都为同一个,HAproxy就会把他们调度到同一后端的服务器,由此可能造成后天的单台服务器的压力过大,因此需要其他的方法来进行调度.HAProxy可以实现插入一层cookie,当用户第一次访问会查看是否有cookie,如果没有就在响应报文中插入以程cookie返回给客户端,当用户再次访问就会根据cookie来调度请求.lvs和nginx无法实现 c

浏览器禁用Cookie,基于Cookie的会话跟踪机制失效的解决办法

当浏览器禁用Cookies时,基于Cookie的会话跟踪机制就会失效,解决办法是利用URL重写机制跟踪用户会话. 在使用URL重写机制的时候需要注意,为了保证会话跟踪的正确性,所有的链接和重定向语句中的URL都需要调用encodeURL()或encodeRedirectURL()方法进行编码.另外,由于附加在URL中的SessionID是动态产生的,对于每一个用户都是不同的,所欲对于静态页面的相互跳转,URL重写机制就无能为力了,但是,我们也可以通过将静态页面转换为动态页面来解决这个问题. 在w