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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

785閲覧

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

witchy

総合スコア74

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

2クリップ

投稿2019/01/31 22:25

編集2019/02/01 00:03

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

以下がその詳細です。

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

Ruby

1#!/root/.rbenv/versions/2.4.1/bin/ruby 2require 'rbconfig' 3Ruby = File::join(RbConfig::CONFIG['bindir'], 4 RbConfig::CONFIG['ruby_install_name']) 5Ruby << RbConfig::CONFIG['EXEEXT'] 6 7puts Ruby 8 9print "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の過去の似た質問

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stan_Dma

2019/01/31 22:32 編集

I am afraid 'apache' user could not have permission to the ruby binary.
witchy

2019/01/31 23:42

# 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 となっており、パーミッションは許可されていると思います。 私は初心者のため、回答になっていなかったら申し訳ございません。
Stan_Dma

2019/01/31 23:51 編集

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

2019/02/01 00: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 01: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. お手数おかけし、本当に申し訳ございません。 そもそも、セキュリティ的に問題があるのですね。 少し時間はかかりそうですが、改善できるか試してみます。 本当にご回答いただきありがとうございます。
guest

回答3

0

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

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

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

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

投稿2019/02/01 02:41

編集2019/02/01 04:29
kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

witchy

2019/02/01 05:55

ご回答ありがとうございます。 cgiを利用する場合、initの作業が行われず、gemが利用できない可能性があるため、Ruby本体のみをインストールしたほうが良いということでしょうか? 一般ユーザーの元(home/username/)にrbenvをインストールしても同じでしょうか? また、cgi利用する場合は皆様はどのようなツールをご使用されているのでしょうか?
kazto

2019/02/01 06:36

yumコマンドでインストールできるrubyを使うのが第一、次にrubyのソースをダウンロード、コンパイルしてインストールする方法になるかと思います。 一般ユーザの下でも同じです。 ツールを使うな、と申し上げております。
kazto

2019/02/01 06:49 編集

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

2019/02/04 17:31

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

2019/02/05 06:21

> 調べたところ最新のものに変更するにはソースコードから直接コンパイルする必要があるようで、今の私には力不足だと感じたためです。ですので、rbenvで2.6をインストールすることにしました。 複数のバージョンを使い分けるという要件がなければ、rbenvより、単独でソースからインストールする方が簡単ですよ。この質問のような問題もまず起きませんし。
guest

0

ベストアンサー

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

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

投稿2019/02/01 02:56

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

witchy

2019/02/01 05:43

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

2019/02/01 06:31

rbenvをあるユーザーだけが使うのであれば、そのユーザーのホームディレクトリの下にインストールします。 rbenvを全ユーザーが使うのであれば、 案1:全ユーザーがそれぞれ自分のホームディレクトリの下に別々にインストールする 案2:ホームディレクトリじゃなくて一般プログラムをインストールする場所にインストールして共有する 案2の場合が、/usr/local か /opt です。 /usr/local は一般ユーザーで書けないので、rootでインストールします。 /usr/localは全ユーザーからアクセス可能です。 /optの使い方に決まったルールはないので、アクセス権はどうしても良いです。
witchy

2019/02/04 17:54

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

0

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

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

投稿2019/01/31 23:41

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

witchy

2019/01/31 23: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 となっているのですが、この場合も実行できないのですか?
asm

2019/02/01 00:54 編集

問題なのは /root/.rbenv/versions/2.4.1/bin/ruby こっちの実行権限です なんとなくSELinuxも確認した方がよい気もしますが
witchy

2019/02/01 01:38

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

2019/02/01 01:45

SELinuxはdisable状態でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問