web-dev-qa-db-ja.com

実際のトラフィックテストのために、リクエストをコピーして別のnginxサーバーに配信する

Flask uwsgi + nginxで実行されるWebサービスがあり、うまく動作します。

別のサーバーで実行するサービスの別の開発バージョンがあります。また、uwsgi + nginxでも動作します。

私がやりたいのは、開発サーバーを「実際の」トラフィック(POSTリクエスト)でテストすることです。開発サーバーが基本的に正常に機能することを確認しました。 2つを同じ実際のトラフィックと比較したいだけです。

これに対する私の基本的な考えは以下のようなものです:

(A)はレガシーサーバーです(B)はテストサーバーです

  1. ユーザーのリクエスト

  2. Nginx(A)はリクエストを取得し、そのリクエストを処理のためにuwsgi(A)に配信します。

  3. Nginx(A)はリクエストを「コピー」し、テストのためにNginx(B)に配信します

  4. uwsgi(A)はFlask App(A)で要求を処理し、ユーザーに応答します(Nginx(A)を介して)

  5. Nginx(B)は、レガシーサーバーのようにリクエストを処理しますが、ユーザーには応答しません(ログのみ)

これは意味がありますか?どのようなアプローチを取るべきですか?

6
Younggun Kim

私は自分で解決策を見つけました。ここで私の発見を共有します。

私は 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に渡します。

それは魅力のように機能します!

17
Younggun Kim
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にディレクティブで渡すことができません。他に何かする必要がありますか?

0
user1086343