Nginx的mirror指令能幹啥?

發表於2022-05-11

mirror 流量複製

Nginx的 mirror 指令來自於 ngx_http_mirror_module 模組 Nginx Version > 1.13.4

mirror 指令提供的核心功能就是流量複製, 至於流量複製要用來幹嘛,這個就各取所需了。

  • 先看一段示例配置:
location / {
    # 開啟流量複製
    mirror /mirror;
    proxy_pass http://backend;
}

# 複製的流量轉發到這裡
location = /mirror {
    # internal 標誌該location只為內部的重定向服務, 外面來的返回404
    internal;
    # $request_uri 需要顯示指明,因為流量複製過來之後會丟掉request_uri
    proxy_pass http://test_backend$request_uri;
}

有什麼實際用處?

  • 舉個實際使用的例子:

上篇寫了Nginx的map指令用法其中提到的一個使用cookie進行多環境分流的例子,同樣的場景, 基於cookie分流遇到的一個問題是:對於第三方的回撥請求支援不友好, 因為第三方不可能攜帶我們自定義的cookie來回撥我們。這樣說可能沒參與專案的不太好理解, 簡單說是這樣的: 比如我在3環境和騰訊雲做了互動, 之後騰訊雲會回撥3環境的一個介面(因為測試多環境使用同一個域名),完犢子了吧,因為騰訊雲沒有帶我們分環境的cookie, 因此我在3環境的這個互動一定是無法完成的。

那麼如何解決這個問題? mirror 指令可以解決。

- Nginx 會丟棄 mirror 的響應 : 這一點很重要

為了解決第三方回撥的問題,我們開啟了Nginx的mirror, 把回撥介面的請求複製到測試所有環境內,總有一個是目標環境(從業務上說即使回撥到其他環境也無所謂,所以直接映象到所有環境), 配置大致是這樣:

location /notify/v1.0/ {
    mirror  /test-01;
    mirror  /test-02;
    mirror  /test-03;
    mirror  /test-04;
    mirror  /test-05;
    mirror  /test-06;
    mirror  /test-07;
    mirror  /test-08;
    mirror  /test-09;
    mirror  /test-10;
}

location = /test-01 {
    internal;
    # 頭資訊視情況新增/刪除
    proxy_pass_header Server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;

    proxy_pass http://upstream_test-01$request_uri;
}

upstream upstream_test-01 {
    server 1.1.1.1:80 weight=100 max_fails=10 fail_timeout=60s;
}
  • 再舉個實際的例子

灰度驗證

提供給一個思路: 比如你需要改動線上的都個配置,但是不確定是不是有問題的時候, 這個時候其實可以使用一下mirror的流量複製, 先在灰度環境改掉,然後使用mirror映象線上流量到灰度驗證,這時候你只需要觀測灰度的請求是否正常即可。(當然可以自動化程度高一些,自由發揮), 也可以使用 split_client 指令做部分流量的驗證。

注意點

  1. Nginx會丟棄mirror響應,但是如果mirror過去的請求一直無響應或響應慢的時候,這時會影響主請求的響應速度的。
  2. 需要注意,一般不會把POST/PUT等會影響資料狀態的請求做映象的, 除非你明確清楚的知道這樣產生的影響並且可以接受.

相關文章