Nginx實(shí)現(xiàn)流量拷貝的示例代碼
1. 需求
在生產(chǎn)環(huán)境中,我們經(jīng)常需要將流量拷貝到預(yù)上線環(huán)境或測(cè)試環(huán)境,以便進(jìn)行各種驗(yàn)證和測(cè)試。這樣做的好處包括:
- 功能驗(yàn)證與性能測(cè)試:通過(guò)真實(shí)流量測(cè)試新功能和服務(wù)的性能。
- 數(shù)據(jù)真實(shí)性:無(wú)需造數(shù)據(jù),使用真實(shí)請(qǐng)求進(jìn)行驗(yàn)證,不影響線上正常訪問(wèn)。
- 灰度發(fā)布的補(bǔ)充:鏡像流量不會(huì)影響真實(shí)流量,提供額外的測(cè)試手段。
- 問(wèn)題排查:幫助定位線上問(wèn)題。
- 服務(wù)重構(gòu)測(cè)試:對(duì)重構(gòu)后的服務(wù)進(jìn)行全面測(cè)試。
為了實(shí)現(xiàn)這一需求,Nginx提供了ngx_http_mirror_module
模塊。
2. 安裝Nginx
首先,設(shè)置yum倉(cāng)庫(kù)。為此,創(chuàng)建一個(gè)文件/etc/yum.repos.d/nginx.repo
,并將以下內(nèi)容寫(xiě)入文件:
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
然后,使用yum安裝nginx:
sudo yum install nginx
默認(rèn)情況下,nginx的配置文件是nginx.conf
,一般位于/etc/nginx
目錄下。啟動(dòng)nginx非常簡(jiǎn)單,只需在命令行中輸入:
sudo nginx
一旦master進(jìn)程接收到重新加載配置的信號(hào),它將檢查新配置文件的語(yǔ)法是否正確,并嘗試應(yīng)用新配置。如果成功,master進(jìn)程將啟動(dòng)新的worker進(jìn)程,并發(fā)送消息給舊的worker進(jìn)程,要求它們關(guān)閉。否則,將回滾更改并繼續(xù)使用舊配置。
停止nginx可以使用以下命令:
sudo nginx -s stop
nginx的master進(jìn)程的進(jìn)程ID默認(rèn)情況下存放在nginx.pid
文件中,該文件一般位于/var/run
目錄下。
3. ngx_http_mirror_module
ngx_http_mirror_module
模塊(1.13.4版本引入)通過(guò)創(chuàng)建后臺(tái)鏡像子請(qǐng)求來(lái)實(shí)現(xiàn)原始請(qǐng)求的鏡像。鏡像子請(qǐng)求的響應(yīng)會(huì)被忽略。
這里,“mirror”可以理解為像一個(gè)鏡像站點(diǎn)一樣,收集所有請(qǐng)求。有了這個(gè)鏡像,后續(xù)可以用它重現(xiàn)所有請(qǐng)求,從而實(shí)現(xiàn)將線上流量復(fù)制到其他地方。
官網(wǎng)給出的示例非常簡(jiǎn)單:
location / { mirror /mirror; }
如果請(qǐng)求體被鏡像,那么在創(chuàng)建子請(qǐng)求之前會(huì)先讀取請(qǐng)求體。
注意:通過(guò)yum安裝的Nginx可能不包含ngx_http_mirror_module
模塊。因此,真正使用時(shí)最好采用自定義安裝,即從源碼構(gòu)建。
步驟:
下載源碼:
- 訪問(wèn)Nginx下載頁(yè)面獲取源碼。
編譯安裝:
- 解壓源碼并進(jìn)入目錄,執(zhí)行配置、編譯和安裝命令。
以下是一個(gè)示例配置:
upstream api.abc.com { server 127.0.0.1:8080; } upstream tapi.abc.com { server 127.0.0.1:8081; } server { listen 80; # 源站點(diǎn) location /api { proxy_pass http://api.abc.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 流量復(fù)制 mirror /newapi; mirror /mirror2; mirror /mirror3; # 復(fù)制請(qǐng)求體 mirror_request_body on; } # 鏡像站點(diǎn) location /tapi { proxy_pass http://tapi.abc.com$request_uri; proxy_pass_request_body on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
運(yùn)行效果:
假設(shè)我們有一個(gè)服務(wù)在127.0.0.1:8080
上運(yùn)行,并且我們?cè)?code>127.0.0.1:8081上有一個(gè)鏡像服務(wù)。當(dāng)我們?cè)L問(wèn)http://your_nginx_server/api/some_endpoint
時(shí),請(qǐng)求將被鏡像到/newapi
、/mirror2
和/mirror3
指定的路徑(這些路徑可以是實(shí)際的服務(wù)路徑,也可以是日志收集路徑等)。
示例運(yùn)行結(jié)果(假設(shè)通過(guò)日志查看):
原始服務(wù)日志:
127.0.0.1 - - [12/Oct/2023:12:34:56 +0000] "GET /api/some_endpoint HTTP/1.1" 200 123
鏡像服務(wù)日志(假設(shè)鏡像到另一個(gè)服務(wù)并記錄):
127.0.0.1 - - [12/Oct/2023:12:34:56 +0000] "GET /tapi/some_endpoint HTTP/1.1" 200 123 (mirrored from /api)
4. 補(bǔ)充命令
查看進(jìn)程運(yùn)行時(shí)間:
ps -eo pid,user,lstart,etime,cmd | grep nginx
查看已經(jīng)建立連接的數(shù)量:
netstat -an | grep ESTABLISHED | wc -l
查看80端口的連接數(shù):
netstat -an | grep ":80" | wc -l
通過(guò)以上步驟和配置,您可以輕松實(shí)現(xiàn)Nginx的流量拷貝功能,為測(cè)試和驗(yàn)證提供強(qiáng)大支持。
到此這篇關(guān)于Nginx實(shí)現(xiàn)流量拷貝的示例代碼的文章就介紹到這了,更多相關(guān)Nginx 流量拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx?HttpHeader增加幾個(gè)關(guān)鍵的安全選項(xiàng)問(wèn)題小結(jié)
本文給大家介紹Nginx?HttpHeader增加幾個(gè)關(guān)鍵的安全選項(xiàng)問(wèn)題小結(jié),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-12-12nginx 如何實(shí)現(xiàn)if嵌套的方法示例
這篇文章主要介紹了nginx 如何實(shí)現(xiàn)if嵌套的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11nginx server_name配置多個(gè)域名時(shí)的坑
Nginx配置多個(gè)server_name時(shí),$server_name默認(rèn)取第一個(gè)值,導(dǎo)致PHP獲取錯(cuò)誤,下面就來(lái)介紹一下該問(wèn)題的解決,感興趣的可以了解一下2025-05-05簡(jiǎn)單談?wù)凬ginx基礎(chǔ)知識(shí)入門(mén)
Nginx(engine x)是一個(gè)高性能的HTTP服務(wù)器(其實(shí)不止HTTP服務(wù)器),一般主要用作負(fù)載均衡和反向代理,今天我們來(lái)簡(jiǎn)單學(xué)習(xí)下他的基礎(chǔ)配置知識(shí)2017-08-08OpenResty是什么,OpenResty和Nginx的區(qū)別?
Nginx作為一款輕量級(jí)、高性能的Web服務(wù)器,傳統(tǒng)局限性也很明顯:靜態(tài)配置、邏輯擴(kuò)展依賴(lài)C模塊開(kāi)發(fā),使得它在需要?jiǎng)討B(tài)業(yè)務(wù)邏輯的場(chǎng)景中顯得捉襟見(jiàn)肘,<BR>而OpenResty的出現(xiàn),打破了這一僵局,它通過(guò)將Lua腳本深度集成到Nginx中,將“靜態(tài)代理服務(wù)器”升級(jí)為“動(dòng)態(tài)應(yīng)用平臺(tái)”2025-04-04Nginx路由匹配規(guī)則及優(yōu)先級(jí)詳解
Nginx作為一個(gè)高性能的Web服務(wù)器和反向代理服務(wù)器,廣泛用于負(fù)載均衡、請(qǐng)求轉(zhuǎn)發(fā)等場(chǎng)景,在配置Nginx時(shí),路由匹配規(guī)則是非常重要的概念,本文將詳細(xì)介紹Nginx的路由匹配規(guī)則及其優(yōu)先級(jí),需要的朋友可以參考下2025-05-05