概述
因為我們的接口環境是在winserver上,而gor又剛好沒對應版本(網上很多辦法都試過了...哪位朋友測試過可以的話指點下),是以用了nginx的ngx_http_mirror_module子產品來實作需求。
01
ngx_http_mirror_module子產品
nginx官網公布了nginx1.13.4最新的ngx_http_mirror_module子產品,利用mirror子產品,業務可以将線上實時通路流量拷貝至其他環境,基于這些流量可以做版本釋出前的預先驗證,進行流量放大後的壓測等等。
02
mirror子產品配置
mirror子產品配置分為兩部分,源位址和鏡像位址配置,配置位置可以為nginx配置檔案的http, server, location上下文,配置示例為:
mirror子產品配置說明#originallocation / { #location /指定了源uri為/ root html; index index.html index.htm; mirror /mirror; #lmirror /mirror指定鏡像uri為/mirror mirror /mirror; #lmirror /mirror指定鏡像uri為/mirror mirror_request_body on; # 指定是否鏡像請求body部分,請求自動緩存;}#mirrorlocation /mirror { internal;internal #指定此location隻能被“内部的”請求調用,外部的調用請求會傳回”Not found” (404) proxy_set_header X-Original-URI $request_uri; proxy_set_header Host baidu-nginx-b.com; #proxy_set_header 設定鏡像流量的頭部 proxy_pass http://192.168.1.100$request_uri; #proxy_pass 指定将鏡像資料發送給test server的位址}location /mirror2 { internal;internal #指定此location隻能被“内部的”請求調用,外部的調用請求會傳回”Not found” (404) proxy_set_header X-Original-URI $request_uri; proxy_set_header Host baidu-nginx-b.com; #proxy_set_header 設定鏡像流量的頭部 proxy_pass http://192.168.1.100$request_uri; #proxy_pass 指定将鏡像資料發送給test server的位址}
1、original配置
- location /指定了源uri為/
- mirror /mirror指定鏡像uri為/mirror
- mirror_request_body off | on 指定是否鏡像請求body部分,此選項與proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering和 uwsgi_request_buffering沖突,一旦開啟mirror_request_body為on,則請求自動緩存;
- proxy_pass 指定上遊server的位址
2、mirror配置
- internal 指定此location隻能被“内部的”請求調用,外部的調用請求會傳回”Not found” (404)
- proxy_pass 指定上遊server的位址
- proxy_set_header 設定鏡像流量的頭部
03
流量複制--實驗測試
1、下載下傳nginx,解壓縮,運作cmd,使用指令進行操作,不要直接輕按兩下nginx.exe,不要直接輕按兩下nginx.exe,不要直接輕按兩下nginx.exe
一定要在dos視窗啟動,不要直接輕按兩下nginx.exe,這樣會導緻修改配置後重新開機、停止nginx無效,需要手動關閉任務管理器内的所有nginx程序,再啟動才可以。
2、啟動nginx服務,啟動時會一閃而過是正常的
start nginx
3、檢視任務程序是否存在,dos或打開任務管理器都行
tasklist /fi "imagename eq nginx.exe"
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICNjFWMzITOmNGOjJGZyUGOhZTZ0UjMxgjZzIDNyAzNi9CXldWYtlWLjdGcvwVZnJXYs9CXt92YuAHdhR3cw5SMw9CXvwlOzBHd0hWPsJXdmYDM3YjZkJGNzQDNl1SOhRGOtETMiVWLlJDNz0CNzMWYhBjZ20DZpV3ZmITPlBXe0ZyPldWYtl2LcdXZpZ3Lc12bj5SZjVjL5h3byBnLxATLn1Wavw1LcpDc0RHaiojIsJye.jpg)
4、如果程式沒啟動就直接start nginx啟動,如果已經啟動了就使用以下指令重新加載配置檔案并重新開機
nginx -s reload
之後就打開浏覽器通路剛才的域名及端口http://localhost:80,出現歡迎頁就說明部署成功了
5、啟動web服務
這裡偷個懶,用之前gor的一些半成品模拟兩個server
d:goreplaygor file-server :8000gor file-server :8001
6、配置NGINX
upstream zs { server 127.0.0.1:8000; } upstream cs { server 127.0.0.1:8001; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /{ #access_log D:ginxaccess.log accesslog; mirror /mirror; mirror_request_body on; proxy_pass http://zs; } # 鏡像站點配置 location /mirror { internal; # 内部配置 proxy_pass http://cs$request_uri; proxy_pass_request_body on; # Indicates whether the original request body is passed to the proxied server. default value is on proxy_set_header X-Original-URI $request_uri; } }}
7、通路位址:http://localhost/goreplay-1.0.0/
可以看到兩邊都有對應的請求。
這個辦法也是一個解決方案,對線上壓力也比較小,不過使用者通路生産伺服器請求被nginx複制發送給測試伺服器時,mirror不會輸出http傳回内容,這裡就需要另外配置了。
另外一點就是不會儲存流量下來,無法做到随時随地重放,隻能說折中吧,還得繼續研究。
後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~