サーバーリテラシ2005 - 第5回 CGI アプリケーション

CGI とは?

CGI とは、Web サーバーが クライアント (Web ブラウザなど) からの要求に応じてプログラムを動作させるための仕組みのことです。従来 Web サーバーは、HTML ファイルや画像ファイルのように、あらかじめ作られたデータをただ送信するだけでした。これでは、情報をその場で生成して送信するような仕組みを作るのは困難です。そこで、サーバープログラムからほかのプログラムを呼び出し、その処理結果をクライアントに送信する方法が考え出されました。これにより、便利な検索サイトや、掲示板、アクセスカウンターなどが実現されています。今回は、CGIプログラムの例として、何かと話題の Blog と Wiki の設置方法を取り上げます。

ユーザー領域でサイトを管理する

前回、Web サーバーをインストールしましたが、Web サイトを管理できるのは管理者だけでした。これではセキュリティー面であまり安全ではないので、一般ユーザーのホームディレクトリにあるファイルを公開できるようにします。
端末を起動し、 root になります。

# su -

エディターで Web サーバーの設定ファイルを編集します。

# vi /etc/httpd/httpd.conf

UserDir public_html という記述の下に以下の設定を追加してください。

<Directory /home/*/public_html>
    Options None
    AllowOverride All
</Directory>

<Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
</Directory>

この設定の意味は次の通りです。

<Directory /home/*/public_html>
ディレクトリ /home/*/public_html (* はワイルドカード) に関する設定
Options None
特別な機能をすべて無効にする
AllowOverride All
.htaccess ファイルによる設定の上書きを有効にする
<Directory /home/*/public_html/cgi-bin>
ディレクトリ /home/*/public_html/cgi-bin に関する設定
Options ExecCGI
CGI を実行する

ユーザー領域でもCGIが実行できるように設定を変更します。

#Add-Handler cgi-script .cgi
  ↓
Add-Handler cgi-script .cgi

追加したら、保存してエディタを終了してください。
設定を適用します。

# /etc/init.d/httpd reload
Reloading httpd:                                           [  OK  ]

Web サーバーの実行ユーザーである httpd が、一般ユーザーのホームディレクトリ内にアクセスできるようにグループとパーミッションを変更します。

# chgrp httpd ~ユーザー名
# chmod g+rx ~ユーザー名

一般ユーザーに戻って、テストをします。ホームディレクトリのすぐ下に public_html というディレクトリを作ってください。

# exit
$ cd
$ mkdir public_html
$ cd public_html

index.html というファイルを作り、適当な HTML を入力します。

$ cat > index.html
<html>
<head>
<title>てすと</title>
</head>
<body>
ほげほげ
</body>
</html>

ブラウザで http://自分のIPアドレス/~ユーザー名/ にアクセスし、正しくページが表示されれば成功です。

ほげほげ

CGI が正しく実行できるかも確認してみましょう。

$ mkdir cgi-bin
$ chmod 755 cgi-bin
$ cd cgi-bin
$ cat > test.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print "$_ = $ENV{$_}\n" for (keys %ENV);
$ chmod 755 test.cgi

ブラウザで http://自分のIPアドレス/~ユーザー名/cgi-bin/test.cgi にアクセスし、正しくページが表示されれば成功です。

SCRIPT_NAME = /~*/cgi-bin/test.cgi
SERVER_NAME = 192.168.1.*
. . . 
HTTP_HOST = 192.168.1.*

それでは実際にCGI プログラムを設置してみましょう。

Blog を開設する

Blog とは、いまさら説明の必要もないでしょうが、ネット上の日記のようなもので、書き込んだ日記に、離れたところにいる友達や、見知らぬ誰かさんがツッコミを入れたりできるシステムです。ここでは、オープンソースかつフリーな Blog プログラムである tDiary の設置方法を紹介します。

tDiary のダウンロードとインストール

tDiary は、tDiary.org より配布されていますので、ここから tdiary-full-2.0.2.tar.gz をダウンロードします。

$ cd ~/public_html/cgi-bin
$ wget http://www.tdiary.org/download/tdiary-full-2.0.2.tar.gz

ダウンロードしたファイルは圧縮されているので解凍します。

$ tar zxf tdiary-full-2.0.2.tar.gz

tdiary-2.0.2 というディレクトリができれば成功です。

$ ls -l
合計 2080
drwxr-xr-x  9 hoge hoge    4096  12月 01 18:35 tdiary-2.0.2
-rw-rw-r--  1 hoge hoge 2121313  12月 01 18:30 tdiary-full-2.0.2.tar.gz

URL にバージョン番号が入っていると邪魔なのでディレクトリを tdiary に変更します。

$ mv tdiary-2.0.2 tdiary

次に、tDiary の実行ファイルである index.rb と update.rb をサーバーが実行できるようにパーミッションを変更します。

$ cd tdiary
$ chmod 755 index.rb update.rb

以上でtDiary のインストールは完了です。

設定を変更する

次に tDiary の設定を変更します。

tDiary の実行環境を整える

現在のサーバーの設定では、CGI プログラムの拡張子は .cgi なので、これに Ruby スクリプトの拡張子である .rb を追加します。一般ユーザーではシステムの設定を変更できないため、.htaccess ファイルを使って設定を上書きします。

$ cat > .htaccess
AddHandler cgi-script .rb
DirectoryIndex index.rb

次に、tDiary の設定を変更します。tDiary の設定の一部は、tdiary.conf を直接編集して変更します。サンプルの設定ファイルをコピーし、テキストエディタで開いて変更してください。

vi で tdiary.conf を開くと文字化けするという場合は、vi ではなく emacs を使用するか、
PuTTY の文字セットを EUC-JP に変更し、以下のコマンドを実行してから vi で開いてください。
コマンド:
    LANG=ja_JP.EUC-JP
$ cp tdiary.conf.sample tdiary.conf
@data_path = '/home/foo/diary'
  ↓
@data_path = '/home/ユーザー名/diary'

ほかの項目は、お好みに合わせて適宜、変更してください。

最後に、日記データの保存ディレクトリを作ります。このディレクトリはサーバーが書き込める必要があるため、いったん root になり、グループとパーミッションを変更します。

$ mkdir ~/diary
$ su -
# chgrp httpd ~ユーザー名/diary
# chmod g+w ~ユーザー名/diary

Ruby のインストール

ここまでで tDiary のインストールは完了ですので、ブラウザで表示してみましょう。任意のブラウザで http://自分の IP アドレス/~ユーザー名/cgi-bin/tdiary/index.rb へアクセスしてみてください。

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

エラーが出てしまいました。サーバーのログファイルを見てみましょう。

$ su -
# tail /var/log/httpd/error_log
[Fri Dec 01 20:00:00 2005] [error] [client 192.168.1.*] /usr/bin/env:
[Fri Dec 01 20:00:00 2005] [error] [client 192.168.1.*] ruby
[Fri Dec 01 20:00:00 2005] [error] [client 192.168.1.*] : No such file or directory
[Fri Dec 01 20:00:00 2005] [error] [client 192.168.1.*] 
[Fri Dec 01 20:00:00 2005] [error] [client 192.168.1.*] Premature end of script headers: index.rb

ruby が見つからないことがエラーの原因のようです。Ruby とは、スクリプト言語の 1 つで、tDiary も Ruby で書かれています。なので、実行するためには Ruby をインストールする必要があります。CentOS 4.2 にはあらかじめパッケージが用意されているので、yum でインストールします。

# yum install ruby
Setting up Install Process
Setting up repositories
・・・
Is this ok [y/N]: y

インストールが成功したら、もう一度ブラウザでアクセスしてみてください。「ほげほげ日記」が表示されれば成功です。

Wiki ページを開設する

Wiki とは、ブラウザを利用してサーバー上の文書を書き換えるシステムの一種です。Wiki では通常、誰でも、ネットワーク上のどこからでも、文書の書き換えができるようになっているので、共同作業で文書を作成するのに便利です。
今回は、国産 Wiki クローンの1つである FreeStyleWiki を設置してみます。

FreeStyleWiki のダウンロードとインストール

FreeStyleWiki は、http://fswiki.poi.jp/ より配布されていて、2005 年 12 月 6 日現在の最新バージョンは 3.5.10 です。tDiary と同様に、ダウンロードしてください。

$ cd ~/public_html/cgi-bin
$ wget http://osdn.dl.sourceforge.jp/fswiki/17805/wiki3_5_10.zip

このファイルは ZIP 形式のアーカイブなので unzip コマンドで解凍します。

$ unzip wiki3_5_10.zip

アーカイブのファイル名と同じディレクトリができれば成功です。

$ ls -a
合計 2080
drwxr-xr-x  9 hoge hoge    4096  12月 01 18:55 wiki3_5_10
-rw-rw-r--  1 hoge hoge  881307  12月 01 18:50 wiki3_5_10.zip

ディレクトリ名を変更します。

$ mv wiki_3_5_10 wiki

FreeStyleWiki には、初期設定用のシェルスクリプトが同梱されているのでこれを使ってしまいましょう。

$ cd wiki
$ sh setup.sh
fswiki setup (for 3.5.8)...
. . . 
done

以上で設置は完了です。ブラウザで http://自分の IP アドレス/~ユーザー名/cgi-bin/wiki/wiki.cgi へアクセスしてみてください。「FrontPage」が表示されれば成功です。