nginx 基於cookie分流

一、概述

爲了保障公司業務不受單點機房故障影響;需要做機房雙活;把流量分別導向不同的IDC機房,按比例分配;方法有多種,本文所講的就是模擬按客戶端不同cookie分流實現;nginx plug+自帶cookie分配,就是商業版支持,對於 大多的創業公司用的是源生的開源nginx則可以通過應用層給不同的客戶端分配cookie值來導向到不同的IDC機房;這麼說容易理解點;本文就是通過模擬不同的客戶端cookie導向到不同的IDC機房;
架構如下:
nginx 基於cookie分流

圖中的高可用負載既可以是單個機房的,也可以是多個機房的入口;下面的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):

[root@test-web_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內容:

[root@test-web_redis-144 conf.d]# cat /home/dongyc/web144/index.html 
<h1>test web web144 form IDCA.</h1>

Web2(IDCB):

[root@test-web_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內容:

[root@test-web_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請求:
nginx 基於cookie分流

10.8.11.66請求:
nginx 基於cookie分流

請求通過入口負載設備;通過cookie的值分配請求發往何處;此方案可行並得到驗證;
線上可通過改造應用層給各客戶端分配特定cookie,安全公司通過cookie按比例分配到不同IDC;並在並個IDC出現故障時;切換流量到正常IDC中!

影響:
當某IDC故障時,需要即時切換,並會丟失故障IDC登錄用戶的連接狀態;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章