質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.90%

ApacheでRubyスクリプトにアクセスするとShebangでエラーが出る。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,626

score 74

皆様おはようございます。
ご相談させていただきたいのですが、先日VPSを初めて契約し、CentOSでサーバーの学習を始めましたところ、rubyのCGIの利用でエラーが出てしまい、ブラウザで表示することができず、internal server errorが出てしまっています。試行錯誤してみたのですが、改善が見られず、皆様のお力をお借りしたいです。

以下がその詳細です。

test.cgi(パス:/var/www/cgi-bin/test.cgi)

#!/root/.rbenv/versions/2.4.1/bin/ruby
require 'rbconfig'
Ruby = File::join(RbConfig::CONFIG['bindir'],
                  RbConfig::CONFIG['ruby_install_name'])
Ruby << RbConfig::CONFIG['EXEEXT']

puts Ruby

print "Hello World!\n"


これを

ruby test.cgi

として実行すると、以下のようにコンソールに出力されます。

/root/.rbenv/versions/2.4.1/bin/ruby
Hello World!

ここで出力されたパスがrubyのインタプリタのパスです。
ここで

sudo -u apache -S /bin/bash -c /var/www/cgi-bin/test.cgi

を実行すると

/bin/bash: /var/www/cgi-bin/test.cgi: /root/.rbenv/versions/2.4.1/bin/ruby: 誤ったインタプリタです: 許可がありません

とエラーが出てしまいます。

ちなみにtest.cgiとその親ディレクトリのパーミッションは755に設定しており、VPSの提供元の推奨と一致しており、ファイルやディレクトリのパーミッションの問題では無さそうです。またソースコードの改行文字に関しては、nkfコマンドで修正したので、問題は無いはずです。

また、

printenv

を実行すると、

SHELL=/bin/bash
USER=root
PATH=/root/.rbenv/shims:/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/etc/sysconfig
LANG=ja_JP.utf8
RBENV_SHELL=bash
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/bin/printenv
OLDPWD=/var/www/cgi-bin

と出力(一部省略)されました。
「誤ったインタプリタです」のエラーが解決への糸口だとは思うのですが、ここから先に進めずにいます。
解決方法や、原因として疑われる点等ありましたら、ご教授いただけないでしょうか?

また、cgi-binディレクトリのパーミッションは以下のようになっております。

ls -l
合計 4
drwxrwxr-x 2 apache username   88  2月  1 07:27 cgi-bin
drwxrwxr-x 4 apache username 4096  2月  1 07:27 html

cgi-binディレクトリ内のファイルのパーミッションは以下の通りです。

ls -l
合計 52
-rwxr-xr-x 1 root root   565  1月 31 22:21 index.css
-rwxr-xr-x 1 root root 36864  1月 31 22:08 report.db
-rwxr-xr-x 1 root root   231  2月  1 06:21 test.cgi
-rwxr-xr-x 1 root root  3536  1月 31 22:08 thread.cgi
-rwxr-xr-x 1 root root  3373  1月 31 22:34 toppage.cgi

/root/

drwxr-xr-x  12 root root  4096  1月 30 11:29 .rbenv

/root/.rbenv/

-rw-r--r-- 1 root root  3390  1月 30 11:16 CONDUCT.md
-rw-r--r-- 1 root root  1058  1月 30 11:16 LICENSE
-rw-r--r-- 1 root root 18527  1月 30 11:16 README.md
drwxr-xr-x 2 root root    18  1月 30 11:16 bin
drwxr-xr-x 2 root root    56  1月 30 11:16 completions
drwxr-xr-x 2 root root  4096  1月 30 11:16 libexec
drwxr-xr-x 3 root root    23  1月 30 11:20 plugins
drwxr-xr-x 3 root root    17  1月 30 11:16 rbenv.d
drwxr-xr-x 2 root root    78  2月  1 08:56 shims
drwxr-xr-x 2 root root    87  1月 30 11:16 src
drwxr-xr-x 3 root root  4096  1月 30 11:16 test
-rw-r--r-- 1 root root     6  2月  1 00:09 version
drwxr-xr-x 3 root root    18  1月 30 11:22 versions

/root/.rbenv/bin/

lrwxrwxrwx 1 root root 16  1月 30 11:16 rbenv -> ../libexec/rbenv

/root/.rbenv/shims/

-rwxr-xr-x 1 root root 385  1月 30 11:35 erb
-rwxr-xr-x 1 root root 385  1月 30 11:35 gem
-rwxr-xr-x 1 root root 385  1月 30 11:35 irb
-rwxr-xr-x 1 root root 385  1月 30 11:35 rake
-rwxr-xr-x 1 root root 385  1月 30 11:35 rdoc
-rwxr-xr-x 1 root root 385  1月 30 11:35 ri
-rwxr-xr-x 1 root root 385  1月 30 11:35 ruby

参考にしたサイト
shebangについて
teratailの過去の似た質問

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stan_Dma

    2019/02/01 08:47 編集

    I have said about the ruby binary. Can the apache user access /root/.rbenv and its child direcotires?

    キャンセル

  • Stan_Dma

    2019/02/01 09:15

    Fragile, I mean in terms of security... You should not have rbenv stuffs installed under the root directory. It's very vulnerable. One of the recommended ways to install ruby related files is to install in, say, FOO user's directory, which the user belongs to apache group. This way should need /home/FOO/.rbenv directory has 775 permissions. There are some other ways to go.

    キャンセル

  • witchy

    2019/02/01 10:28

    Oh, I see.
    Thank you for your kind advice.
    I'm so grateful for pioneer's advice!
    I'm sorry for my poor english, but I want to tell you my thanks.
    I'll put your advice to good use.
    お手数おかけし、本当に申し訳ございません。
    そもそも、セキュリティ的に問題があるのですね。
    少し時間はかかりそうですが、改善できるか試してみます。
    本当にご回答いただきありがとうございます。

    キャンセル

回答 3

+4

大前提として、「rbenvを使うにはeval "$(rbenv init -)"を行う必要がある」点があります。
これは、rbenvは一般ユーザが一般ユーザの権限でrubyのバージョンを切り替えられる仕組みとして作られており、システムユーザが使うことは想定していないことを意味しています。

apacheユーザがapacheのプロセスからrbenv配下のrubyを呼ぶ場合、initするタイミングがありません。
(もしかしたらapacheの起動スクリプトを工夫すればやれるかも知れませんが、試行錯誤が必要かも知れません。)

直近のエラーの原因は/root/ディレクトリ以下をapacheユーザが参照できないことによるパーミッションのエラーですが、それが解決したとしても、現状では標準ライブラリは使えるかも知れませんが、gemパッケージなどは参照できないことが予想されます。

私は、shebangにrbenv配下のrubyのパスを直書きすることが間違いであると考えます。cgi用途でrbenvを使うことを見直すことを強くお勧めします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 15:39 編集

    CGI用途で、かつ最新の2.6の機能をバキバキ使いたい、という要望はかなりのニッチな要望かと思います。
    しかも今回ご使用されているのは2.4.1と、最新でもないです。
    大概の要求は公式の`yum install ruby`で入るもので事足ります。

    キャンセル

  • 2019/02/05 02:31

    ご回答ありがとうございます。
    先ほどブラウザ上でも動くことを確認しました。
    アドバイスに反し、rbenvを使っての確認ですが、理由といたしましては、私の環境では'yum install ruby'でインストールできるものは古いバージョンで、調べたところ最新のものに変更するにはソースコードから直接コンパイルする必要があるようで、今の私には力不足だと感じたためです。ですので、rbenvで2.6をインストールすることにしました。
    kaztoさんがおっしゃった通り、今の私には使いこなせないし、使う以前の理解の部分が未熟だなと感じました。初心者である私は、まずは調べるにもキーワードを知らないことが多いです。今回も、皆さんのご回答のなかから、キーワードをひねり出したというところがあります。
    ですので、キーワードを自力で導き、自己解決能力を高めるためにも、背伸びはせず、基礎からきちんと学んで行こうと思います。
    質問と関係のないことを話し、誠に申し訳ございませんが、kaztoさんのブログを見させていただき、自分が考えたことをお伝えしたく思ったので、ご迷惑かと思いつつ、話させていただきました。

    長くなりましたが、この度は、ご回答いただき本当にありがとうございました。

    キャンセル

  • 2019/02/05 15:21

    > 調べたところ最新のものに変更するにはソースコードから直接コンパイルする必要があるようで、今の私には力不足だと感じたためです。ですので、rbenvで2.6をインストールすることにしました。

    複数のバージョンを使い分けるという要件がなければ、rbenvより、単独でソースからインストールする方が簡単ですよ。この質問のような問題もまず起きませんし。

    キャンセル

checkベストアンサー

+2

Apacheユーザーが、/root/.rbenv/versions/2.4.1/bin/rubyへのアクセス権がないためです。
質問文に書かれていませんが、おそらく/rootdr-xr-x---で読めない。
セキュリティを度外視すれば、chmod o+rx /rootすれば動きます。

rbenvつかうなら、Apacheユーザーでインストールするか、/usr/local/optにインストールする。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 14:43

    ご回答ありがとうございます。
    自分でも調べてみましたが、/usr/localまたは、/optを使うべきという意見が多いように思います。
    しかし、その理由がよく理解できません。rbenvはrootでインストールするのでしょうか?それとも一般ユーザーでインストールするのでしょうか?rootは避けるべきという意見が見られるので、一般ユーザーでインストールしたとして、ApacheはRubyへのアクセス権が得られるのでしょうか?

    キャンセル

  • 2019/02/01 15:31

    rbenvをあるユーザーだけが使うのであれば、そのユーザーのホームディレクトリの下にインストールします。

    rbenvを全ユーザーが使うのであれば、
    案1:全ユーザーがそれぞれ自分のホームディレクトリの下に別々にインストールする
    案2:ホームディレクトリじゃなくて一般プログラムをインストールする場所にインストールして共有する

    案2の場合が、/usr/local か /opt です。
    /usr/local は一般ユーザーで書けないので、rootでインストールします。
    /usr/localは全ユーザーからアクセス可能です。

    /optの使い方に決まったルールはないので、アクセス権はどうしても良いです。

    キャンセル

  • 2019/02/05 02:54

    ご回答ありがとうございます。
    先ほど、ブラウザ上で動くことが確認できました。
    行ったこととしては、一般ユーザーのもとにインストールし、エラーログを確認しながら、パーミッションを変更したりしました。また過去にotnさんがPerlでの同様の質問にご回答されていたのを参考にさせていただきました。
    kaztoさんとotnさんとでベストアンサーを悩んでいたのですが、otnさんの回答は初心者の私として、わかりやすかったことと、他者の過去の質問へのご回答を含め、今回の問題を解決するうえでのキーワードをつかむ機会を多くいただけたなどの理由から、otnさんをベストアンサーに選ばせていただきました。
    皆さんからとしては、思わずggrksと言いたくなるような私の質問にも、ご丁寧にご回答いただけたこと大変うれしく思います。初心者だから甘んじて上級者の方になんでも質問するのではなく、できる限りを尽くしたうえで、質問できるよう、自己解決能力を高めるためにも、基礎から学んでいこうと思います。

    本当にご回答いただきありがとうございました。

    キャンセル

0

現在はrootユーザのrbenvにより、Ruby が実行されています。

Apache上での実行ユーザはapacheになるので、apacheのユーザがrbenvによりRubyを実行するか、あるいはシステムグローバルのRubyで実行するかすればよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/01 08:46

    ご回答ありがとうございます。
    # ls -l
    合計 4
    drwxrwxr-x 2 apache username 88 2月 1 07:27 cgi-bin
    drwxrwxr-x 4 apache username 4096 2月 1 07:27 html

    となっているのですが、この場合も実行できないのですか?

    キャンセル

  • 2019/02/01 09:46 編集

    問題なのは
    /root/.rbenv/versions/2.4.1/bin/ruby
    こっちの実行権限です

    なんとなくSELinuxも確認した方がよい気もしますが

    キャンセル

  • 2019/02/01 10:38

    /root/.rbenv/versions/2.4.1/bin/rubyの実行権限ですが、以下のようでした。
    -rwxr-xr-x 1 root root 16216440 (タイムスタンプ) rubyでした。
    依然として500エラーが出ます。

    キャンセル

  • 2019/02/01 10:45

    SELinuxはdisable状態でした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る