読者です 読者をやめる 読者になる 読者になる

nginx + ngx_mruby + redisでredis制御でサーバを切り替えてみる

サーバを緊急メンテ状態にしたいとき、

・バックエンド最前段の実装で設定を読んで動きを変える

・フロントエンドにメンテ設定送り込んで再起動

色々対応方法を考えたけど、redisに設定を入れ込んでフロントエンド側で 判断して動き変えられたら面白いかなと思ってやってみた。

# -*- coding: utf-8 -*-

worker_processes  1;

daemon off;
master_process off;

events {
    worker_connections  1024;
}

http {
    mruby_init_code '
        userdata = Userdata.new "redis_data_key"
        userdata.redis = Redis.new "127.0.0.1", 6379
    ';

    server {
        listen       7777;
        location / {
          echo "port 7777 test";
        }
    }

    server {
        listen       57777;

        location /mruby {
          mruby_set_code $maint '
              userdata = Userdata.new "redis_data_key"
              redis = userdata.redis
              redis.get "ngx_maint"
          ';
          if ($maint = "TRUE") {
            mruby_set_code $res_maint '
              JSON::stringify({"result"=>"ERR", "time"=>Time.now.to_i})
          ';
            echo $res_maint;
          }
          if ($maint != "TRUE") {
             proxy_pass   http://127.0.0.1:7777;
          }
        }
    }
}

問題はredis getのコストか。要調査。