モチベーション
シュッと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%の割合で
$version
にstable
がバインドされる。残りはedge
になる if
で$version == edge
ならばリクエストパスに/v2
を付与してunix:/var/run/app.sock
にプロキシする
- トークンとしてクエリストリングの
所感
デフォルトモジュールでシュッと出来たのでNginx便利。また上記例では rewrite
でパスを書き換えているが、クラスタ前段にNginxを置いて upstream
ごと切り替えるなども有効そう。