nginx+goreplay實(shí)現(xiàn)業(yè)務(wù)流量壓測(cè)的示例代碼
結(jié)合 Nginx 和 GoReplay 可以實(shí)現(xiàn)生產(chǎn)環(huán)境流量的實(shí)時(shí)拷貝和回放,這在測(cè)試、性能驗(yàn)證和問(wèn)題復(fù)現(xiàn)場(chǎng)景中非常有用。以下是具體實(shí)現(xiàn)方案:
一、核心原理
1)Nginx 流量鏡像(Mirroring)
- 使用
ngx_http_mirror_module將生產(chǎn)環(huán)境的請(qǐng)求復(fù)制到指定地址(如本地端口或其他服務(wù)器),而不影響原始請(qǐng)求的處理。 - 鏡像請(qǐng)求的響應(yīng)會(huì)被 Nginx 丟棄,不返回給客戶端。
2)GoReplay 接收并處理流量
GoReplay 監(jiān)聽(tīng) Nginx 鏡像的端口,捕獲請(qǐng)求并可以:
- 實(shí)時(shí)轉(zhuǎn)發(fā):將流量轉(zhuǎn)發(fā)到測(cè)試環(huán)境或壓測(cè)服務(wù)器。
- 保存為文件:記錄流量用于后續(xù)回放。
- 實(shí)時(shí)分析:統(tǒng)計(jì)請(qǐng)求分布、響應(yīng)時(shí)間等指標(biāo)。
二、實(shí)現(xiàn)步驟
1. 配置 Nginx 流量鏡像
修改 Nginx 配置文件(如 nginx.conf 或站點(diǎn)配置),添加 mirror 指令:
server {
listen 80;
server_name example.com;
location / {
# 處理正常請(qǐng)求
proxy_pass http://backend_production;
# 鏡像請(qǐng)求到本地 8080 端口(由 GoReplay 監(jiān)聽(tīng))
mirror /mirror;
mirror_request_body on; # 鏡像請(qǐng)求體
}
# 鏡像請(qǐng)求的目標(biāo)位置
location /mirror {
internal; # 禁止外部訪問(wèn)
proxy_pass http://127.0.0.1:8080$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 可添加更多請(qǐng)求頭
}
}
2. 安裝并啟動(dòng) GoReplay
下載并啟動(dòng) GoReplay,監(jiān)聽(tīng) Nginx 鏡像的端口(如 8080):
# 下載 GoReplay wget https://github.com/buger/goreplay/releases/download/v1.3.1/gor_1.3.1_x64.tar.gz tar xzf gor_1.3.1_x64.tar.gz chmod +x gor # 模式1:實(shí)時(shí)轉(zhuǎn)發(fā)到測(cè)試環(huán)境 ./gor --input-raw :8080 --output-http "http://test-server:80" # 模式2:保存流量到文件 ./gor --input-raw :8080 --output-file "traffic.gor" # 模式3:同時(shí)轉(zhuǎn)發(fā)和保存 ./gor --input-raw :8080 --output-http "http://test-server:80" --output-file "traffic.gor"
3. 流量回放(可選)
使用保存的流量文件(traffic.gor)進(jìn)行回放:
# 回放流量到測(cè)試環(huán)境,模擬 100 并發(fā) ./gor --input-file "traffic.gor" --output-http "http://test-server:80" --http-track-response --workers 100
三、關(guān)鍵配置參數(shù)
Nginx 參數(shù)
mirror /mirror:指定鏡像請(qǐng)求的目標(biāo)位置。mirror_request_body on:?jiǎn)⒂谜?qǐng)求體鏡像(默認(rèn)不鏡像請(qǐng)求體)。internal:確保鏡像目標(biāo)位置不接受外部請(qǐng)求。
GoReplay 參數(shù)
- 輸入選項(xiàng):
--input-raw :8080:監(jiān)聽(tīng)本地 8080 端口的原始流量。--input-file "traffic.gor":從文件讀取流量。
- 輸出選項(xiàng):
--output-http "http://test-server:80":轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器。--output-file "traffic.gor":保存流量到文件。--output-statsd "statsd:8125":發(fā)送統(tǒng)計(jì)數(shù)據(jù)到 StatsD。
- 性能選項(xiàng):
--http-allow-url ".*":過(guò)濾允許的 URL 模式。--http-allow-header "X-Test: true":過(guò)濾特定請(qǐng)求頭。--workers 100:設(shè)置并發(fā)工作線程數(shù)。
四、注意事項(xiàng)與優(yōu)化
1. 性能影響
- Nginx 開(kāi)銷:鏡像請(qǐng)求會(huì)增加 CPU 和網(wǎng)絡(luò)開(kāi)銷(通常 <5%,取決于請(qǐng)求大?。?/li>
- GoReplay 資源占用:建議部署在獨(dú)立服務(wù)器或容器中,避免影響生產(chǎn)環(huán)境。
2. 請(qǐng)求過(guò)濾
- 只鏡像關(guān)鍵路徑的請(qǐng)求(如 API 接口),避免靜態(tài)資源(如圖片、CSS):
location ~ ^/(api|users|orders) { mirror /mirror; }
3. 安全與隱私
- 敏感數(shù)據(jù)(如密碼、信用卡號(hào))需過(guò)濾:
# GoReplay 過(guò)濾請(qǐng)求體中的敏感字段 ./gor --input-raw :8080 --output-http "http://test-server:80" --http-body-filter "s/credit_card=[0-9]+/credit_card=*** /g"
4. 測(cè)試環(huán)境準(zhǔn)備
- 確保測(cè)試環(huán)境能承受流量壓力,避免被壓垮。
- 使用
--http-track-response參數(shù)跟蹤回放的響應(yīng)結(jié)果,分析成功率。
五、驗(yàn)證與監(jiān)控
1. 驗(yàn)證流量鏡像
- 在測(cè)試服務(wù)器查看訪問(wèn)日志,確認(rèn)是否收到鏡像的請(qǐng)求。
- 使用 GoReplay 的統(tǒng)計(jì)功能查看流量指標(biāo):
./gor --input-raw :8080 --output-stdout --stats
2. 監(jiān)控性能
- 監(jiān)控 Nginx 和 GoReplay 的 CPU / 內(nèi)存使用情況。
- 使用 Prometheus + Grafana 收集 GoReplay 輸出的指標(biāo)(如請(qǐng)求數(shù)、響應(yīng)時(shí)間)。
六、典型場(chǎng)景
- 灰度測(cè)試:將生產(chǎn)流量部分轉(zhuǎn)發(fā)到新版本服務(wù),驗(yàn)證兼容性。
- 性能壓測(cè):使用真實(shí)流量對(duì)新部署的服務(wù)進(jìn)行壓力測(cè)試。
- 問(wèn)題復(fù)現(xiàn):捕獲故障時(shí)段的流量,在測(cè)試環(huán)境中復(fù)現(xiàn)問(wèn)題。
通過(guò) Nginx 和 GoReplay 的組合,可低成本實(shí)現(xiàn)生產(chǎn)流量的復(fù)制和回放,大幅提升測(cè)試效率和問(wèn)題定位能力。
到此這篇關(guān)于nginx+goreplay實(shí)現(xiàn)業(yè)務(wù)流量壓測(cè)的示例代碼的文章就介紹到這了,更多相關(guān)nginx goreplay業(yè)務(wù)流量壓測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx實(shí)現(xiàn)動(dòng)靜分離實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于nginx實(shí)現(xiàn)動(dòng)靜分離實(shí)例講解,需要的朋友們可以參考下。2020-03-03
Nginx 域名SSL證書(shū)配置(網(wǎng)站 http 升級(jí)為 https)
這篇文章主要介紹了Nginx 域名SSL證書(shū)配置(網(wǎng)站 http 升級(jí)為 https),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
nginx proxy_buffer_size解決后端服務(wù)傳輸數(shù)據(jù)過(guò)多,header過(guò)大問(wèn)題
這篇文章主要介紹了nginx proxy_buffer_size解決后端服務(wù)傳輸數(shù)據(jù)過(guò)多,header過(guò)大問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
本地通過(guò)nginx配置反向代理的全過(guò)程記錄
這篇文章主要給大家介紹了關(guān)于本地通過(guò)nginx配置反向代理的全過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

