Nginx流量控制
阿新 • • 發佈:2021-01-09
目錄
Nginx流量控制
流量複製
專案進行遷移上雲,如何在不影響現有專案的情況下,進行驗證測試,平滑遷移。理論上分割部分流量到雲上進行驗證,確定沒有問題逐漸遷移,如果nginx不好分割流量的情況,其實不太好做遷移,風險太大。
nginx支援流量複製,在接收請求時,可以複製流量到另外的伺服器而不關心響應,對原本的專案不會產生任何影響。
複製的流量轉發到雲上的服務跑動,驗證資料流程沒有問題,就可以對其整體切換。
ngx_http_mirror_module
implements mirroring of an original request by creating background mirror subrequests. Responses to mirror subrequests are ignored.
通過建立後臺映象子請求實現原始請求的映象。對映象子請求的響應將被忽略;
場景:可以做流量複製,不關心響應。作為機房遷移上雲的過渡挺合適的,或者說是作為複製請求測試。
location / {
mirror /mirror;
proxy_pass http://backend;
}
location = /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}
參考:http://nginx.org/en/docs/http/ngx_http_mirror_module.html
流量分割
服務的流量壓力巨大,並且個別介面有時候因為訪問量暴漲,會影響到其他的介面服務;單個介面也可能因為某個維度爆量,影響其他維度的服務。所以就有必要對流量進行切割,使他們相互獨立,隔離,達到解耦的效果。
舉個實際專案中的應用列子,雖然使用k8s中的ingress處理的,但理論上沒啥差別。
--- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: namespace: bigdata name: adc-ingress annotations: ingress.kubernetes.io/rewrite-target: / kubernetes.io/ingress.class: "nginx" # ingress指定nginx nginx.ingress.kubernetes.io/server-snippet: | # 設定nginx 服務指令碼配置 set $flag 0; if ( $uri = /click) { set $flag 1; } if ( $args ~ project=ios ) { set $flag 1$flag; } if ( $flag = 11 ) { rewrite ^/(.*) $uri-ios break; } spec: rules: - host: walking.sun.com http: paths: # path對應nginx path - path: /click/google backend: serviceName: google-srv # 指定path 請求會轉發到對應的svc servicePort: 8080 - path: /click-ios backend: serviceName: web-ios-srv servicePort: 8080 - path: /click backend: serviceName: web-srv servicePort: 8080 - host: walking.sun123.com http: paths: - path: /click/google backend: serviceName: google-srv servicePort: 8080 tls: # 開發tls - hosts: - walking.sun.com secretName: sun.com - hosts: - walking.sun123.com secretName: sun123.com
可以看到有根據介面路徑進行拆分,有根據解析引數進行切割,其實就是nginx的語法。