nginx+lua+redis實現灰階發布_test

來源:互聯網
上載者:User

標籤:glib   roc   alt   拷貝   cookie   text   ade   emc   範圍   

nginx+lua+redis實現灰階發布:

灰階發布是指在黑白之間能夠平滑過渡的一種方式

AB test就是一種灰階發布方式,讓一部分使用者繼續用A,一部分使用者開始用B,如果使用者對B沒有什麼反對意見,那麼逐步擴大範圍,把所有使用者都遷移到B上面 來。灰階發布可以保證整體系統的穩定,在初始灰階的時候就可以發現、調整問題,以保證其影響度。

灰階發布可以保證應用系統的穩定,降低產品升級影響的使用者範圍;也可以按照一定的策略讓部分使用者提前參與產品測試,從而提早擷取到使用者的反饋,完善應用功能

原理:使用nginx做負載平衡和反向 Proxy,nginx內嵌lua模組,解析並執行lua編寫的指令碼邏輯,可以通過lua解析cookie以及訪問redis,而一些灰階發布分流的策略就是放在redis裡通過cookie關聯

執行過程:

  • 當使用者請求到達前段代理服務nginx,內嵌的lua模組解析nginx設定檔中的lua指令碼代碼
  • lua變數擷取到用戶端的ip地址,去查詢redis緩衝內是否有該建值,如果有傳回值執行@client_test,否則執行@client
  • location @client_test把請求轉寄給部屬了new版代碼伺服器,[email protected]把請求轉寄給部屬了normal版代碼的伺服器,[email protected]把請求轉寄給部屬了normal版本代碼的伺服器,伺服器返回結果。整個過程完成

安裝配置過程詳解:

  1. 安裝nginx
安裝依賴包:yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make pcre-develyum -y install gd gd2 gd-devel gd2-devel lua lua-develyum –y install memcached

下載lua模組、lua-memcache操作庫檔案和nginx包

wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gzwget https://github.com/chaoslawful/lua-nginx-module/archive/v0.8.5.tar.gzwget https://github.com/agentzh/lua-resty-memcached/archive/v0.11.tar.gzwget http://nginx.org/download/nginx-1.4.2.tar.gztar xvf nginx-1.4.2.tar.gzcd nginx-1.4.2/./configure --prefix=/soft/nginx/ --with-http_gzip_static_module --add-module=/root/ngx_devel_kit-0.2.18/  --add-module=/root/lua-nginx-module-0.8.5/makemake install

拷貝lua的memcached操作庫檔案

tar xvf v0.11.tar.gzcp -r lua-resty-memcached-0.11/lib/resty/ /usr/lib64/lua/5.1/

配置nginx

#vim /soft/nginx/conf/nginx.confworker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    proxy_next_upstream     error timeout;    proxy_redirect          off;    proxy_set_header        Host $host;    proxy_set_header        X-Real-IP $http_x_forwarded_for;    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;    client_max_body_size    100m;    client_body_buffer_size 256k;    proxy_connect_timeout   180;    proxy_send_timeout      180;    proxy_read_timeout      180;    proxy_buffer_size       8k;    proxy_buffers           8 64k;    proxy_busy_buffers_size 128k;    proxy_temp_file_write_size 128k;     upstream client {        server   192.168.200.29:80;    }    upstream client_test {        server   192.168.200.29:81;    }    server {        listen       80;        server_name  localhost;       location / {       content_by_lua ‘            clientIP = ngx.req.get_headers()["X-Real-IP"]            if clientIP == nil then                clientIP = ngx.req.get_headers()["x_forwarded_for"]            end            if clientIP == nil then                clientIP = ngx.var.remote_addr            end                local memcached = require "resty.memcached"                local memc, err = memcached:new()                if not memc then                    ngx.say("failed to instantiate memc: ", err)                    return                end                local ok, err = memc:connect("127.0.0.1", 11211)                if not ok then                    ngx.say("failed to connect: ", err)                    return                end                local res, flags, err = memc:get(clientIP)                if err then                    ngx.say("failed to get clientIP ", err)                    return                end                if  res == "1" then                    ngx.exec("@client_test")                    return                end                 ngx.exec("@client")                              ‘;       }       location @client{           proxy_pass http://client;       }       location @client_test{           proxy_pass http://client_test;       }    location /hello {        default_type ‘text/plain‘;        content_by_lua ‘ngx.say("hello, lua")‘;    }    location = /50x.html {        root   html;    }   }}

檢測設定檔:

/usr/local/nginx/sbin/nginx -t

出現ok顯示成功

啟動nginx

/usr/local/nginx/sbin/nginx

啟動memchaed服務

chkconfig --level 2345 memcached on

/etc/init.d/memcached start|stop

 

 

測試lua模組是否運行正常

telnet localhost 11211Trying ::1...Connected to localhost.Escape character is ‘^]‘.set 192.168.68.211 0 3600 1STOREDget 192.168.68.211VALUE 192.168.68.211 9 1ENDquit

注意:

set後第一個值為key值。

192.168.68.211這是key值是需要灰階測試的IP地址;

0 表示一個跟該key有關的自訂資料;

3600 表示該key值的有效時間;

1 表示key所對應的value值的位元組數。

 

下面訪問Nginx,效果符合預期,我的IP已經在memcached中儲存值,所以請求轉寄給執行灰階測試代碼的主機。

訪問http://測試伺服器ip地址/hello  如果顯示lua表示安裝成功

 

在另一台測試機(這裡是192.168.200.29)設定兩個虛擬機器主機,一個用80連接埠是執行正常代碼,一個是81連接埠執行灰階測試代碼。

在memcached中以你的客戶機IP地址為key,value值為1。這裡我的IP是192.168.68.211.

 

 

從memcached刪除我的主機IP值。

再次請求Nginx,請求轉寄給執行正常代碼內容的主機。

整個配置並不複雜,整個判斷過程對服務的影響非常小。如果需要使用這個系統最好自己看看lua指令碼。

nginx+lua+redis實現灰階發布_test

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.