Linuxを日常的に使う実験ブログ

【Linux】Rubyで書いたCGIをApacheで動かしてみる

 2014-09-18

 2024-03-25

 Linux全般

こんにちは。今回のテーマは『ApacheでCGIを動かしてみる』です。動的なWebサイトを作成するにはにはPHPやjavascript、JAVAサーブレット等いろいろありますが、今回はRubyで書いたCGIをApache上で動かしてみます。え?時代はRuby on Railsですって?良いんです。趣味ですから。

[adsense02]

CGIって?

このブログの読者にCGI(Common Gateway Interface)とは何かという説明は野暮だと思いますが、簡単に。CGIとはサーバープログラムから呼び出された外部プログラムを実行することでインタラクティブな動作を可能とするための取り決めですね。(間違ってたらごめんなさい)

今回動かすCGIについて

今回はRubyで書かれたCGIをApache上で動かします。CGIはプログラミング言語に依存しないのですが、レンタルサーバー等で動かせるプログラミング言語は限りがあるので、大抵はPerl,Ruby,Pythonで書かれることが多いです。

Rubyでテスト用のCGIとしてhello.rbを用意し/srv/http/cgitest/に入れて動かしてみます。尚、Apacheはデフォルトの設定として/srv/http/cgi-bin/でCGIを動かす想定をしています。そこのところは補足で触れます。

準備

まずはCGIを準備しましょう。今回はRubyで書きます。Linuxをお使いの場合は予めインストールされているディストロが多いと思いますが、入っていない場合はインストールしておいてください。

ではCGIファイルを作成しましょう。今回はテスト用に以下のhello.rbを用意しました。少々残念なHTMLですがテスト用なので大目に見てください。

#!/usr/bin/ruby
print("content-type: text/html\n\n")
print("\n")
print("\n")
print("Hello World\n")
print("\n")
print("\n")
print("Hello World\n")
print("\n")
print("\n")

作成したhello.rbに実行権を与えてテストしましょう。

$ chmod +x hello.rb
$ ./hello.rb

以下のように出力すればOKです。



Hello World


Hello World


このhello.rbを/srv/http/cgitestディレクトリに設置します。ルート権限で以下コマンドを実行します。
(sudoでもOKです)

# mkdir /srv/http/cgitest
# cp hello.rb /srv/http/cgitest

Apacheの設定

インストール直後のApacheではCGIは動かない

さて、本題です。ウェブサーバー環境として有名なApacheですが、インストールしただけではCGIを動かす状態にはなっていません。では設定していきましょう。RedHat系とDebian系では設定が異なります。

RedHat系やArch Linux等

/etc/httpd/conf/httpd.confを編集します。

# vim /etc/httpd/conf/httpd.conf

設定1:CGI機能の読み込み
以下部分のコメントアウトを外す

LoadModule cgi_module modules/mod_cgi.so

設定2:拡張子の設定
以下のように修正する。

AddHandler cgi-script .cgi

設定3:CGIを動かすディレクトリの設定
今回は/srv/http/cgitestのみでCGIを動かす前提とします。もしlocalhost以下全体で使いたい場合は/srv/httpの部分を編集してください。
の部分にoption ExecCGIを記載してください。
記載例:



    AllowOverride All
    Require all granted
    Options ExecCGI 

Debian系(Ubuntu,Linux Mint等)

Debian系はちょっと勝手が違います。(設定ファイルの場所や名前が・・・)
設定1:CGI機能の読み込み
/ect/apache2/mods-enabledにcgi.loadのリンクを貼る

$ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

/etc/apache2/sites-available/000-default.confを編集する。

$ sudo nano /etc/apache2/sites-available/000-default.conf

以下のフレーズのコメントアウトを外す

Include conf-available/serve-cgi-bin.conf

設定2:拡張子の設定

$ sudo nano /etc/apache2/mods-available/mime.conf

以下部分に.rbを追加し、コメントアウトを外す。

AddHandler cgi-script .cgi .rb

設定3:CGIを動かすディレクトリの設定
/etc/apache2/conf-available/serve-cgi-bin.confを編集しCGIディレクトリを設定する。(方法はRedHat系と同様)

CGIの動作確認

01

ではいきなりですが、http://localhost/cgitest/hello.rbにアクセスしてみます。下図のように表示されれば成功です。単に青字で”Hello World”と書かれてて全く動的じゃないですが成功です。

トラブルと対策

Access forfidden! とエラーが出る

チェック1:ディレクトリのパーミッション
ディレクトリに実行権がないとアクセス出来ません

# chmod 755 /srv/http/cgitest

※755パーミッションはローカルホストの場合です。オンライン上のサーバーでは管理者が適すると判断するパーミッションを付与してください。
チェック2:CGIファイルの実行権の有無
CGIファイルが実行可能な状態でないとプログラムは動きません。以下コマンドで実行権を付与しましょう。

# chmod +x /srv/http/cgitest/hello.rb

チェック3:opsions ExecCGIは記載されているか?ディレクトリ名は正しいか?
httpd.confファイルのルートディレクトリ部分にopsions ExecCGIを記載した場合はlocalhost全体でCGIを実行可能ですが、ディレクトリを指定した場合は記載ミスがないか確認してください。

Server error! とエラーが出る

CGIの記載自体が誤っている場合です。もう一度確認しましょう。
チェック1:rubyの場所は正しいですか?
多くのディストロでrubyの場所は/usr/bin/rubyだと思います。確認するためには以下コマンドを実行しましょう。

$ which ruby

チェック2:content-type: text/htmlは書かれているか?
以下の記載があるか確認しましょう。ないとエラーを起こします。

print("content-type: text/html\n\n")

ソースコードがそのまま出る

チェック1:CGIは有効か?

LoadModule cgi_module modules/mod_cgi.so

は有効になっていますか?
チェック2:正しい拡張子が設定されているか?
Apacheで設定した拡張子と異なる場合はうまくCGIが動作しません。httpd.confファイルをチェックしましょう。

AddHandler cgi-script .cgi .rb

補足

ApacheではデフォルトでCGIを動作させるディレクトリを/srv/http/cgi-binに指定しています。このディレクトリでCGIを動作する際にはディレクトリにExecCGIを追記する必要はありません。