OS XのWeb共有でErubis(eRuby)を動かしてみた

OS XのWeb共有でeRubyを動かせるようにしてみた - NAT’s Programming Champloo
これの続きです。このときは、eRubyのC実装のerubyを入れて動かしたのですが、今回はerubyより10%速いというErubisを使ってみました。
インストールはRubyGemsで。

$ sudo gem install --remote erubis

Erubisには、eRubyスクリプトrubyスクリプトに変換したキャッシュファイルを生成する機能(File Caching)があるので、これを使うなら、ディレクトリのアクセス権限を適切に指定する必要がある。
Unixでのセキュリティ設定はあまり詳しくないので、どう設定するのが適切なのかよく分からないのだけど、以下を参考に指定。

Erubis Users' Guide - kuwata-lab.com

OS Xが組み込みで持っているApacheの場合、Apacheプロセスはユーザー"_www"で起動しているようなので、ユーザー"_www"が所属するグループがファイル作成できるように、ディレクトリにアクセス権限を指定。

$ cd ~/Sites/cgi  #eRubyスクリプトを置くディレクトリへ移動
$ sudo chgrp _www .
$ sudo chmod 775 .

eRubyスクリプトの実行の方は、Apacheから直接erubisコマンドを起動するのではなく、CGIで起動したrubyスクリプト経由で呼び出すことにした。この方が、eRuby呼ぶ前に色々前処理できそうなのと*1、設定ファイルを変更しなくて済む。

OS XのWeb共有でCGIを動かせるようにしてみた - NAT’s Programming Champloo

上記で示した設定をして、cgiスクリプトは起動できる状態になっているとして、例えば、環境変数を一覧表示するeRubyスクリプトを起動するrubyスクリプトは下記の通り。

#!/usr/bin/ruby -rubygems
require 'cgi'
require 'erubis'

cgi = CGI.new
cgi.out({'charset'=>'utf-8'}) do
  Erubis::EscapedEruby.load_file('printenv.rhtml').evaluate
end

起動されるeRubyスクリプトprintenv.rhtmlは、こんな感じ。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>環境変数一覧</title></head>
<body>
  <h1>環境変数一覧</h1>
  <table border>
    <tr><th>名前</th><th></th>
    <% ENV.each do |key,value| %>
      <tr><td><%=key%></td><td><%=value%></td></tr>
    <% end %>
  </table>
</body>
</html>

ちなみに、WebブラウザからCGIにアクセスしてInternal Server Errorが出ているときは、/var/log/apache2/error_log を見れば、エラー出力が確認できる。eRubyスクリプトが動くまで、何度このファイルを見たことか・・・。

*1:デザインパターンで言うなら、MVCパターンのControllerとModelをrubyで実装して、ViewをeRubyで実装という設計。