使用Nginx實(shí)現(xiàn)Web應(yīng)用灰度發(fā)布

閱讀原文: 使用Nginx實(shí)現(xiàn)Web應(yīng)用灰度發(fā)布

灰度發(fā)布是指在黑與白之間糙捺,能夠?qū)崿F(xiàn)應(yīng)用系統(tǒng)平滑過(guò)渡的一種獨(dú)特的發(fā)布方式笙隙。A/B測(cè)試就是一種灰度發(fā)布方式竟痰,讓一部分用戶繼續(xù)用A,一部分用戶開(kāi)始用B铅檩,如果用戶對(duì)B沒(méi)有什么反對(duì)意見(jiàn)莽鸿,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來(lái)兔沃。

灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定乒疏,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題窍侧,以保證其影響度转绷。

灰度發(fā)布常見(jiàn)一般有三種方式:

  • Nginx+LUA方式
  • 根據(jù)Cookie實(shí)現(xiàn)灰度發(fā)布
  • 根據(jù)源IP實(shí)現(xiàn)灰度發(fā)布

本文主要將講解根據(jù)Cookie和源IP這兩種方式實(shí)現(xiàn)簡(jiǎn)單的灰度發(fā)布,Nginx+LUA這種方式涉及內(nèi)容太多就不再本文展開(kāi)了

A/B測(cè)試流程


Nginx根據(jù)Cookie實(shí)現(xiàn)灰度發(fā)布

根據(jù)Cookie查詢Cookie鍵為version的值,如果該Cookie值為V1則轉(zhuǎn)發(fā)到hilinux_01其骄,為V2則轉(zhuǎn)發(fā)到hilinux_02扯旷。Cookie值都不匹配的情況下默認(rèn)走hilinux_01所對(duì)應(yīng)的服務(wù)器拯爽。

兩臺(tái)服務(wù)器分別定義為:

hilinux_01  192.168.1.100:8080
hilinux_02  192.168.1.200:8080

用IF指令實(shí)現(xiàn)

upstream hilinux_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
    server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

server {
  listen 80;
  server_name  www.akhack.com;
  access_log  logs/www.akhack.com.log  main;

  #match cookie
  set $group "default";
    if ($http_cookie ~* "version=V1"){
        set $group hilinux_01;
    }

    if ($http_cookie ~* "version=V2"){
        set $group hilinux_02;
    }

  location / {                       
    proxy_pass http://$group;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    index  index.html index.htm;
  }
 }

用MAP指令實(shí)現(xiàn)

在Nginx里面配置一個(gè)映射,$COOKIE_version可以解析出Cookie里面的version字段毯炮。$group是一個(gè)變量桃煎,{}里面是映射規(guī)則。

如果一個(gè)versionV1的用戶來(lái)訪問(wèn)大刊,$group就等于hilinux_01为迈。在server里面使用就會(huì)代理到http://hilinux_01上。versionV2的用戶來(lái)訪問(wèn)缺菌,$group就等于hilinux_02葫辐。在server里面使用就會(huì)代理到http://hilinux_02上。Cookie值都不匹配的情況下默認(rèn)走hilinux_01所對(duì)應(yīng)的服務(wù)器

upstream hilinux_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
    server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

map $COOKIE_version $group {
  ~*V1$ hilinux_01;
  ~*V2$ hilinux_02;
  default default;
}

server {
  listen 80;
  server_name  www.hi-linux.com;
  access_log  logs/www.hi-linux.com.log  main;

  location / {                       
    proxy_pass http://$group;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    index  index.html index.htm;
  }
 }

Nginx根據(jù)源IP實(shí)現(xiàn)灰度發(fā)布

如果是內(nèi)部IP伴郁,則反向代理到hilinux_02(預(yù)發(fā)布環(huán)境)耿战;如果不是則反向代理到hilinux_01(生產(chǎn)環(huán)境)

upstream hilinux_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
    server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

server {
  listen 80;
  server_name  www.hi-linux.com;
  access_log  logs/www.hi-linux.com.log  main;

  set $group default;
  if ($remote_addr ~ "211.118.119.11") {
      set $group hilinux_02;
  }

 location / {                       
    proxy_pass http://$group;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    index  index.html index.htm;
  }
}

如果你只有單臺(tái)服務(wù)器,可以根據(jù)不同的IP設(shè)置不同的網(wǎng)站根目錄來(lái)達(dá)到相同的目的焊傅。

server {
  listen 80;
  server_name  www.hi-linux.com;
  access_log  logs/www.hi-linux.com.log  main;

  set $rootdir "/var/www/html";
    if ($remote_addr ~ "211.118.119.11") {
       set $rootdir "/var/www/test";
    }

    location / {
      root $rootdir;
    }
}

ABTestingGateway項(xiàng)目

ABTestingGateway是新浪開(kāi)源的一個(gè)動(dòng)態(tài)路由系統(tǒng)剂陡。ABTestingGateway是一個(gè)可以動(dòng)態(tài)設(shè)置分流策略的灰度發(fā)布系統(tǒng)狈涮,工作在7層薯嗤,基于nginx和ngx-lua開(kāi)發(fā),使用redis作為分流策略數(shù)據(jù)庫(kù)玻褪,可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)度功能.

項(xiàng)目地址:ABTestingGateway

閱讀原文: 使用Nginx實(shí)現(xiàn)Web應(yīng)用灰度發(fā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窟社,隨后出現(xiàn)的幾起案子灿里,更是在濱河造成了極大的恐慌,老刑警劉巖色鸳,帶你破解...
    沈念sama閱讀 211,496評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赊抖,警方通過(guò)查閱死者的電腦和手機(jī)房匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門弦追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人零远,你說(shuō)我怎么就攤上這事∥诚颍” “怎么了逾条?”我有些...
    開(kāi)封第一講書人閱讀 157,091評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵薇缅,是天一觀的道長(zhǎng)汤徽。 經(jīng)常有香客問(wèn)我谒府,道長(zhǎng),這世上最難降的妖魔是什么壳鹤? 我笑而不...
    開(kāi)封第一講書人閱讀 56,458評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮匿值,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绊谭。我一直安慰自己,他們只是感情好趟大,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布叽讳。 她就那樣靜靜地躺著,像睡著了一般涤妒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿储,一...
    開(kāi)封第一講書人閱讀 49,802評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死助赞,一個(gè)胖子當(dāng)著我的面吹牛买羞,可吹牛的內(nèi)容都是我干的袁勺。 我是一名探鬼主播雹食,決...
    沈念sama閱讀 38,945評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼期丰!你這毒婦竟也來(lái)了群叶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,709評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钝荡,失蹤者是張志新(化名)和其女友劉穎埠通,沒(méi)想到半個(gè)月后舞蔽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朵栖,經(jīng)...
    沈念sama閱讀 44,158評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡件舵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評(píng)論 2 327
  • 正文 我和宋清朗相戀三年吃沪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什猖。...
    茶點(diǎn)故事閱讀 38,637評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡票彪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出不狮,到底是詐尸還是另有隱情降铸,我是刑警寧澤,帶...
    沈念sama閱讀 34,300評(píng)論 4 329
  • 正文 年R本政府宣布摇零,位于F島的核電站推掸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驻仅。R本人自食惡果不足惜谅畅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雾家。 院中可真熱鬧铃彰,春花似錦、人聲如沸芯咧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,744評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敬飒。三九已至邪铲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无拗,已是汗流浹背带到。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,982評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留英染,地道東北人揽惹。 一個(gè)月前我還...
    沈念sama閱讀 46,344評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像四康,于是被迫代替她去往敵國(guó)和親搪搏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容