Nginx Mirror模塊實(shí)現(xiàn)流量鏡像的示例代碼
在微服務(wù)與持續(xù)交付場(chǎng)景中,流量鏡像(Traffic Mirroring) 是評(píng)估新版本、壓測(cè)與采集數(shù)據(jù)的重要手段。本文講解如何使用 Nginx 原生的 mirror 模塊實(shí)現(xiàn)流量鏡像,包含原理、配置示例、按條件/按比例鏡像以及生產(chǎn)注意事項(xiàng)。
1、什么是流量鏡像
流量鏡像 是指在真實(shí)用戶訪問(wèn)業(yè)務(wù)系統(tǒng)時(shí),將請(qǐng)求同時(shí)復(fù)制一份,異步地發(fā)送到另一個(gè)后端系統(tǒng)進(jìn)行處理,而不影響主請(qǐng)求的響應(yīng)。
簡(jiǎn)單理解就是:
用戶 → A 系統(tǒng)(主處理)
同時(shí) → B 系統(tǒng)(鏡像分析)
鏡像請(qǐng)求不會(huì)返回給用戶,也不會(huì)影響原業(yè)務(wù)的性能。
特性 | 說(shuō)明 |
|---|---|
異步非阻塞 | 不影響主業(yè)務(wù)延遲 |
簡(jiǎn)潔配置 | 內(nèi)置原生模塊,無(wú)需第三方插件 |
靈活控制 | 支持路徑、變量、比例條件 |
場(chǎng)景廣泛 | 灰度發(fā)布、壓測(cè)驗(yàn)證、安全檢測(cè)等 |
2、常見(jiàn)應(yīng)用場(chǎng)景
場(chǎng)景 | 說(shuō)明 |
|---|---|
?? 灰度驗(yàn)證 | 將部分真實(shí)流量鏡像到新版本系統(tǒng),用于功能驗(yàn)證 |
?? 性能測(cè)試 | 在真實(shí)環(huán)境下評(píng)估新服務(wù)性能 |
?? 日志審計(jì) | 將請(qǐng)求內(nèi)容鏡像至日志采集系統(tǒng) |
??? 安全分析 | 將請(qǐng)求鏡像到安全檢測(cè)系統(tǒng)(防攻擊 / 敏感檢測(cè)) |
3、Nginx Mirror 模塊簡(jiǎn)介
ngx_http_mirror_module 模塊從 Nginx 1.13.4 起正式引入,支持 HTTP 請(qǐng)求級(jí)別的鏡像。 該模塊默認(rèn)已集成于官方 Nginx 發(fā)行版中,無(wú)需單獨(dú)編譯。
主要指令
指令 | 作用 | 位置 |
|---|---|---|
| mirror | 指定鏡像請(qǐng)求目標(biāo)(location 或 URL) | http 、server、location |
| mirror_request_body | 是否復(fù)制請(qǐng)求體(body) | 同上 |
4、Nginx Mirror 工作原理

Nginx 在收到真實(shí)請(qǐng)求時(shí):
- 正常轉(zhuǎn)發(fā)到主后端;
- 同時(shí)異步發(fā)出一個(gè)鏡像請(qǐng)求到指定目標(biāo);
- 鏡像請(qǐng)求的結(jié)果會(huì)被丟棄,不影響主請(qǐng)求。
5、基本配置示例
http {
server {
listen80;
location/ {
proxy_passhttp://main_backend;
# 開(kāi)啟流量鏡像
mirror/mirror_backend;
mirror_request_bodyon;
}
# 鏡像請(qǐng)求處理邏輯
location = /mirror_backend {
internal; # 僅供內(nèi)部調(diào)用
proxy_passhttp://test_backend;
}
}
}說(shuō)明:
mirror:指定鏡像請(qǐng)求目標(biāo);mirror_request_body on:復(fù)制請(qǐng)求體;internal:防止外部直接訪問(wèn)鏡像接口;- 鏡像請(qǐng)求是異步執(zhí)行的,不影響主請(qǐng)求的響應(yīng)速度。
6、進(jìn)階用法:多目標(biāo)鏡像
支持將同一請(qǐng)求復(fù)制到多個(gè)后端系統(tǒng):
location/ {
proxy_passhttp://main_backend;
mirror/mirror_a;
mirror/mirror_b;
mirror_request_bodyon;
}
location = /mirror_a {
internal;
proxy_passhttp://gray_backend;
}
location = /mirror_b {
internal;
proxy_passhttp://log_collector;
}7、按條件鏡像(灰度/比例控制)
在生產(chǎn)環(huán)境中,我們通常希望按條件或比例鏡像,而不是全部請(qǐng)求。
7.1 按請(qǐng)求路徑鏡像
location/api/ {
proxy_passhttp://main_backend;
if($request_uri ~ "^/api/test") {
mirror/mirror_backend;
}
}7.2 按規(guī)則控制(使用map)
map $request_uri $enable_mirror {
default0;
~^/api/test1;
}
location/api/ {
proxy_passhttp://main_backend;
mirror/mirror_backendif=$enable_mirror;
}7.3 按比例隨機(jī)鏡像(灰度場(chǎng)景)
map $request_id $enable_mirror {
default0;
~^[0-9]*[13579]$1; # 模擬約 50% 流量
}
location/ {
proxy_passhttp://main_backend;
mirror/mirror_backendif=$enable_mirror;
}8、性能與注意事項(xiàng)
項(xiàng)目 | 說(shuō)明 |
|---|---|
?? 性能 | 鏡像請(qǐng)求異步執(zhí)行,對(duì)主請(qǐng)求影響極小 |
?? 限制 | 鏡像響應(yīng)結(jié)果不會(huì)被使用,也不會(huì)出現(xiàn)在日志中 |
?? 風(fēng)險(xiǎn) | 若鏡像目標(biāo)不可達(dá),會(huì)增加 Nginx 異步隊(duì)列壓力 |
?? 建議 | 大體量流量建議獨(dú)立部署 Nginx 作為“流量復(fù)制層” |
9、日志與驗(yàn)證
可以為鏡像目標(biāo)服務(wù)單獨(dú)設(shè)置日志,驗(yàn)證是否接收到流量:
location = /mirror_backend {
internal;
proxy_passhttp://test_backend;
access_log/var/log/nginx/mirror_access.log;
}或使用 tcpdump 抓包驗(yàn)證:
tcpdump -i eth0 host test_backend -n
10、完整生產(chǎn)級(jí)模板
http {
upstreammain_backend {
server 10.0.0.1:8080;
}
upstreammirror_backend {
server 10.0.0.2:8080;
}
map $request_uri $enable_mirror {
default0;
~^/api/v11;
}
server {
listen80;
location/ {
proxy_passhttp://main_backend;
mirror/mirror_backendif=$enable_mirror;
mirror_request_bodyon;
}
location = /mirror_backend {
internal;
proxy_passhttp://mirror_backend;
access_log/var/log/nginx/mirror_access.log;
}
}
}11、結(jié)語(yǔ)
Nginx Mirror 模塊提供了一個(gè)低成本、高靈活度的流量復(fù)制機(jī)制,非常適合在微服務(wù)架構(gòu)中快速搭建灰度驗(yàn)證與測(cè)試環(huán)境。
- 異步非阻塞,不影響主業(yè)務(wù)延遲;
- 支持 body、header、任意方法的鏡像;
- 通過(guò) map、變量或 Lua 可實(shí)現(xiàn)靈活灰度策略;
- 在高流量場(chǎng)景應(yīng)注意鏡像目標(biāo)容量和網(wǎng)絡(luò)帶寬。
到此這篇關(guān)于Nginx Mirror模塊實(shí)現(xiàn)流量鏡像的示例代碼的文章就介紹到這了,更多相關(guān)Nginx Mirror 流量鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx提示:500 Internal Server Error錯(cuò)誤解決辦法
這篇文章主要介紹了 nginx提示:500 Internal Server Error錯(cuò)誤解決辦法的相關(guān)資料,這里提供了解決該問(wèn)題的詳細(xì)步驟,希望能幫助到大家,需要的朋友可以參考下2017-08-08
Nginx之正向代理與反向代理進(jìn)階方式(支持https)
文章介紹了如何在Nginx中實(shí)現(xiàn)正向代理和反向代理對(duì)HTTP和HTTPS協(xié)議的支持,通過(guò)使用第三方模塊`ngx_http_proxy_connect_module`和Nginx內(nèi)置的`ngx_http_ssl_module`,可以實(shí)現(xiàn)Nginx對(duì)HTTPS的正向和反向代理2025-03-03
nginx進(jìn)行端口轉(zhuǎn)發(fā)的實(shí)現(xiàn)
本文主要介紹了nginx進(jìn)行端口轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Nginx上配置Basic Authorization登錄認(rèn)服務(wù)證的教程
現(xiàn)在我們所使用的包括社交網(wǎng)絡(luò)API等開(kāi)放平臺(tái)授權(quán)獲得用戶的用戶名和密碼一般有兩種認(rèn)證方式,一種是Basic Auth,一種是OAuth,這里我們就來(lái)看一下Nginx上配置Basic Authorization登錄認(rèn)服務(wù)證的教程2016-06-06
Nginx訪問(wèn)本地靜態(tài)資源詳細(xì)步驟(推薦)
Nginx?(engine?x)?是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù),這篇文章主要介紹了nginx配置訪問(wèn)本地靜態(tài)資源,需要的朋友可以參考下2022-12-12
封80端口應(yīng)對(duì)策略 Nginx反向代理For WIN2003超級(jí)傻瓜式配置
封80應(yīng)對(duì)策略,Nginx反向代理ForWIN2003超級(jí)傻瓜式配置!2010-03-03
nginx?攔截指定ip訪問(wèn)指定url的實(shí)現(xiàn)示例
本文主要介紹了nginx?攔截指定ip訪問(wèn)指定url的實(shí)現(xiàn)示例,使用$http_x_forwarded_for變量來(lái)獲取客戶端的真實(shí)IP地址,感興趣的可以了解一下2024-12-12

