Ruby を CGI で動かす
あんまりやる人はいないかなと思うんですが、Ruby を Apache で CGI として動かそうとして結構ハマってしまったので書き留めておきます。
Apache の cgi モジュールと mod_rewrite モジュールをON にする
しましょう。再起動も忘れずに。mod_rewrite は .htaccess を使わない場合(後述)は不要です。
# a2enmod cgi # a2enmod rewrite # service apache2 restart
Ruby のインストール
当たり前ですが Ruby を入れます。gem のことを考えて ruby-dev と build-essential も入れますが、必須ではないので飛ばしてもいいです。
# apt-get update # apt-get install -y ruby ruby-dev build-essential
ruby-dev が入らない(リポジトリがない)場合
Docker の公式イメージを使ったりするとそうなりますが、apt-get update しても ruby-env がない場合があります。その時はリポジトリを登録します。ただ、リポジトリを登録するための apt-add-repository が入っていないこともあるので、そちら(software-properties-common)から順を追って入れていきます。
# apt-get install -y software-properties-common # apt-add-repository ppa:brightbox/ruby-ng # apt-get update # apt-get install -y ruby-dev
.htaccess に CGI の設定を書いて設置する
Apache の設定ファイルに CGI の設定を書いてもいいですが、サクッと書けるので .htaccess に設定を書きましょう*1。
Options +ExecCGI AddHandler cgi-script .rb
なお、.httaccess に設定を書く場合は、/etc/apache2/sites-available/000-default.conf に AllowOverride を書きましょう。
<Directory /var/www/html> AllowOverride All </Directory>
まあここまでするくらいなら /etc/apache2/sites-available/000-default.conf に CGI の設定を以下のように書いてもいいですが……。
<Directory /var/www/html> Options +ExecCGI AddHandler cgi-script .rb </Directory>
*.rb を書く
ようやくコードが書けます。一行目の ruby の場所を指定する部分を間違えないようにし*2、HTML のヘッダの出力部分と文字コードの指定の部分も忘れないようにしましょう。忘れると 500 エラーになることがあります*3。
#!/usr/bin/ruby print "Content-type: text/html\n\n" print "<html>\n" print '<head><meta charset="UTF-8"></head>' + "\n" print "<body>" print "Hello, World!\n" print "</body>\n" print "</html>\n"
*.rb のパーミッションを設定する
*.rb のファイルに実行権限を与えましょう。
Webブラウザでアクセスする
Hello, World! が表示されれば成功です。動かなかったりエラーが出る場合は上記の手順を見直してみてください。
eRuby の場合
補足ですが、eRuby の場合は .htaccess に Action application/x-httpd-eruby hoge.rb と書くと思います。このとき actions が入っていないと 500 エラーになりますので入れてあげましょう。また hoge.rb の箇所は、ドキュメントルートからのパスを書きましょう。
# a2enmod actions