人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

nginxのworkerプロセス初期化・exit時にRubyスクリプトを実行できる機能をngx_mrubyに追加

タイトルそのままなのですが、nginxのworkerプロセスの初期化・exit時にRubyスクリプトを実行出来る機能をngx_mrubyに追加しました。

matsumoto-r/ngx_mruby · GitHub

ディレクティブ

mruby_init_worker

mruby_init_workerディレクティブはnginx.confのhttp{}セクションに設定を書くことができ、workerプロセスの初期化時に第一引数に渡されたRubyスクリプトファイルを実行します。

mruby_init_worker_code

mruby_init_worker_codeディレクティブはnginx.confのhttp{}セクションに設定を書くことができ、workerプロセスの初期化時に第一引数に渡されたRubyコードを実行します。

mruby_exit_worker

mruby_exit_workerディレクティブはnginx.confのhttp{}セクションに設定を書くことができ、workerプロセスのexit時に第一引数に渡されたRubyスクリプトファイルを実行します。

mruby_exit_worker_code

mruby_exit_worker_codeディレクティブはnginx.confのhttp{}セクションに設定を書くことができ、workerプロセスのexit時に第一引数に渡されたRubyコードを実行します。

mruby_init_code

mruby_init_codeディレクティブはnginx.confのhttp{}セクションに設定を書くことができ、nginx.conf読込時にRubyスクリプトを実行出来る機能です。これは以前から実装済みだったのですが、masterプロセス初期化時に実行されるので、そのタイミングでの実行を代替することができます。

サンプル

以下のように、nginx.confに上記ディレクティブを書いていたとします。(不必要な所は省略しています)

worker_processes  4;
daemon off;

http {

    mruby_init_code 'p "[#{Process.pid}] init master process"';

    mruby_init_worker_code '
      p "[#{Process.pid}] init worker process from inline code"
      Userdata.new.name = "matsumotory"
    ';

    mruby_exit_worker_code '
      p "[#{Process.pid}] exit worker process from inline code"
      p "Bye #{Userdata.new.name}"
    ';

    # ファイルパスを渡す場合
    #mruby_init_worker build/nginx/html/init_worker.rb;
    #mruby_exit_worker build/nginx/html/exit_worker.rb;

    server {
        listen       80;
        server_name  localhost;
   ・
   ・
   ・
    }
}

このように書いておいて、nginxを起動しCtrl+cで停止させると以下のように表示されます。

$ ./build/nginx/sbin/nginx
"[39571] init master process"
"[39572] init worker process from inline code"
"[39573] init worker process from inline code"
"[39575] init worker process from inline code"
"[39574] init worker process from inline code"

^C"[39575] exit worker process from inline code"
"[39574] exit worker process from inline code"
"[39573] exit worker process from inline code"
"Bye matsumotory"
"[39572] exit worker process from inline code"
"Bye matsumotory"
"Bye matsumotory"
"Bye matsumotory"

workerプロセス単位でデータストアにセッションを張っておきたい時などに有用だと思いますので、是非色々試してみてください。

masterプロセスの初期化時のみであれば、mruby_init_codeで代替できるのですが、masterプロセスの初期化・exit時にも上記の機能が必要そうであれば、また実装しようと思っています。