追補: 環境の確認とサンプルプログラムのインストール

環境のテスト方法

本書のサンプルプログラムを使用するためには、次のものが正しくインストールされていなけばなりません。

  • Webサーバーソフトウェア(Apacheなど)
  • Rubyインタプリタ
  • MySQL、PostgreSQL、SQLiteのいずれか
  • MySQL、PostgreSQLを使う場合には、Rubyのための拡張モジュール
  • Ruby/DBI
  • Amrita

このページでは、Webサーバーが正しくインストールされているか確認し、サンプルプログラムをインストール・実行する手順を紹介します。Ruby/DBIのインストールについては、こちらを参照してください。

ユーザー名はfooとします。また、Webサーバーの公開ディレクトリは、/home/foo/public_html (~/public_html) とします。

まず、~/public_html ディレクトリに次のファイルを作成します(このファイルはテストが終わったら削除してください)。

#!/usr/local/bin/ruby

require "etc"

print "Content-Type: text/html\n\n"
s = Etc.getpwuid()
print "<pre>\n"
s.each_pair {|sym, val| print "#{sym} -> #{val}\n"}
print "</pre>\n"

実行許可を付し、シェルで実行します。

$ chmod 705 test.rb
$ ./test.rb

実行結果は次のようになります。ユーザーfooが実行していることが分かります。

Content-Type: text/html

<pre>
name -> foo
passwd -> x
uid -> 504
gid -> 504
gecos -> 
dir -> /home/foo
shell -> /bin/bash
</pre>

Webサーバーから起動する前に、パーミションなどを確認します。

/home/fooディレクトリのパーミションを確認します。700であれば701に変更します(700ではエラー403が発生)。また、/home/fooおよび/home/foo/public_htmlは、自分以外が書き込み可能であってはいけません(エラー500が発生)。

$ chmod 701 /home/foo
$ chmod 701 ~/public_html

次に、~/public_html/.htaccessファイルを修正します。本書では古典的なCGIインターフェイスを使っているので、次のようにします。mod_rubyなどを使う場合は、適宜変更してください。

Options -Includes +ExecCGI
AddHandler cgi-script .cgi .rb
DirectoryIndex index.cgi
AddType text/css .css

これらの設定が終わってから、Webブラウザで呼び出します。

    http://orange/~foo/test.rb

次のようにnameがfoo以外(apacheやwwwなど)になる場合は、suEXECが有効になっていません。この場合は、本書のサンプルプログラムで行っているセキュリティチェックを緩める必要があります。

name -> apache
passwd -> x
uid -> 48
gid -> 48
gecos -> Apache
dir -> /var/www
shell -> /sbin/nologin

画面に次のように表示されれば、suEXECが有効になっています。本書で期待するとおりに動いており、サンプルプログラムを修正する必要はありません。

name -> foo
passwd -> x
uid -> 504
gid -> 504
gecos -> 
dir -> /home/foo
shell -> /bin/bash

サンプルプログラムのインストール

サンプルプログラムのアーカイブファイルは、オーム社のWebサイトから入手します。

  • http://www.ohmsha.co.jp/data/link/4-274-06529-4/ [リンク切れ]

このファイルのディレクトリ構造は、次のようになっています。

    ディレクトリ                     含まれるファイル
  ---------------------     ------------------------------------------
  sample
      list                  第1章から第17章までのSQL、スクリプトサンプル
      sample
          common            第18章、第19章の共通スクリプト
          priv 
              pm            第19章の内部(非公開)スクリプト
              shop          第18章の内部(非公開)スクリプト
          public_html
              sample-pm     第19章の公開スクリプト
              sample-shop   第18章の公開スクリプト
                  images    画像ファイル

ディレクトリを再配置します。

$ mkdir ruby
$ mkdir wwwdata
$ mkdir wwwdata/shop
$ mkdir wwwdata/shop/session
$ chmod 701 wwwdata
$ chmod 701 wwwdata/shop
$ mv sample/sample/common ~
$ mv sample/sample/priv/shop ruby
$ mv sample/sample/public_html/sample-shop public_html
$ chmod 701 public_html/sample-shop
$ cd public_html/sample-shop
$ chmod 600 *
$ chmod 666 default.css
$ chmod 705 index.cgi logon.rb spec.rb cart.rb

上記の一連のコマンドにより、次のような構成になります。構成を変更する場合は、移動するディレクトリのファイルをrequireしているスクリプトを適宜書き換えます。

    ディレクトリ                     含まれるファイル
  ---------------------     ------------------------------------------
  ~ (/home/foo)
      common                共通スクリプト
      public_html
          sample-shop       公開ファイル
              images        画像ファイル
      ruby
          shop              第18章の内部(非公開)スクリプト
      wwwdata
          shop              内部データ

これに合わせて、設定ファイルconf.rbの内容を修正します。

PRIV_DIR = "/home/foo/wwwdata/shop/"
TMPL_DIR = "/home/foo/public_html/sample-shop/"

カウンタファイルを作成します。

$ touch ~/wwwdata/shop/sale_counter

さらに、データベースプロファイルを作成します。データベース名、パスワードなどをスクリプト中に直接書くのは、セキュリティ、移植性の観点から避けるべきです。

次の内容の~/wwwdata/shop/dbpasswdファイルを作成します。「=」の右は実際にはタブ区切りで、データベース名、ユーザー名、パスワードを記述します。

customer_relationship=DBI:Pg:sample    foo    password