約束の地

キャロの想い出

Ubuntu 16.04 LTS の Apache 上で Ruby を CGI として動かす方法

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

*1:もちろん /etc/apache2/sites-available/000-default.conf に書いてもいいです

*2:which コマンドで調べましょう

*3:Perl で言う End of script output before headers エラー

Powered by はてなブログ