Nginx

將請求複製並傳遞到另一個 nginx 伺服器以進行真實流量測試

  • September 20, 2021

我有一個在 uwsgi+nginx 上執行的 Flask Web 服務,它執行良好。

我有另一個在另一台伺服器上執行的服務開發版本。它也可以在 uwsgi+nginx 上執行。

我想要做的是,用“真實”流量(POST 請求)測試開發伺服器,我已經完成驗證開發伺服器基本上工作正常。只想將兩者與相同的真實流量進行比較。

我對此的基本想法如下:

(A) 是舊版伺服器 (B) 是測試伺服器

  1. 使用者請求
  2. Nginx(A) 獲取請求並將請求傳遞給 uwsgi(A) 進行處理。
  3. Nginx(A) ‘複製’ 請求並將其傳遞給 Nginx(B) 進行測試
  4. uwsgi(A) 處理 Flask App(A) 中的請求並響應使用者(通過 Nginx(A))
  5. Nginx(B) 像傳統伺服器一樣處理請求,但不響應使用者(僅記錄)

這有什麼意義嗎?我應該採取什麼方法?

我自己找到了解決方案。所以我在這里分享我的發現。

我為此使用了 post_action指令

location / {
   uwsgi_pass      unix:app.sock;
   post_action @post_action; 
}

location @post_action {
   proxy_pass      http://dst_host:dst_port; 
}

請求首先傳遞給 unix:app.sock,完成後,post_action 指令將請求傳遞給命名位置 @post_action。

它就像一個魅力!

location / {
     proxy_pass  http://y.y.y.y:port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_connect_timeout      300;
     proxy_send_timeout         300;
     proxy_read_timeout         300;
     post_action @post_action;
   }

location @post_action {
   proxy_pass      http://x.x.x.x:port;
   access_log /var/log/nginx/c.log application;
   error_log /var/log/nginx/c.log error;
}

請求首先傳遞到http://yyyy:port完成後,post_action 無法指示將請求傳遞到指定位置,@post_action。我們還需要做其他事情嗎?

引用自:https://serverfault.com/questions/515284