Nginx
將請求複製並傳遞到另一個 nginx 伺服器以進行真實流量測試
我有一個在 uwsgi+nginx 上執行的 Flask Web 服務,它執行良好。
我有另一個在另一台伺服器上執行的服務開發版本。它也可以在 uwsgi+nginx 上執行。
我想要做的是,用“真實”流量(POST 請求)測試開發伺服器,我已經完成驗證開發伺服器基本上工作正常。只想將兩者與相同的真實流量進行比較。
我對此的基本想法如下:
(A) 是舊版伺服器 (B) 是測試伺服器
- 使用者請求
- Nginx(A) 獲取請求並將請求傳遞給 uwsgi(A) 進行處理。
- Nginx(A) ‘複製’ 請求並將其傳遞給 Nginx(B) 進行測試
- uwsgi(A) 處理 Flask App(A) 中的請求並響應使用者(通過 Nginx(A))
- 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。我們還需要做其他事情嗎?