mod_mruby を Amazon EC2、Apache2.4 へ導入する


こんにちわ。これは [mod_mruby ngx_mruby Advent Calendar 2014](http://qiita.com/advent-calendar/2014/mod-ngx-mruby) の３日目(12/3)の投稿です。アドベントカレンダーなので [mod_murby](https://github.com/matsumoto-r/mod_mruby) に関する説明は省きます。

今回は Aazon EC2 (OS: Amazon Linux) 上の Apache2.4 に mod_mruby を導入する手順について書きたいと思います。

> ちなみに私はインフラ専業ではないので、おかしなところがあったら適当に読み替えてください^^; また Apache2.2 に導入する手順については以前に書きました。
> ⇒ [mod_mruby を Amazon EC2、Apache2.2 へ導入する](http://qiita.com/hkusu/items/09d0515c80206d264bee)

詳細なバージョンは次のとおりです。

> Apache バージョン：`2.4.10`
> mod_mruby バージョン：`1.9.7`
> Amazon Linux：
> ![スクリーンショット 2014-11-27 19.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/35733/bf40eeb3-588e-11d1-342e-f9bd16f1924d.png "スクリーンショット 2014-11-27 19.28.17.png")

Apache の導入手順は下記の通りなのですが、恐らくデフォルトの `event mpm` モードで動いていると思います。（後から思うと無難に `prefork` にしておけば良かったと思わなくもない。）

## EC2 へ Apache2.4 をインストール

Apache 2.4 のインストール手順については以前に書いたので、こちらを参考にしてください。
⇒ [Apache2.4 ＆ Amazon EC2 で Apacheモジュール開発](http://qiita.com/hkusu/items/29014c70119223e6b555)

結果的に、各パスは次のようになっています。

> 設定ファイルの場所：/usr/local/apache2/conf/
> ドキュメントルート：/usr/local/apache2/htdocs/
> 各コマンドのパス：/usr/local/apache2/bin/

## mod_mruby の導入

まず、Git が必要なので、Git を yum でインストールします。

```shell
$ sudo yum -y install git
```

GitHub から mod_mruby を clone し、

```shell
$ git clone git://github.com/matsumoto-r/mod_mruby.git
```

コンパイル用のスクリプトを実行します。

```shell
$ cd mod_mruby
$ APXS_PATH_ENV='--with-apxs=/usr/local/apache2/bin/apxs' APACHECTL_PATH_ENV='--with-apachectl=/usr/local/apache2/bin/apachectl' sh build.sh
```

> `apxs` と `apachectl` のパスはその環境へ合わせてください。

私の場合、コンパイルエラーが出ました。エラーの度に必要なものをインストールして再実行すればいいのですが、結果的に下記の２つをインストールすればOKでした。

```
$ sudo yum -y install bison openssl-devel
```

> gcc は Apache のコンパイルの際に導入済みだった。

また、mod_mruby では [mruby用のgem](https://github.com/mruby/mgem-list) を組み込めるのですが、どれを組み込むかは `build_config.rb` で設定するようです（わたし調べ）。
この中で、`mruby-redis` は `hiredis`(KVS の Redis のこと？)が必要そうなので外しています。

```diff:build_config.rb
〜
conf.gem :github => 'mattn/mruby-json'
+#conf.gem :github => 'matsumoto-r/mruby-redis'
conf.gem :github => 'matsumoto-r/mruby-vedis'
〜
```

コンパイルが成功したら、次のように Apache へ組み込みます。

```shell
$ cd mod_mruby
$ sudo make install
```

すると、`/usr/local/apache2/modules/` 配下に `mod_mruby.so` が配置され、Apache の設定ファイル（`/usr/local/apache2/conf/httpd.conf`）を見てみると、mod_mruby をロードする記述が自動で追記されています。

```apacheconf:/usr/local/apache2/conf/httpd.conf
〜
LoadModule mruby_module       modules/mod_mruby.so
〜
```

Apache を再起動して、有効にします。

```shell
$ sudo /usr/local/apache2/bin/httpd -k restart
```

以上で導入は完了です！

# mod_mruby の動作確認

`/usr/local/apache2` あたりに `mruby` ディレクトリを作成し、その配下に mod_mruby 用のスクリプトを置くことにします。（このあたりは任意）

次のように書きます。

```ruby:/usr/local/apache2/mruby/test.rb
Apache.echo "Hello World"
```

Apache側で、mod_mruby の設定ファイルを新規に作ります。

```shell
$ sudo touch /usr/local/apache2/conf/extra/mruby.conf
```

次のように記載します。

```apache:/usr/local/apache2/conf/extra/mruby.conf
<Location /test>
    mrubyHandlerMiddle /usr/local/apache2/mruby/test.rb
</Location>
```

Apache 本体の設定ファイルから、上記の mod_mruby 用の設定ファイルを読むこむようにします。

```apache:/usr/local/apache2/conf/httpd.conf
〜
Include conf/extra/mruby.conf
〜
```

保存したら Apache を再起動し、

```shell
$ sudo /usr/local/apache2/bin/httpd -k restart
```

ブラウザで `/test` へアクセスしてみます。

![スクリーンショット_2014-11-27_19_00_12.png](https://qiita-image-store.s3.amazonaws.com/0/35733/112d21da-74dc-c4db-d5c5-f42fe2cddeb1.png "スクリーンショット_2014-11-27_19_00_12.png")

上記の `test.rb` は、修正した場合でも Apache の再起動なしで適用されますし、設定ファイルから読み込む際に `.. /usr/local/apache2/mruby/test.rb cache` という風に `cache` オプションをつけておけば、スクリプトは Apache(mod_mruby) にキャッシュされるようです。
（キャシュした場合は、スクリプト修正の度に Apache の再起動は必要？）

## おわりに

あとは `/usr/local/apache2/mruby/` 配下に任意のスクリプトを置き、mod_mruby に関する Apache の設定は `/usr/local/apache2/conf/extra/mruby.conf` に書いていけばよいかと。

### 開発の参考になりそうなもの：

- mod_mruby の Wiki（GitHub）
	- https://github.com/matsumoto-r/mod_mruby/wiki
	- スクリプトのサンプル
		- https://github.com/matsumoto-r/mod_mruby/tree/master/example
- mruby用の gem
	- https://github.com/mruby/mgem-list
	- いろいろあるので、便利そうなものを組み込んでみたり、足りないものは自分で作ってみてもいいかもですね。

４日目は [hfm](http://qiita.com/hfm) さんによる ngx_mruby の記事になります！