---
title: "ライフタイム"
language: "ja"
documentation_version: "3.x"
channel: "development"
release_context: null
source_revision: "10297d1e28653321d6996609fc53718d3b7c8278"
working_tree_clean: true
source_path: "docs/ja/concepts/lifetimes.md"
source_sha256: "fc68821aa8286fab41f252f04709fedf4916cfab1a0365b0a5feb19b5a61e8ab"
source_at_revision: true
source_url: "https://github.com/matsumotory/ngx_mruby/blob/10297d1e28653321d6996609fc53718d3b7c8278/docs/ja/concepts/lifetimes.md"
html_url: "https://ngx.mruby.org/ja/concepts/lifetimes/"
markdown_url: "https://ngx.mruby.org/markdown/ja/concepts/lifetimes.md"
last_updated: "2026-10-29"
---

# ライフタイム

nginxは、設定を読む間に、`http {}`ブロックに1つ、`stream {}`ブロックに1つの`mrb_state`を作ります。nginxがワーカープロセスをforkすると、各ワーカーはその状態の自分のコピーを持ちます。ワーカーは、自分のすべてのリクエストのRubyのコードを、そのコピーで実行します。状態はリクエストごとには作らないので、あるリクエストが状態の中に残したものを、同じワーカーの次のリクエストが見ます。

`http {}`ブロックの`mrb_state`を、nginxが設定を読むときからワーカーが終わるまで示します。

図のラベル（順序は接続を表しません）:

- open: masterプロセスで、`mrb_open`が`mrb_state`を作る。nginxはディレクティブを読む間にそのコードをコンパイルし、serverのコンテキストのコードを実行する。その後に`mruby_init`が動く
- fork: nginxがワーカーを起動する。各ワーカーは`mrb_state`の自分のコピーを持つ
- init-worker: ワーカーが`mruby_init_worker`を実行する
- requests: ワーカーのすべてのリクエストが、その`mrb_state`でハンドラとフィルタを実行する。グローバル変数、定数、メソッド、クラスは残り、ngx_mrubyは実行が終わるたびに例外の`mrb->exc`だけを消す
- exit-worker: ワーカーが止まり、`mruby_exit_worker`を実行する

Source: ngx_mruby 0c72e3970 (2026-10-19)

- `src/http/ngx_http_mruby_module.c`: 575-598, 600-632, 727-730, 1136-1142, 1282-1300, 1421-1450

## ワーカーがリクエストをまたいで保つもの

nginxは、設定を読む間に、`http {}`ブロックに1つの`mrb_state`を作り、`stream {}`ブロックにも1つ作ります。nginxは、ワーカーを起動する前に、masterプロセスで、その状態を使って初期化のコードとserverの設定のコードを実行します。そのうち初期化のコードは`mruby_init`と`mruby_stream_init`で、serverの設定のコードは`mruby_server_context_handler_code`です。nginxがワーカープロセスをforkすると、各ワーカーは自分のコピーを持ちます。ワーカーは、そのブロックのほかのmrubyのコードを、すべてそのコピーで実行します。init_workerとexit_workerのコードと、すべてのserverとlocationのハンドラとフィルタを、すべてのクライアントについて実行します。リロードや再起動では、新しいワーカーが新しい状態とともに起動します。

グローバル変数、定数、`main`のインスタンス変数、`def`で定義したメソッド、定数を含むクラスとモジュール、`Userdata`が持つ値は、リクエストをまたいでワーカーに残ります。`main`は、ハンドラのコードの`self`のことです。`Userdata`は、値を1つのグローバル変数に入れて保持します。あるリクエストが残したものは、同じワーカーが後に処理するすべてのリクエストから見えます。変更の後にコードが例外を起こした場合も同じです。各ワーカーは自分のコピーを持つので、あるワーカーから、ほかのワーカーの値は見えません。ngx_mrubyは、実行が終わるたびに例外の`mrb->exc`を消します。また、`cache`の無いスクリプトのファイルを、次の実行のときに読み直してコンパイルします。インラインのコードとキャッシュしたスクリプトは、起動時にコンパイルしたバイトコードのままです。ガベージコレクタは、参照されなくなったオブジェクトを解放します。ローカル変数は残りません。ハンドラのコードは、実行のたびにローカル変数の無い状態から始まります。

1つのリクエストのデータを、グローバル変数、定数、`main`のインスタンス変数、`Userdata`に置かないでください。そのワーカーの次のリクエストが、どのクライアントからのものでも、そのデータを見ます。ローカル変数を使い、リクエストは`Nginx::Request`、`Nginx::Var`、`Nginx::Headers_in`、`Nginx::Headers_out`で読み書きしてください。`stream {}`ではコードがセッションごとに動くので、`Nginx::Stream::Connection`で読み書きしてください。同じリクエストの後のハンドラへデータを渡すには、`set $name "";`でnginxの変数を宣言し、`Nginx::Var`で読み書きします。または、`Userdata`の値を、読む前にすべてのリクエストで設定します。locationの`set`は`mruby_rewrite_handler`の後に動き、変数を空に戻します。そのため、rewriteハンドラが書く変数は、`server {}`ブロックの`set`で宣言してください。グローバル変数と定数には、initやinit_workerのコードが用意する設定のような、ワーカーのすべてのリクエストで共有するものだけを置いてください。グローバル変数は、[`Nginx.remove_global_variable`](/ja/reference/ruby/#nginxremove_global_variable)で消せます。

`stream {}`ブロックのRubyのコードも、自分の`mrb_state`で同じように動きます。そこで動くのは、`mruby_stream_init`、`mruby_stream_init_worker`、各セッションのコードと、`mruby_stream_exit_worker`です。
