Nginx 實現(xiàn)灰度發(fā)布的三種方法總結(jié)
Nginx 實現(xiàn)灰度發(fā)布的三種方法總結(jié)
灰度發(fā)布的主要原理是訪問路由的控制,重點是保證每次訪問的是同一個節(jié)點。
方式一:通過調(diào)節(jié)負載均衡權(quán)重
負載均衡 建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價有效透明的方法擴展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。

簡單配置如下:
http {
upstream cluster {
ip_hash; #如果你的系統(tǒng)中沒有使用第三方緩存管理工具 ,建議使用此方式
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;
}
}
}
這種方式灰度發(fā)布通過weight來實現(xiàn),但是這種方式只適合修改節(jié)點的行為,而且要求應(yīng)用都是一模一樣的,其實質(zhì)作用是,節(jié)點增加或刪除之后,對負載能力的調(diào)節(jié),最終目的是為了讓流量最終保持均衡。
方式二.使用nginx+lua實現(xiàn)web項目的灰度發(fā)布
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模塊,這種方式適合很多場景,非常強大,但是問題是你可能需要學(xué)習很多l(xiāng)ua的語法。
方式三.使用http頭信息判斷+權(quán)重(灰度值)
http請求傳輸過程中,會自動帶上User-Agent,Host,Referer,Cookie等信息。我們只需要判斷ip地址段,用戶代理,Cookie中的信息等。我們這里以Cookie為例。
當然,這里需要解決兩個問題:
①首次訪問靜態(tài)頁面可能不會產(chǎn)生cookie
②我們需要通過代碼動態(tài)設(shè)置路由
③通過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節(jié)點控制權(quán)重
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"){ #動態(tài)控制路由
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來訪問動態(tài)頁面:
如
<script src="https://test.taotaosou.com/cookieinfo.php" /><script>
此外,我們還要在cookieinfo.php中判斷和生成cookie
<?php
if(!session_id())
{
session_start();
}
if(!isset($_COOKIE["tts_version_id"]))
{
$cookieValue = $_SERVER['SERVER_PORT']==5280?"tts1":"tts2";
setcookie("tts_version_id", $cookieValue, time()+3600, "/");
}
?>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
nginx將https協(xié)議反向代理到http協(xié)議請求上的實現(xiàn)
本文主要介紹了nginx將https協(xié)議反向代理到http協(xié)議請求上的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2023-10-10
Nginx代理Vue項目出現(xiàn)Invalid Host header問題及解決
在使用Nginx的upstream對Vue項目進行負載均衡時,如果代理地址無法訪問目標地址且頁面報錯InvalidHostheader(無效主機頭),可能是由于Vue項目的主機檢查配置導(dǎo)致的,解決方法是在Vue項目的webpack.dev.js文件中的devServer下添加disableHostCheck:true,跳過主機檢查2024-12-12
linux安裝nginx和前端部署vue項目全過程(實測react項目也可)
這篇文章主要介紹了如何將前端項目打包并部署到服務(wù)器上,包括使用nginx進行配置和啟動等步驟,文中通過代碼以及圖文介紹的非常詳細,需要的朋友可以參考下2024-11-11
Nginx代理導(dǎo)致請求頭某些內(nèi)容丟失的問題解決
本文主要介紹了在使用NGINX代理時請求頭中的下劃線被自動忽略的問題,通過兩種方法解決了這個問題,具有一定的參考價值,感興趣的可以了解一下2025-02-02
nginx服務(wù)器實現(xiàn)上傳下載文件的實例代碼
這篇文章主要介紹了nginx服務(wù)器實現(xiàn)上傳下載文件的實例代碼,本文通過代碼給大家介紹的非常詳細,對大家的學(xué)習或工作有一定的幫助,需要的朋友可以參考下2024-02-02

