Apache
AWS
AdventCalendar
mruby
mod_mruby

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

More than 3 years have passed since last update.

こんにちわ。これは mod_mruby ngx_mruby Advent Calendar 2014 の3日目(12/3)の投稿です。アドベントカレンダーなので mod_murby に関する説明は省きます。

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


ちなみに私はインフラ専業ではないので、おかしなところがあったら適当に読み替えてください^^; また Apache2.2 に導入する手順については以前に書きました。

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


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


Apache バージョン:2.4.10

mod_mruby バージョン:1.9.7

Amazon Linux:

スクリーンショット 2014-11-27 19.28.17.png


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


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

Apache 2.4 のインストール手順については以前に書いたので、こちらを参考にしてください。

Apache2.4 & Amazon EC2 で Apacheモジュール開発

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


設定ファイルの場所:/usr/local/apache2/conf/

ドキュメントルート:/usr/local/apache2/htdocs/

各コマンドのパス:/usr/local/apache2/bin/



mod_mruby の導入

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

$ sudo yum -y install git

GitHub から mod_mruby を clone し、

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

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

$ 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


apxsapachectl のパスはその環境へ合わせてください。


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

$ sudo yum -y install bison openssl-devel


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


また、mod_mruby では mruby用のgem を組み込めるのですが、どれを組み込むかは build_config.rb で設定するようです(わたし調べ)。

この中で、mruby-redishiredis(KVS の Redis のこと?)が必要そうなので外しています。


build_config.rb


conf.gem :github => 'mattn/mruby-json'
+#conf.gem :github => 'matsumoto-r/mruby-redis'
conf.gem :github => 'matsumoto-r/mruby-vedis'


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

$ cd mod_mruby

$ sudo make install

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


/usr/local/apache2/conf/httpd.conf


LoadModule mruby_module modules/mod_mruby.so


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

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

以上で導入は完了です!


mod_mruby の動作確認

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

次のように書きます。


/usr/local/apache2/mruby/test.rb

Apache.echo "Hello World"


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

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

次のように記載します。


/usr/local/apache2/conf/extra/mruby.conf

<Location /test>

mrubyHandlerMiddle /usr/local/apache2/mruby/test.rb
</Location>

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


/usr/local/apache2/conf/httpd.conf



Include conf/extra/mruby.conf


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

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

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

スクリーンショット_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 に書いていけばよいかと。


開発の参考になりそうなもの:

4日目は hfm さんによる ngx_mruby の記事になります!