---
title: "リクエストのフェーズ"
language: "ja"
documentation_version: "3.x"
channel: "development"
release_context: null
source_revision: "10297d1e28653321d6996609fc53718d3b7c8278"
working_tree_clean: true
source_path: "docs/ja/concepts/request-phases.md"
source_sha256: "f9e771eea73faa619716183fe8881666cb2c876f16d7c610c1c7ed0228df59aa"
source_at_revision: true
source_url: "https://github.com/matsumotory/ngx_mruby/blob/10297d1e28653321d6996609fc53718d3b7c8278/docs/ja/concepts/request-phases.md"
html_url: "https://ngx.mruby.org/ja/concepts/request-phases/"
markdown_url: "https://ngx.mruby.org/markdown/ja/concepts/request-phases.md"
last_updated: "2026-10-29"
---

# リクエストのフェーズ

nginxは、HTTPのリクエストを決まった順のフェーズで処理します。ngx_mrubyは、そのうちの6つのフェーズにハンドラを加えます。また、rewriteモジュールの中で`mruby_set`を実行し、nginxのフィルタチェーンにヘッダフィルタとボディフィルタを加えます。TLSのハンドシェイクの間にもハンドラを1つ実行します。TCPとUDPでは、streamモジュールのaccessフェーズでハンドラを実行します。

nginxがHTTPのリクエストを処理するフェーズを順に並べ、各フェーズでRubyを実行するngx_mrubyのディレクティブを示します。TCPとUDPのセッションで動くハンドラも示します。

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

- h-phase: nginxが処理する順
- h-handler: ngx_mrubyがRubyを実行する場所
- tls: TLSのハンドシェイク
- tls-h: `mruby_ssl_handshake_handler`
- post-read: post-read
- post-read-h: `mruby_post_read_handler`
- server-rewrite: server rewrite
- server-rewrite-h: `mruby_server_rewrite_handler`
- server-rewrite-set: rewriteモジュールの`mruby_set`
- find-config: find config
- rewrite: rewrite
- rewrite-h: `mruby_rewrite_handler`
- rewrite-set: rewriteモジュールの`mruby_set`
- post-rewrite: post-rewriteとpreaccess
- access: access
- access-h: `mruby_access_handler`
- post-access: post-accessとprecontent
- content: content
- content-h: `mruby_content_handler`
- header-filter: ヘッダフィルタ
- header-filter-h: `mruby_output_header_filter`
- body-filter: ボディフィルタ
- body-filter-h: `mruby_output_body_filter`
- log: log
- log-h: `mruby_log_handler`
- stream: TCPかUDPのaccess
- stream-h: `mruby_stream`

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

- `src/http/ngx_http_mruby_module.c`: 431, 638-721, 1742-1824, 1954-1965
- `src/stream/ngx_stream_mruby_module.c`: 787
- nginx 1.31.6, `src/http/ngx_http_core_module.h`: 111-128

表の各ディレクティブは、Rubyのスクリプトのパスを受け取ります。どのディレクティブにも、`mruby_access_handler_code`のように名前の最後に`_code`が付く形があります。その形はRubyのコードを直接受け取ります。

| 実行する時点 | ディレクティブ |
|---|---|
| TLSのハンドシェイクの間 | `mruby_ssl_handshake_handler` |
| post-read | `mruby_post_read_handler` |
| server rewrite | `mruby_server_rewrite_handler` |
| rewrite | `mruby_rewrite_handler` |
| access | `mruby_access_handler` |
| content | `mruby_content_handler` |
| レスポンスのヘッダを送るとき | `mruby_output_header_filter` |
| レスポンスのボディを送るとき | `mruby_output_body_filter` |
| log | `mruby_log_handler` |
| rewriteモジュールが動くserver rewriteとrewrite | `mruby_set` |
| streamモジュールのaccess | `mruby_stream` |

nginxは、リクエストを読む前にTLSのハンドシェイクを済ませます。find config、post-rewrite、preaccess、post-access、precontentの各フェーズでは、ngx_mrubyのハンドラは動きません。`mruby_set`は、rewriteモジュールが`set`を実行するところで、Rubyで変数を設定します。`server`ブロックに書いた`mruby_set`はserver rewriteフェーズで動き、`location`に書いた`mruby_set`はrewriteフェーズで動きます。ヘッダフィルタとボディフィルタは、nginxがレスポンスを送る間に動きます。レスポンスを作ったのが、contentフェーズのハンドラでも、upstreamでも、前のフェーズの`return`やエラーでも同じです。logフェーズは、レスポンスを送った後に来ます。nginxのフィルタチェーンの中では、ngx_mrubyのフィルタは、nginxのnot modifiedのヘッダフィルタと、rangeとcopyのボディフィルタの後に動き、ほかのモジュールのフィルタより先に動きます。`mruby_post_read_handler`は`http`と`server`のブロックに、`mruby_ssl_handshake_handler`は`server`ブロックに書けます。そのほかのハンドラは`location`にも書けます。
