Rubyをブラウザアクセスで実行【coreserver】

Rubyが入っている場所を調べる

ブラウザからアクセスする場合、ファイルにサーバに保存されているRubyのPATHを記述する必要があるので、まずPATHを調べます。
こちらのページよくある質問 | CORESERVERにも載っていますが、シェルを繋いでコマンドでも調べられます。

$ which ruby
/usr/local/bin/ruby
$ ruby -v
ruby 1.8.5 (2006-12-04 patchlevel 2) [i686-linux]

のような感じでしらべます。

#!/usr/local/bin/ruby
print "Hello"

を拡張子「.cgi」で保存します。 ブラウザでアクセスすると、エラーまたはソースがそのまま表示されます。

#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"
print "Hello"

httpのヘッダが必要みたいです。 あと、.cgi だと、ローカルで作ったファイルをいちいち .rb から変更しないといけないので、.htaccessで.rbでも動くように設定します。(ここからがとてもハマりました。)

AddHandler cgi-script .rb
AddType "text/html; charset=UTF-8" .rb
DirectoryIndex index.html index.rb index.cgi

結果的にhtaccessの設定はこれでよかったのですが、何度してもエラーになりました。。。

CGIWrap Error: Script Execution Failed

↑こんなのが表示されます。 ググるとCGIは改行コードが CR+LF だとエラーになるとか、そこで改行コードを LF に変更するとうまくいきました。 .cgi のときは CR+LF でエラーにならなかったので、時間がかかりました。。。」

#!/usr/local/bin/ruby

print <<HERE
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
<head>
    <meta charset="UTF-8">
    <title>現在時刻表示</title>
</head>

<body>
<p>
    現在時刻表示 <br />
    #{Time.now.strftime("%H 時 %M 分 %S 秒")} です。
</p>
</body>
</html>
HERE

追加したRuby(2.1.1)で実行する

初めからインストールされているRuby以外で実行する時も、手順は同じです。

coreserverのRubyをバージョンアップする方法[2.1.1] のように追加した場合です。

環境PATHに設定した、rubyのパスを調べます。PATHの設定が反映されている場合は、デフォルトのPATH以外のものが表示されるはずです。

which ruby
/virtual/【user_name】/lib/ruby/bin/ruby
ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]

あとは、パスを変更して実行します。

#!/usr/local/bin/ruby
↓
#!/virtual/【user_name】/lib/ruby/bin/ruby

サンプルです。

#!/virtual/【user_name】/lib/ruby/bin/ruby

print <<HERE
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
<head>
<meta charset="UTF-8">
<title>別途インストールしたruby2.1.1を実行するサンプル </title>
</head>
<body>
<pre>
HERE

print "バージョン : ",RUBY_VERSION, "<br />"

fib = [1, 1]
(0..10).each {|i|
  fib << fib[i] + fib[i+1]
}
p fib

puts "</pre></body>"
puts "</html>"