Nginx生產環境最佳實踐之配置灰度環境

在這里插入圖片描述

你好呀,我是趙興晨,文科程序員。

下面的內容可以說是干貨滿滿建議先收藏再慢慢細品。

今天,我想與大家深入探討一個我們日常工作中不可或缺的話題——灰度環境。你是否在工作中使用過灰度環境?如果是,你的使用體驗如何?

俗話說得好:“不想成為架構師的Java程序員,不是一個好的SRE。(Site Reliability Engineer,即網站可靠性工程師)”這句話看似是一句玩笑話,但是它道出了一個程序員不斷追求技術深度與廣度的重要性。

在日常工作中,我們不僅要精通Java,還需要掌握運維和前端技術等多方面技能,而灰度環境的構建與管理正是其中的關鍵一環。

那么什么是灰度發布呢?

灰度發布是指在黑與白之間,能夠平滑過渡的一種發布方式。AB Test 就是一種灰度發布。 讓一部分用戶繼續使用環境A, 一部分用戶開始使用環境B,如果用戶對環境B沒有什么反對意見,那么逐步擴大范圍,把所有用戶都遷移到環境B上面來。灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現問題并及時調整,以保證其小范圍的影響度。

常見的灰度發布的方式

Nginx + Lua 實現灰度

這個說來話長,涉及到的內容太多,我在做技術選型的時候直接給這個方案pass掉了,這里就不做過多贅述。

基于 cookie 實現灰度

根據查詢cookie鍵為version的值,如果cookie值為gray,則轉發到linux_gray(灰度環境),cookie的值都不匹配的情況下,默認走linux_prod(生產環境)。

舉個例子:

兩個后端應用服務器分別定義為

# 灰度環境
linux_gray 10.0.0.60:10001# 生產環境
linux_prod 10.0.0.61:10001

使用map指令實現

在Nginx里面配置一個映射,$COOKIE_version 可以解析出Cookie 里面的 version 字段, $group 是一個變量, {} 里面是映射規則。

如果一個 version為gray 的用戶來訪問,$group 就等于linux_gray。在 server 里面使用就會代理到http://linux_gray 上。

否則,$group 就等于 linux_prod。在 server 里面使用就會代理到 http://linux_prod 上。Cookie 值都不匹配的情況下默認走 linux_prod 所對應的服務器。

以下👇是基于cokkie實現灰度的Nginx配置參考。

# 灰度環境
upstream  linux_gray {server    10.0.0.60:10001;
}# 生產環境
upstream  linux_prod {server    10.0.0.61:10001;
}# 后端服務
map $COOKIE_version $group {~*gray$ linux_gray;default linux_prod;
}# 前端靜態資源
map $COOKIE_version $grouppath {~*gray$ /web/staticGray/;default /web/staticProd/;
}server {listen 80;server_name linuxtest.com;access_log logs/linux.log main;# 后端服務location /server/test { # 進入灰度環境增加響應標識if ( $COOKIE_version ~* "gray$" ){add_header version gray always;}# rewrite解決 /test丟失問題rewrite ^/server/(.*) /$1 break;proxy_pass http://$group;}# 靜態資源location /serverweb {if ( $COOKIE_version ~* "gray$" ){add_header version gray always;}alias $grouppath;try_files $uri $uri/ /index.html;index index.html;}
}

根據用戶訪問的IP 實現灰度

nginx 對用戶的IP進行分流,將符合分流規則的用戶IP指到linux_gray(灰度環境),其余的指到 linux_prod(生產環境)

舉個例子:

兩個后端應用服務器分別定義為

# 灰度環境
linux_gray 10.0.0.60:10001# 生產環境
linux_prod 10.0.0.61:10001

跟cookie的差不多 也是使用map指令實現的,但需要獲取用戶的真實IP地址。

# 灰度環境
upstream  linux_gray {server    10.0.0.60:10001;
}# 生產環境
upstream  linux_prod {server    10.0.0.61:10001;
}# 后端服務
map $remote_addr $group {# 只允許用戶ip為10.0.0.75的用戶訪問灰度環境# 也可以設置成ip段 ~*^10\.0\.0\.(.*?)$~10.0.0.75 linux_gray;default linux_prod;
}# 前端靜態資源
map $remote_addr $grouppath {~10.0.0.75 /web/staticGray/;default /web/staticProd/;
}server {listen 80;server_name linuxtest.com;access_log logs/linux.log main;# 獲取用戶真實IPset_real_ip_from 127.0.0.1; # 真實服務器上一級代理的IP地址或者IP段,可以寫多行real_ip_header  X-Forwarded-For; # 從哪個header頭檢索出要的IP地址real_ip_recursive on; #遞歸排除IP地址,ip串從右到左開始排除set_real_ip_from里面出現的IP,如果出現了未出現這些ip段的IP,那么這個IP將被認為是用戶的IP# 后端服務location /server/test { # 進入灰度環境增加響應標識if ( $remote_addr ~* "10.0.0.75" ){add_header version gray always;}# rewrite解決 /test丟失問題rewrite ^/server/(.*) /$1 break;proxy_pass http://$group;}# 靜態資源location /serverweb {if ( $remote_addr ~* "10.0.0.75" ){add_header version gray always;}alias $grouppath;try_files $uri $uri/ /index.html;index index.html;}# 測試用戶訪問獲取用戶IPlocation /iptest {return 200 $remote_addr;}
}

上面這三種方案就是當時我做技術選型能夠搜集到的方案, 基于cookie實現灰度會出現好多問題,不太符合現有系統:

1、獲取cookie的時機問題,如默認用戶第一次進入到系統,需要判斷該用戶是否是灰度用戶,如果是灰度用戶下次請求會攜帶cookie,這樣前端靜態資源第一次進入到的是生產環境,需要重新刷新才能進入到灰度環境,對用戶不太友好。

2、如果灰度環境出現問題,需要回滾,回滾后無法保證用戶實時切換回生產環境,因為只有用戶登錄的時候才會確定該用戶是否是灰度用戶,如果灰度用戶在使用中,沒有重新登錄,會一直在灰度環境,除非強制將用戶踢下線,提示用戶重新登錄,這樣對用戶體驗也不友好。

所以基于以上的兩個問題,最終決定選用基于用戶IP來實現灰度發布。

基于用戶IP實現灰度的核心所在是獲取用戶真實IP,并根據用戶的真實IP特征來決定進入灰度的規則,IP規則可以是IP段。

以上就是我個人的一些思考,如果有不正確的地方,歡迎大家在文章底部留言指正。

如果你是第一次接觸Centos7、Nginx建議看一下我之前的文章:

掃描下方👇二維碼關注我,可查看相關知識點干貨!

最后,我想說的是:點贊和分享不僅僅是一種美德,更是對未來美好生活的投資。愿每一個點在看的朋友,未來都能收獲滿滿的幸福和成功!

你好,我是趙興晨,一名文科程序員。我期待在文章下方看到你的留言,讓我們一起交流,共同進步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12431.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI圖像生成-基本步驟

模型板塊 1、新建采樣器:新建節點-》采樣器-》K采樣器 2、拖動模型節點后放開,選擇checkpoint加載器(簡易),模型新建成功 提示詞板塊 1、拖動正面條件節點后放開,選擇CLIP文本編碼器,模型新建…

mysql 一次刪除多個備份表

show tables時,發現備份的表有點多,想要一個sql就刪除 總不能drop table xx ; 寫多次吧。 方式一 1.生成刪除某個數據庫下所有的表SQL -- 查詢構建批量刪除表語句(根據數據庫名稱) select concat(drop table , TABLE_NAME, ;)…

代碼隨想錄算法訓練營第39天|● 62.不同路徑 ● 63. 不同路徑 II

62. 不同路徑 遞歸棧很酷 但超時 class Solution:def uniquePaths(self, m: int, n: int) -> int:if m1 or n1:return 1return self.uniquePaths(m-1,n)self.uniquePaths(m,n-1) 逐行dp class Solution:def uniquePaths(self, m: int, n: int) -> int:dp[1]*nfor j in…

FSMC的NOR Flash/PSRAM 控制器功能介紹(STM32F4)

目錄 概述 1 FSMC支持的類型 1.1 信號類型概述 1.2 FSMC的應用 2 外部存儲器接口信號 2.1 I/O NOR Flash 2.2 PSRAM/SRAM 3 支持的存儲器和事務 4 通用時序規則 5 NOR Flash/PSRAM 控制器異步事務 5.1 模式 1 - SRAM/PSRAM (CRAM) 5.2 模式 A - SRAM/PSRAM (CRAM…

Golang | Leetcode Golang題解之第90題子集II

題目&#xff1a; 題解&#xff1a; func subsetsWithDup(nums []int) (ans [][]int) {sort.Ints(nums)n : len(nums) outer:for mask : 0; mask < 1<<n; mask {t : []int{}for i, v : range nums {if mask>>i&1 > 0 {if i > 0 && mask>&…

[HUBUCTF 2022 新生賽]ezsql

測試無結果 掃描目錄&#xff0c;得到源碼 找到注入點 思路&#xff1a;更新資料的時候可以同時更新所有密碼 我們需要知道密碼的字段名 爆庫 nicknameasdf&age111,description(select database())#&descriptionaaa&token31ad6e5a2534a91ed634aca0b27c14a9 爆表…

運維別卷系列 - 云原生監控平臺 之 08.prometheus grafana 實踐

文章目錄 [toc]部署 Grafana準備配置文件grafana.iniprovisioning/datasources/prometheus.yamlprovisioning/dashboards/dashboards.yamlprovisioning/dashboards/views 創建 svc創建 deployment Grafana 是一個圖形化界面&#xff0c;配置 Prometheus 作為數據源&#xff0c;…

網絡庫-POCO介紹

1.簡介 POCO C Libraries 提供一套 C 的類庫用以開發基于網絡的可移植的應用程序&#xff0c;它提供了許多模塊&#xff0c;包括網絡編程、文件系統訪問、線程和并發、數據庫訪問、XML處理、配置管理、日志記錄等功能。Poco庫的設計目標是易于使用、高度可定制和可擴展。 包含…

Postman的簡介,安裝,注冊。

一、安裝 1.Chrome應用商品搜索Postman安裝。(翻墻) 2.客戶端安裝官網地址:https://www.postman.com/downloads/ 3.Postman的注冊和登錄。 4.Postman的界面介紹 Home主頁 workspaces 工作空間 Collections 集合&#xff0c;項目集合。 Apis api文檔 EnViromments …

Oracle如何加密解密sha256

在Oracle數據庫中&#xff0c;您可以使用內建的加密函數或者通過PL/SQL擴展來實現SHA-256加密。但請注意&#xff0c;SHA-256是一個哈希算法&#xff0c;它主要用于生成數據的哈希值&#xff0c;而不是用于加密和解密數據。哈希算法是單向的&#xff0c;即它只能從原始數據生成…

基于MSWA相繼加權平均的交通流量分配算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MSWA相繼加權平均的交通流量分配算法matlab仿真.如圖所示交通網絡中&#xff0c;包含6個節點、11各路段、9個OD對。經枚舉可得每個OD對間存在3條無折返有效路…

elasticsearch使用Ngram實現任意位數手機號搜索

文章目錄 Ngram自定義分詞案例實戰問題拆解 Ngram分詞器定義Ngram分詞定義Ngram分詞示例Ngram分詞應用場景 Ngram分詞實戰 Ngram自定義分詞案例 當對keyword類型的字段進行高亮查詢時&#xff0c;若值為123asd456&#xff0c;查詢sd4&#xff0c;則高亮結果是&#xff1c;em&a…

python項目連接數據庫(mysql,postgresql)

在實際開發過程中&#xff0c;對于項目的數據查詢和數據統計&#xff0c;那python是相當好用&#xff0c;相信很多后端工程師是java語言入門的&#xff0c;對于python呢是有一點陌生&#xff0c;我自己也是&#xff0c;不過當你操作起來呢發現其實還是蠻好上手的。以下就是一些…

C語言基礎-標準庫函數

C語言的標準庫函數是由C語言標準庫&#xff08;如C99、C11等&#xff09;提供的一系列預定義函數&#xff0c;這些函數通常用于執行常見的編程任務&#xff0c;如字符串操作、內存管理、數學計算、文件操作等。通過使用標準庫函數&#xff0c;程序員可以更加高效地編寫C語言程序…

在ubuntu上創建WiFi熱點

要在 wlan0 無線網卡上發射熱點&#xff08;即創建 WiFi 熱點&#xff09;&#xff0c;可以使用 hostapd 和 dnsmasq 這兩個工具。hostapd 用于創建熱點&#xff0c;而 dnsmasq 用于提供 DHCP 和 DNS 服務&#xff0c;以便連接到熱點的設備可以獲取 IP 地址并訪問互聯網。 下面…

【AI】DeepStream(03):deepstream_test1_app

1、簡介 deepstream-test1:演示各種 DeepStream 插件構建 GStreamer 管道。從文件中獲取視頻、解碼、批處理,然后進行對象檢測,最后在屏幕上渲染框。 源碼路徑:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1 先看下效果 2、編譯 1)…

Qt將ffmpeg解碼出來的數據保存為文件

具體代碼如下: QImage image(m_pAVPicture.data[0], m_videoWidth, m_videoHeight, QImage::Format_RGB888);QString currrentTime = QDateTime::currentDateTime().

重寫muduo網絡庫之調用流程的梳理

目錄 1、流程敘述 2、我們看看TcpServer的構造都做了什么&#xff1f; 3、start() 3.1 開啟loop 3.2 連接的建立 3.3 數據的收發 4、連接的關閉 muduo網絡庫各組件梳理見此博客 重寫muduo庫之組件梳理 1、流程敘述 首先&#xff0c;我們是怎么使用的&#xff1f; 1.定…

MTP協議中文翻譯第一二三四章

1 簡介 ? 媒體傳輸協議(MTP)是一種協議,旨在與瞬態存儲設備進行內容交換以及命令和控制。它是作為PTP或圖像傳輸協議的擴展而開發的,主要針對便攜式數碼相機媒體播放器和手機。 1.1 目標 ? 這個協議的主要目的是促進具有瞬時連接性和顯著存儲容量的媒體設備之間的通信…

【iOS】工廠模式

文章目錄 前言設計模式的三大原則簡單工廠模式工廠方法模式抽象工廠模式關于三兄弟的升級與降級注意 前言 上文講完了iOS的架構模式&#xff0c;接下來聊一聊設計模式&#xff0c;設計模式有許多&#xff0c;主要介紹一下工廠模式 設計模式的三大原則 S 單一職責原則 告訴我…