Flask uwsgi + nginxで実行されるWebサービスがあり、うまく動作します。
別のサーバーで実行するサービスの別の開発バージョンがあります。また、uwsgi + nginxでも動作します。
私がやりたいのは、開発サーバーを「実際の」トラフィック(POSTリクエスト)でテストすることです。開発サーバーが基本的に正常に機能することを確認しました。 2つを同じ実際のトラフィックと比較したいだけです。
これに対する私の基本的な考えは以下のようなものです:
(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://y.y.y.y:port に配信され、完了したときにpost_actionはリクエストを名前付きの場所@post_actionにディレクティブで渡すことができません。他に何かする必要がありますか?