nginx 基於cookie分流

1、概述

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

圖中的高可用負載既能夠是單個機房的,也能夠是多個機房的入口;下面的IDCA ,IDCB等機房,既能夠是具體的web,也能夠是多個機房;nginx

功能實現:
nginx商業版自帶的cookie分配默認是經過客戶端攜帶的cookie作hash分配到各後端;這裏是經過應用層給客戶端分配cookie並導向到指定後端;實現過程以下:
應用程序給客戶端分配生成特定cookie鍵值,如ickey=」yunhnagweb201801」,安全公司或高可用負載設備經過匹配cookie值,將流量分配到不一樣的IDC機房;鍵值以01結尾分配到IDCA;鍵值以02結尾分配到IDCB;web

2、測試

本次測試因爲沒有應用層分配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上;redis

配置
入口負載設備 nginx配置後端

[root@10.8.11.203 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內容加以區別;cookie

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內容:ide

[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>

3、測試效果

因爲客戶端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登陸用戶的鏈接狀態;

相關文章
相關標籤/搜索