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來訪問動態頁面:


分享到:


相關文章: