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


> **2014/12/03追記：**
> Apache2.4に導入する手順をこちらに書きました。
> ⇒ [mod_mruby を Amazon EC2、Apache2.4 へ導入する](http://qiita.com/hkusu/items/ca8622c83b0bfc2cac72)

---

前から気になってた [mod_mruby](https://github.com/matsumoto-r/mod_mruby) を試してみたメモです。
mod_mruby で、Apacheモジュールを Ruby(厳密には[mruby](https://github.com/mruby/mruby))で書けるようです。

過去にも少し Apache モジュールは書いたことがあるのですが（しょぼいですが 1つだけ [GitHub](https://github.com/hkusu/mod_header_note) にも上げてます）、Ruby で書いて、Apache で色々できたら素敵やん.. と思い。

ローカルに環境を作ってもよかったのですが、やはりちゃんとWEBサーバで動作させたかったので、Amazon EC2 に導入してみました。

> Apache バージョン：`2.2.27`
> mod_mruby バージョン：`1.4.1`
> Amazon Linux：AMI 2014.03.2（HVM）64bit

Apache の導入手順は下記の通りなのですが、恐らくデフォルトの `prefork` モードで動いていると思います。

# 環境の構築と mod_mruby の導入

## EC2 のセットアップ

ここではセットアップ手順は述べませんが、AMI は Quick Start の一番上にある Amazon Linux を利用しました。

![スクリーンショット 2014-08-16 17.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c3177a5e-901e-bc53-9192-0f04d5f87f07.png "スクリーンショット 2014-08-16 17.20.59.png")

また、Apache を立ち上げたいので、セキュリティグループの設定で 80番 ポートを開けておきます。

![スクリーンショット 2014-08-16 17.35.40.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c875b60d-bcc6-35b5-da73-b09c34a47445.png "スクリーンショット 2014-08-16 17.35.40.png")

※ アクセス元の IP は、出来るなら絞った方がよいと思います。

## Apache のインストール

恐らく apxs が必要なんだろうなと思い、devel 版をインストールしました。

```shell
$ sudo yum -y install httpd-devel
```

### 動作確認

Apache を起動します。

```shell
$ sudo /etc/init.d/httpd start
httpd を起動中:                    [  OK  ]
```

適当なブラウザで、EC2 の Public DNS もしくは Public IP でアクセスしてみます。次のようにおなじみのページが表示されればOKです。

![スクリーンショット 2014-08-16 17.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/35733/cbaf2395-e612-1d1d-c71e-f79bb5872d1d.png "スクリーンショット 2014-08-16 17.39.45.png")

## mod_mruby の導入

[このページのインストール手順](https://github.com/matsumoto-r/mod_mruby/wiki/Install) を参考に作業をすすめます。まず、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/sbin/apxs' APACHECTL_PATH_ENV='--with-apachectl=/usr/sbin/apachectl' sh build.sh
```

※ `apxs` と `apachectl` のパスは、今回の環境は `/user/sbin/` でした。ですので、上記でもそのように指定しています。

私の場合、コンパイルエラーが出たので、次のものをインストールしてから再度、実行しました。

```shell
$ sudo yum -y install gcc bison openssl-devel
$ sudo yum -y install hiredis-devel --enablerepo=epel
```

※ `hiredis-devel` は通常の yum リポジトリに存在しない？

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

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

すると、`/usr/lib64/httpd/modules/` に `mod_mruby.so` が配置されます。

![スクリーンショット 2014-08-16 21.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/8fbb5ef5-2dc2-80f4-2ee5-5c136b2dd8b2.png "スクリーンショット 2014-08-16 21.05.20.png")

Apache の設定ファイル `/etc/httpd/conf/httpd.conf` を見てみると、すでにこのモジュールを読み込む記述が追記されているようなので、

![スクリーンショット 2014-08-16 21.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/35733/64b9c97e-9b2b-a3e5-7f98-87a5d68e16bd.png "スクリーンショット 2014-08-16 21.09.17.png")

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

```shell
$ sudo /etc/init.d/httpd restart
httpd を停止中:                    [  OK  ]
httpd を起動中:                    [  OK  ]
```

以上で導入は完了です^^

# mod_mruby を試してみる

git colone した `mod_murby` ディレクトリに、テスト用のスクリプト（test/test.rb）があるので、それを動かしてみます。

テスト用のスクリプトを、Apache の DocumentRoot 直下へコピーします。

```shell
$ sudo cp test.rb /var/www/html/
```

Apache側で、mod_mruby の設定をします。mod_mruby 用の conf ファイルを作成し、

```shell
$ sudo touch /etc/httpd/conf.d/mruby.conf
```

次のように記載します。

```apache:/etc/httpd/conf.d/mruby.conf
<Location /mruby-test>
    mrubyHandlerMiddle /var/www/html/test.rb
</Location>
```

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

```shell
$ sudo /etc/init.d/httpd restart
```

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

![スクリーンショット 2014-08-16 21.49.55.png](https://qiita-image-store.s3.amazonaws.com/0/35733/3527cac8-1a33-939f-11ef-a6074952efe0.png "スクリーンショット 2014-08-16 21.49.55.png")

ちゃんと動作しているようです^^

# おわりに

今回は環境の構築と動作確認までを行いました。次回は、実際に何かモジュールを書いていきます。