タイトルそのままなのですが、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時にも上記の機能が必要そうであれば、また実装しようと思っています。