Nginx實現灰度發布的方法有哪些

方式一:通過調節負載均衡權重

??????? 負載均衡 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。

??????? 負載均衡,英文名稱為load balance,其意思就是分攤到多個操作單元上進行執行,例如web服務器、ftp服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。

Nginx實現灰度發布的方法有哪些

簡單配置如下:

http?{? ??upstream?cluster?{? ????ip_hash;?#如果你的系統中沒有使用第三方緩存管理工具?,建議使用此方式 ????server?192.168.1.210:80?weight=5;? ????server?192.168.1.211:80?weight=3;? ????server?192.168.1.212:80?weight=1;? ??}? ?? ??server?{? ????listen?80;? ? ??location?/?{? ?? ??proxy_next_upstream???error?timeout; ??proxy_redirect?????off; ??proxy_set_header????host?$host; ??#proxy_set_header????x-real-ip?$remote_addr; ??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; ??proxy_pass?http://cluster;? ????}? ??}? }

這種方式灰度發布通過weight來實現,但是這種方式只適合修改節點的行為,而且要求應用都是一模一樣的,其實質作用是,節點增加或刪除之后,對負載能力的調節,最終目的是為了讓流量最終保持均衡。

方式二.使用nginx+lua實現web項目的灰度發布

location?/?{ ?content_by_lua?' ??????myip?=?ngx.req.get_headers()["x-real-ip"] ??????if?myip?==?nil?then ????????myip?=?ngx.req.get_headers()["x_forwarded_for"] ??????end ??????if?myip?==?nil?then ????????myip?=?ngx.var.remote_addr ??????end ??????if?myip?==?"公司出口ip"?then ????????ngx.exec("@client") ??????else ????????ngx.exec("@client_test") ??????end ????'; }?  location?@client{ ??proxy_next_upstream???error?timeout; ??proxy_redirect?????off; ??proxy_set_header????host?$host; ??#proxy_set_header????x-real-ip?$remote_addr; ??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; ??proxy_pass?http://client;  } location?@client_test{ ??proxy_next_upstream???error?timeout; ??proxy_redirect?????off; ??proxy_set_header????host?$host; ??#proxy_set_header????x-real-ip?$remote_addr; ??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; ??proxy_pass?http://client_test; }

由于使用了nginx+lua模塊,這種方式適合很多場景,非常強大,但是問題是你可能需要學習很多lua的語法。

?方式三.使用http頭信息判斷+權重(灰度值)

http請求傳輸過程中,會自動帶上user-agent,host,referer,Cookie等信息。我們只需要判斷ip地址段,用戶代理,cookie中的信息等。我們這里以cookie為例。

當然,這里需要解決兩個問題:

①首次訪問靜態頁面可能不會產生cookie

②我們需要通過代碼動態設置路由

③通過weight控制灰度值

我們可以通過一個例子來解決上述中的②與③的問題

upstream?tts_v6?{ ????server?192.168.3.81:5280?max_fails=1?fail_timeout=60; } upstream?tts_v7?{ ????server?192.168.3.81:5380?max_fails=1?fail_timeout=60; } upstream?default?{??#通過upstream?default?+?weight節點控制權重 ????server?192.168.3.81:5280?max_fails=1?fail_timeout=60?weight=5; ????server?192.168.3.81:5380?max_fails=1?fail_timeout=60?weight=1; } server?{ ????listen?80; ????server_name?test.taotaosou.com; ????access_log?logs/test.taotaosou.com.log?main?buffer=32k; ????#match?cookie ????set?$group?"default"; ????if?($http_cookie?~*?"tts_version_id=tts1"){?#動態控制路由 ????????set?$group?tts_v6; ????} ????if?($http_cookie?~*?"tts_version_id=tts2"){ ????????set?$group?tts_v7; ????} ????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; ????} ?}

對于問題①,我們可以在index頁面通過script來訪問動態頁面:

<script></script><script></script>

此外,我們還要在cookieinfo.php中判斷和生成cookie

<?php if(!session_id()) {  session_start(); } if(!isset($_cookie["tts_version_id"])) {  $cookievalue = $_server[&#39;server_port&#39;]==5280?"tts1":"tts2";  setcookie("tts_version_id", $cookievalue, time()+3600, "/"); } ?>

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享