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

take

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

前回は Web サーバである Apache のインストールを行いました。
今回は Apache を使って Blog や Wiki 、BBS といった Web アプリケーションの設置を行っていきます。

CGI

CGI とは Web サーバにクライアント (ブラウザなど) からの要求に応じてプログラムを Web サーバ内で実行させるための仕組みのことです。これにより Web サーバに文章やファイルなどを生成、また、クライアントに送信させることが出来るので、今回取り扱う Blog や Wiki 、BBS をはじめ検索サイトやアクセスカウンター、チャットなどを実現することが出来ます。今挙げた物は CGI 以外の技術でも実現することが可能ですが、その中でも比較的簡単な CGI を扱っていきます。

CGI を実行する

現状の Apache の設定では Apache は CGI プログラムを実行することができません。初めに CGI を実行できるように Apache の設定ファイルを書き換えます。今回の環境では一般ユーザは Apache の設定ファイルを書き換えられないので root になって作業を行います。

$ su -
# vi /etc/httpd/conf/httpd.conf
#AddHandler cgi-script .cgi

AddHandler cgi-script .cgi .pl .rb

また、ディレクトリのインデックスファイルに index.rb を追加します。

DirectoryIndex index.html

DirectoryIndex index.html index.rb

ユーザ領域( public_html 以下の領域)の cgi-bin 以下で CGI プログラムを実行できるようにユーザ領域に関する設定ファイルを書き換えます。変更箇所が多いため一度ファイルを消去して新しく作成します。

# rm /etc/httpd/conf/extra/httpd-userdir.conf
# vi /etc/httpd/conf/extra/httpd-userdir.conf
UserDir public_html
<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Order allow,deny
    Allow from all
</Directory>
<Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
</Directory>

変更は以上です。設定を反映させるために httpd を再起動します。

# /etc/init.d/httpd restart

ここからは一般ユーザに戻って作業を行います。

# exit

次に、実際に CGI が実行できるか確認します。今回はユーザ領域下の cgi-bin ディレクトリ(public_html/cgi-bin/)以下に配置して実行します。

$ cd ~/public_html
$ mkdir -m 755 cgi-bin

cgi-bin ディレクトリに移動し、test.cgi を作成します。

$ cd cgi-bin
$ vi test.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><table border=1>\n";
for $key (sort(keys(%ENV))) { print "<tr><td>$key</td><td>$ENV{$key}</td></tr>\n"; }
print "</table></body></html>";

この「 ¥ 」は Unix 上では「 \ 」で表示されます。

test.cgi をサーバーが実行できるようにパーミッションを変更します。

$ chmod 755 test.cgi

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


ここからは実際に CGI プログラムを設置していきます。各自好きな順番で作業を進めてください。

Blog を開設する

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

tDiary のダウンロードと設置

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

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

ダウンロードしたファイルを解凍します。

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

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

$ ls -l
total 2084
drwxr-xr-x  9 hoge hoge    4096 Dec 10  2006 tdiary-2.0.4
-rw-rw-r--  1 hoge hoge 2128834 Dec 10  2006 tdiary-full-2.0.4.tar.gz

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

$ mv tdiary-2.0.4 tdiary

パーミッションを変更します。

$ chmod 755 tdiary

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

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

以上でtDiary の設置は完了です。

日記データの保存ディレクトリを作成する

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

$ mkdir ~/diary
$ su -
# chgrp httpd ~ユーザ名/diary
# chmod 775 ~ユーザ名/diary
# exit

tDiary の設定

tDiary にはあらかじめサンプルの設定ファイルが用意されているので、このファイルをコピーしたものを元に設定を行います。

$ cp tdiary.conf.sample tdiary.conf

現在の設定では、vi で tdiary.conf を開くと文字化けしてしまいます。開いている PuTTY のタイトルバーの上で右クリックをして PuTTY 設定変更ウインドウを表示させ、一時的に設定を変更します。カテゴリの[ウィンドウ]->[変換]->[受信されるデータの文字セット変換]から PuTTY の文字セットを [EUC-JP] に変更し、[適用]を押してください。

また、サーバ側の文字セットも変更する必要があるため以下のコマンドを実行します。

LANG=jp_JP.EUC-JP
$ vi tdiary.conf
@data_path = '/home/foo/diary'

@data_path = '/home/ユーザ名/diary'

今変更したのは日記データの保存ディレクトリの項目です。
その他の項目は、お好みに合わせて適宜、変更してください。

変更を終えたら、PuTTY の設定を変更したときと同じように[UTF-8(CJK)]に戻し、以下のコマンドでサーバ側の文字セットを元に戻してください。

LANG=en_US.UTF-8

これで tDiary の設置は完了です。実際にブラウザで表示してみましょう。
http://localhost:10080/~ユーザ名/cgi-bin/tdiary/ へアクセスしてみてください。

すると、以下のようなエラーが表示されます。

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

Please contact the server administrator, xxx@k.hosei.ac.jp and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

原因を特定するために Apache のログファイル(/var/log/httpd/error_log)を見てみましょう。

$ su -
# tail /var/log/httpd/error_log
・・・
[Thu Dec 21 19:00:00 2006] [error] [client 192.168.1.xxx] /usr/bin/env:
[Thu Dec 21 19:00:00 2006] [error] [client 192.168.1.xxx] ruby
[Thu Dec 21 19:00:00 2006] [error] [client 192.168.1.xxx] : No such file or directory
[Thu Dec 21 19:00:00 2006] [error] [client 192.168.1.xxx]
[Thu Dec 21 19:00:00 2006] [error] [client 192.168.1.xxx] Premature end of script headers: index.rb

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

Ruby のインストール

# yum install ruby
Setting up Install Process
Setting up repositories
………

途中でインストールするかどうか確認を求められるので、

Is this ok [y/N]: y

と入力してください。

最後に Complete! と表示されればRubyのインストールは完了です。再度ブラウザでhttp://localhost:10080/~ユーザ名/cgi-bin/tdiary/にアクセスして、 「ほげほげ日記」 が表示されれば成功です。後は README や 日記の書き方 、また、 tDiary.org などを参考にして好きなようにカスタマイズしてみてください。なお、 設定 画面には 追記 から行くことができます。

次の作業に移る前に、

# exit

で一般ユーザに戻っておきましょう。


Wiki を開設する

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

FreeStyleWiki のダウンロードと設置

FreeStyleWiki は、http://fswiki.poi.jp/ より配布されているので、ここから wiki3_6_2.zip をダウンロードします。

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

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

$ unzip wiki3_6_2.zip

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

$ ls -l
total 896
drwxrwxr-x  9 hoge hoge   4096 Dec 14 19:00 wiki3_6_2
-rw-rw-r--  1 hoge hoge 906739 Jul  3 13:45 wiki3_6_2.zip

ブラウザで URL を入力する際、バージョン番号が入っていると邪魔なのでディレクトリを wiki に変更します。

$ mv wiki3_6_2 wiki

ディレクトリのパーミッションを変更します。

$ chmod 755 wiki

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

$ cd wiki
$ sh setup.sh
# fswiki setup (for 3.5.8)...
prepare...
  FSWIKI_HOME=.
  check ./wiki.cgi...
    ok
do...
  check ./backup...
  check ./attach...
  check ./pdf...
  check ./log...
  check ./data...
  check ./config...
  check ./.htaccess...
    create.
done

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


BBS を開設する

説明する必要もないかと思いますが、BBS はネットワーク上の電子掲示板サービスです。
今回は Groo-WebTreeBBS を設置します。

TreeBBS のダウンロードと設置

$ cd ~/public_html/cgi-bin
$ wget http://www.groo-web.com/download/tree_b.zip

ダウンロードしたファイルを解凍します。このファイルを解凍すると圧縮されているファイルが現在のディレクトリにそのまま展開されてしまうので、展開先を指定して解凍を行います。

$ unzip tree_b.zip -d treebbs

解凍するとファイルの展開情報が以下のように表示されます。

Archive:  tree_b.zip
 inflating: treebbs/tree.cgi
extracting: treebbs/data/count.log
extracting: treebbs/data/tree.dat
 inflating: treebbs/images/clip.gif
 inflating: treebbs/images/new.gif
 inflating: treebbs/jcode.pl

上記のように展開されたか、実際に確認してみましょう。(hogeのところにはユーザ名が表示されます)

$ ls -l treebbs/*
-r--r--r--  1 hoge hoge 19853 Nov  9  2002 treebbs/jcode.pl
-rw-rw-r--  1 hoge hoge 50752 Jan 12  2003 treebbs/tree.cgi

treebbs_test/data:
total 0
-rw-rw-r--  1 hoge hoge 0 Dec  2  2002 count.log
-rw-rw-r--  1 hoge hoge 0 Nov 22  2002 tree.dat

treebbs_test/images:
total 8
-rw-rw-r--  1 hoge hoge  96 Nov  9  2002 clip.gif
-rw-rw-r--  1 hoge hoge 118 Nov  9  2002 new.gif

ディレクトリのパーミッションを変更します。

$ chmod 755 treebbs

次に、TreeBBS の設定ファイルを書き換えます。

$ cd treebbs

現在の設定では vi で tree.cgi を開くと文字化けしてしまいますが、今はこのままで書き換えを行います。

$ vi tree.cgi
#/usr/bin/perl

#/usr/bin/perl --

「 --」を加える理由についてはページ下部の講義外の項目に記載しているのでそちらを参照してください。

TreeBBS の実行ファイルである tree.cgi をサーバが実行できるようにパーミッションを変更します。

$ chmod 755 tree.cgi

jcode.pl をサーバが参照、書き込みできるようにパーミッションを変更します。

$ chmod 644 jcode.pl

data ディレクトリ以下をブラウザから見えないようにパーミッションを変更します。

$ chmod 700 data

以上で設置は完了です。ブラウザで http://localhost:10080/~ユーザ名/cgi-bin/treebbs/tree.cgi へアクセスしてみてください。
TreeBBS」が表示されれば成功です。

設定についての詳しい解説は Groo-WebTreeBBS 解説&ダウンロードページ を参照してください。

講義外

tree.cgi を文字化けしないようにして編集する

現在の設定では、vi で tree.cgi を開くと文字化けしてしまいます。開いている PuTTY のタイトルバーの上で右クリックをして PuTTY 設定変更ウインドウを表示させ、一時的に設定を変更します。
カテゴリの[ウィンドウ]->[変換]->[受信されるデータの文字セット変換]から PuTTY の文字セットを [Shift-JIS] に変更し、[適用]を押してください。

また、サーバ側の文字セットも変更する必要があるため以下のコマンドを実行します。

LANG=jp_JP.UTF-8

最後に、vi で tree.cgi を開いた後以下のコマンドを入力します。

:set encoding=shift-jis

変更を終えたら、PuTTY の設定を変更したときと同じように[UTF-8(CJK)]に戻し、以下のコマンドでサーバ側の文字セットを元に戻してください。

LANG=en_US.UTF-8

tree.cgi の修正内容の意味

今回扱った TreeBBS の tree.cgi は「 --」を1行目の末尾に加えなければ正しく動作させることが出来ません。これは tree.cgi の改行コードがプログラムの一部として誤って読み込まれてしまっていることが原因です。改行コードというのはテキストファイル中の改行を表す文字コードのことで、Windows では CR+LF、Unixでは LF というコードが使用されています。tree.cgi は perl という言語で書かれていて、この1行目には perl を実行するためのコマンドの場所が書かれています。tree.cgi の改行コードは CR+LF で、tree.cgi をそのまま実行するとこの改行コードが perl の実行オプションとして扱われてしまいます。「 --」を加えるとそこがオプションの終わりと見なされるため、改行コードを正しく読み込めるようになるというわけです。