nginx log 正則 Nginx多策略流量分發

2021-10-12 18:49:50 字數 1499 閱讀 4300

在實際生產環境中,流量分發有很多情況,下面主要講講以下兩種流量分發場景:

新版本上線,為了保證新版本穩定性,需要用線上的流量的引入,對新版本進行真實流量測試。如果新版本上線有問題,為降低影響範圍,我們對流量的引入應該為從小到大的策略。

現如今是移動端的時代,而移動端和pc端的裝置的不同,需要對移動端和pc的流量進行不同的處理,同時可以針對兩種裝置的不同需求可以單獨公升級,可控性強,且架構靈活。

針對以上兩種場景,nginx做為強大的web伺服器,通過簡單的配置來就可以滿足我們的需求,下面我們就開始實戰:

nginx version: nginx/1.16.1os version: centos 7
完成以上需求,主要依賴於nginx的兩個模組:

按比例分配流量,通過ngx_http_split_clients_module模組實現,該模組可通過客戶端的某些屬性對客戶端通過hash演算法按比例分配,這些屬性包括客戶端ip等,通過hash函式,將不同客戶端ip進行比例分配,從而可以將部分流量引入新版本服務中,下面看一下具體配置:

在配置中,我們利用split_clients指令對$remote_addr變數進行hash運算,並按1:1比例隨機地將$version的值賦予v1和v2,*表示剩餘的比例,即1-50%,這樣就可以通過$version的值進行流量分配,具體可看nginx配置,已有注釋。可以看到在版本**時,在proxy_pass**路徑最後加了/,是為了把版本路徑(v1|v2)去掉,然後再進行**,可以保持原有的請求uri路徑不變,此處算是乙個小技巧。

實際效果:

ngx_http_map_module模組可通過客戶端屬性按一定規則匹配對映為新的變數,我們可以對客戶端的ua進行正則匹配來區分流量,從而進行流量分發,下面是nginx配置檔案示例:

在nginx配置中,我們可以看到使用map指令,對客戶端的ua進行正則匹配,一旦匹配成功,$uatype將被分配為mobile,並根據此變數的值進行**,剩下未匹配的由default 指定,此時$uatype為nomobile,從而**到pc端服務,同時在**到後端時,同樣在proxy_pass後加/,也是為了去掉nomobile和mobile字首。在使用map的正則匹配時,代表區分大小寫的匹配,*則為不區分大小寫。

實際效果:

5、總結

以上只是列舉典型的流量分發方式,我們可以根據$http_name或者$arg_name來定製化需求,$http_name獲取自定義頭部,$arg_name獲取自定義uri引數,這就給予我們更多的可能,比如我們可以再使用者登入後,新增自定義頭部,使用自定義頭部,map指令進行流量拆分,更多的用途需要我們自行發揮想象進行探索。

歷史文章:

什麼是資料湖?

什麼是linux的daemon程序?

lsof命令是什麼?

nginx正則規則

語法規則 location uri 模式 含義location uri 表示精確匹配,只有完全匹配上才能生效 location uri 開頭對url路徑進行字首匹配,並且在正則之前。location pattern 開頭表示區分大小寫的正則匹配 location pattern 開頭表示不區分大小寫...

Nginx正則相關

為區分大小寫字母的匹配。不區分大小寫字母的匹配 匹配aa的同時也匹配aa aa aa 與 相反,表示區分大小寫的不匹配 與 相反,表示不分割槽大小寫的不匹配 匹配除換行符以外的任意字元 w 匹配字母 數字 下劃線或漢字 s 匹配任意的空白符 d 匹配數字 b 匹配單詞的開始或結束 匹配字串的開始 匹...

nginx正則說明

nginx正則說明 分類 nginx 2012 08 09 收藏 舉報 nginx正規表示式firefox 表示精確的查詢位址,如location 它只會匹配uri為 的請求,如果請求為 index.html,將查詢另外的location,而不會匹配這個,當然可以寫兩個location,locati...