NginxでカジュアルにA/Bテストをする

Posted on

モチベーション

シュッとA/Bテストをしたい時、アプリに手を入れずにNginxだけで完結出来ると楽。またNginxで制御出来るとパス単位やクラスタ単位など柔軟にトラフィックを流せるので楽になりそう。

split_clientを使ってトラフィックを制御する

特定のトークンを与えると、それを任意の割合で指定した値を返してくれるモジュール。これを使ってリクエストを分割した後にrewriteなりで処理することで任意のパスに流すことが出来る。

sample

http {
  upstream app {
    server unix:/var/run/app.sock;
  }

  split_clients "${arg_token}" $version {
    90%  stable;
    *    edge;
  }

  server {
    listen       80;
    server_name  localhost;

    location / {
      if ($version = edge) {
        rewrite /(.*) /v2/$1 break;
      }
      proxy_pass http://app;
    }
  }
}
  • やっていること
    • トークンとしてクエリストリングの token を与えるようにしている
      • ${arg_xxx} でクエリストリングが取れる
      • 他にも ${remote_addr} とかnginxで扱える値であれば使える
    • 90%の割合で $versionstable がバインドされる。残りは edge になる
    • if$version == edge ならばリクエストパスに /v2 を付与して unix:/var/run/app.sock にプロキシする

所感

デフォルトモジュールでシュッと出来たのでNginx便利。また上記例では rewrite でパスを書き換えているが、クラスタ前段にNginxを置いて upstream ごと切り替えるなども有効そう。