以下からの文章において、「現在」とは1997年11月22日を表します。コンパイル環境はそれぞれ、OSはSolaris 2.5.1、マシンはUltra-1、gcc 2.7.2.2、GNU make 3.75、GNU tar 1.12 などです。
FastCGI
http://www.fastcgi.com/
動作環境 CGI、Apacheモジュール(mod_fcgi)
使用条件 フリーウェア
CGIは最も古く、最も有名で、かつウェブサーバと言語の種類に依存しないサーバサイドスクリプト技術です。欠点は、ウェブサーバが動いているホストの負荷を非常に上げてしまうことがある事と、実行が遅い事、それから特定のユーザに特定のCGIプログラムだけを使わせるといったセキュリティ制御が繁雑な事、などです。
通常のCGIは、ウェブサーバが同じホスト上のCGIプログラムを起動し、その出力をウェブサーバが受けとり、ブラウザに返す、という原理で動きます。このため CGIを起動するのにかかる時間だけ、ブラウザが待たされてしまいます。
このオーバーヘッドを無くすのがFasrCGIです。FastCGIは、CGIのプロセスをあらかじめメモリに読み込んで常駐させ、ウェブサーバからのCGIリクエストを受けとってCGIを実行し、その出力を返します。CGIは常に起動された状態なため、CGIの起動オーバヘッドは無くなります。さらに、常駐するCGIのプロセスは、ウェブサーバと違うホストで実行されていてもかまいません。
[絵]
HTTPリクエスト(GET,POST) CGI起動
ブラウザ -> ウェブサーバ -> CGIプログラム
<- <-
HTTPリプライ UNIX標準出力(Apacheの場合)
CGIは"インターフェース"ですので、CGIの規則にのっとってプログラムを書かなくてはいけません。例えばPerlだと、CGI.pmやcgi-lib.plを使ってウェブサーバから起動された時渡されるデータを変数に格納し、print関数などを使って標準出力のファイルハンドルにデータを出力すれば、ウェブサーバがHTTPリプライとしてブラウザに結果を返してくれます。
FastCGIも同様に"インターフェース"に沿ったプログラムを書かなくてはいけません。しかしそれはCGIのそれとは異なっています。C/C++、Java、Perl、Python、tcl用のFastCGIインターフェースが、FastCGIのページからダウンロードできるので、それらを利用することになります。ここでは、CGI用の言語として最も有名なPerlで、FastCGIを書く方法について説明します。
・FastCGI用のPerlを作る
普通のPerlは、FastCGIへのインターフェースとしては使えません。FastCGIとして使える機能を、Perlにつけてやらなくてはいけません。FastCGIでは、stdioの機能では足らず、何らかのI/Oを高機能化する、stdioの下で動くレイヤーが必要になってきます。
1. Solaris 2.4用バイナリをFastCGIのページから持ってくる
2. fcgi_stdioつきでPerlをコンパイルする
3. sfioつきでPerlをコンパイルする
1.
Solaris 2.5.1では、どうしてもまったく動かなかったので、あきらめました。
2.
ちょっと古いPerlしかサポートしておらず、これからのサポートもおそらくないでしょうから、今はお勧めできません。
現在の最新版であるFastCGI Development Kit 2.0b2(http://www.fastcgi.com/applibs/2.0.0/fcgi-devel-kit.tar.Z、以下FDK)と、それに対応する Perl 5.002(ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/src/perl5.002.tar.gz)を手に入れます。展開して、Perlのソースの一部を、FDKについてくるものと置き換えます。
% gtar zxvf fcgi-devel-kit.tar.Z ; gtar zxvf latest.tar.gz
% cd perl5.002
% mv perl.c perl.c.orig ; mv proto.h proto.h.orig ; mv Configure Configure.orig
% cp -r ../fcgi-devel-kit/perl-5/perl5.002/* ./ ; cp -r ../fcgi-devel-kit/perl-5/common/* ./
% setenv FCGIDIR /path/to/fcgi-devel-kit
perl5.002/fcgi-configureを参考にして、./Configureします。ドキュメントにはfcgi-configureを使えと書いていますが、使わず参考程度にとどめておいた方が良いでしょう:
% ./Configure -Dcc='gcc -B/usr/ccs/bin/' -Dextralibs="$FCGIDIR/libfcgi/libfcgi.a" -Dprefix=/usr/local/perl5-fcgi -Dccflags="-I$FCGIDIR/include -include $FCGIDIR/include/fcgi_stdio.h"
3.
sfioは、stdioに代わる実験的なIOライブラリです。現在の最新の安定版であるPerl 5.004_04(ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/src/latest.tar.gz)と、sfio97(ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/src/misc/sfio97.src.unix.tar.gz)を手に入れます。
% mkdir sfio97 ; cd sfio97
% gtar zxvf /path/to/src/of/sfio97.src.unix.tar.gz ; cd src/lib/sfio
% setenv PATH /path/to/sfio97/bin:$PATH
コンパイル時にsfio97/bin/iffeというスクリプトが必要なので、それをパスに通します:
% make CC=gcc
sfio97/libとsfio97/includeにコンパイルし終ったものが置かれているので、ルートになってそれをコピーします:
% su
# mkdir /usr/local/include/sfio ; cp sfio97/include/* /usr/local/include/sfio
# mkdir /usr/local/lib/sfio ; cp sfio97/lib/* /usr/local/lib/sfio
次に、このsfioライブラリとヘッダファイルを使って、Perlをコンパイルします:
% ./Configure -Duseperlio -Dusesfio -Dcc='gcc -B/usr/ccs/bin/'
Perlの長々とした./Configureは、ほとんどデフォルトで良いのですが、次の点にだけ注意して下さい:
Directories to use for library searches? [/usr/local/lib /lib /usr/lib /usr/ccs/lib]
/usr/local/lib/sfio /usr/local/lib /lib /usr/lib /usr/ccs/lib
Any additional cc flags? [-I/usr/local/include]
-I/usr/local/include/sfio -I/usr/local/include
Any additional ld flags (NOT including libraries)? [ -L/usr/local/lib]
-L/usr/local/lib/sfio -L/usr/local/lib
Use the experimental PerlIO abstraction layer? [y] y
perl5 can use the sfio library, but it is experimental.
You seem to have sfio available, do you want to try using it? [y] y
% make ; make test ; su
# make install
Solaris 2.5.1では、Perl with sfioによるFastCGIを2つ以上同時にアクセスできないバグがあるらしいです(http://www.fastcgi.com/mail-archive/0762.html)。いつか直ることを期待して:-)、今は無視することにしましょう。
最後に、Perlからfcgiを利用するためのPerlモジュール(FCGI::*)をインストールします。普通のPerlモジュールのコンパイル・インストールとやり方は同じです。
ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/authors/id/SKIMO/FCGI-0.31.tar.gz
% tar zxvf FCGI-0.31.tar.gz
% cd FCGI-0.31
% perl Makefile.PL
% make ; su
# make install
コンパイルに使うperlは、Perl/sfioであることを確かめて下さい。また、なぜかwinsock.hをインクルードしてコンパイルしようとしていたので、手で削除して回避しました。
・Apacheをfcgi対応にする
mod_fastcgi 2.0β(http://www.fastcgi.com/servers/apache/2.0/apache-fastcgi.tar.Z)と、Apache 1.2.4を手に入れ、展開し、mod_fcgi.cをApacheのソースディレクトリにコピーします:
% tar zxvf apache-fastcgi.tar.Z
% cd apache-fastcgi
% cp src/mod_fastcgi.c $apache/src/
$apache/src/Configurationに次の行を追加し、後は普通にApacheをコンパイルする:
Module fastcgi_module mod_fastcgi.o
$apache/conf/httpd.confに拡張子.fcgiのファイルをFastCGIとして起動するハンドラを書き加えます:
AddHandler fastcgi-script .fcgi
$apache/conf/srm.confに、FastCGIとして起動したいCGIを書き加えておしまいです。FDKのexample/にあるecho-perlなどをサンプルにしてテストみました。:
AppClass /usr/etc/httpd/cgi-bin/echo.fcgi
後は、FastCGI対応のCGIが出てくるのを待つか、ドキュメントを参考に自分で書きましょう。
mod_rewrite
http://www.apache.or.jp/
動作環境 Apacheモジュール
使用条件 フリーウェア(Apache附属)
ブラウザから要求があったURLを、サーバがその場である規則に従って書き換えるApacheモジュールです。Apache 1.2以降に附属してきます。現在まだβ版であるApache 1.3b3では1から書き直され、速度向上、機能の洗練、バグ取り、ドキュメントの整備がなされているらしいですが(http://ring.aist.go.jp/archives/net/apache/dist/CHANGES)、Apache 1.2.4のmod_rewriteに比べ、大きなディレクティブの書き方の変化やドキュメントに違いが見られませんでした。ここでは、Apache 1.2.4に基づいて説明をします。
まず、Apacheのソースファイル(http://ring.aist.go.jp/archives/net/apache/dist/apache_1.2.4.tar.gz)を展開し、apache_1.2.4/(以下、$apache)というディレクトリができるのを確認して下さい:
% gtar zxvf apache_1.2.4.tar.gz
次に、$apache/src/Configurationの中の、次の記述をコメントアウトして下さい:
# Module rewrite_module mod_rewrite.o
↓
Module rewrite_module mod_rewrite.o
後は普通にコンパイルしてインストールします。
% $apache/src/Configure
% make ; su
# make install
$apache/conf/httpd.confに、次のように書き込みます。mod_rewriteを組み込んでコンパイルしても、デフォルトがoffですので、はまらないように気をつけて下さい:
RewriteEngine on
最初は動作の確認のためにログをとることにします。Apacheの動作が極端に重くなるので、ログレベルは2ぐらいに設定します:
RewriteLog logs/rewrite_log
RewriteLogLevel 2
Apacheをスタートさせます:
% $apache/src/httpd -f $apache/conf/httpd.conf
・実際の使用例
mod_rewriteは、要求されたURLの書き換え、環境変数の書き換え、対応表に従ったURLの書き換えが出来ます。従って、応用範囲はとても広く、皆さんの想像力次第です。http://www.engelschall.com/sw/mod_rewrite/docs/mod_rewrite/solutions.html にたくさんの例が紹介されています。またドキュメントがhttp://ring.aist.go.jp/archives/net/apache/docs/mod/mod_rewrite.htmlにあります。
個人のページが他のページに移転になったが、サーバのアドレスとユーザ名が変わっただけで、ディレクトリ構造自体は変わっていないとしましょう。つまり:
http://www.hogehoge.or.jp/~foo/bar/zoo.html -> http://www.naninani.ne.jp/~foo/bar/zoo.html
http://www.hogehoge.or.jp/~foo/boo.html -> http://www.naninani.ne.jp/~foo/boo.html
などといった変換を行ないたいとします。移転前のサーバ(www.hogehoge.or.jp)の、~foo/public_html/.htaccess というファイルに、次のディレクティブを書きます:
RewriteEngine on
RewriteOptions inherit
Options +FollowSymLinks
RewriteRule (.+) http://www.naninani.or.jp/~foo/$1 [R,L]
それぞれの意味:
RewriteOptions inherit
~foo/ 以下の全てのディレクトリでこの設定を有効にする
Options +FollowSymLinks
個人ディレクトリでRewriteRuleディレクティブを有効にするには、これが必要
RewriteRule (.+) http://www.naninani.or.jp/~foo/$1 [R,L]
実際の書き換え。Rewrite (転送したいURLの正規表現) (転送後のURL) [オプション] という文法です。
ここはディレクトリですので、(転送したいURL)の部分は、"index.html"のようにパスを含まないファイル名だけになっています。したがって、正規表現で全体をマッチさせ、()で囲んで、その右の項で$1として指定できるようにします。
Rオプションは、この書き換えは転送であるという意味です。HTTPで返される結果コードが"302 Moved Temporarily"になり、/~foo/ -> /~foo/index.cgi のような転送と同じ結果コードが返されます。Lオプションは、書き換えがこの行で終ることを明示的に宣言します。Rオプションと一緒に使うとよいでしょう。
さて、実際のウェブページの移転は、一気に新しいサーバに移れるものではなく、少しづつ移転するものです。そこで、新しいサーバにはまだ無いが、古いサーバにはまだコンテンツがある、という場合の処理を加えてみましょう:
RewriteCond http://www.naninani.or.jp/~foo/%{REQUEST_URI} -U
RewriteRule (.+) http://www.naninani.or.jp/~foo/$1 [R,L]
RewriteRule (.+) - [PT]
RewriteCond http://www.naninani.or.jp/~foo/%{REQUEST_URI} -U
RewriteCondは、次に続く条件式を評価するディレクティブです。%{REQUEST_URI}は、次のRewriteRuleの正規表現(.+)と同じものを指します。"-U"はUNIXファイルテストと同様の文法で、指定されたURIで表されるコンテンツがあるかどうか調べます。もしあれば、次のRewriteRuleディレクティブが実行されます。
RewriteRule (.+) - [PT]
"-"は、書換えを行なわないことを示します。[PT]は、Apacheの他のディレクティブ(AliasやScriptAlias)に処理を渡すことを命じます。
よって、このRewriteRuleディレクティブ全体では、http://www.naninani.or.jp/~foo/%{REQUEST_URI}と言うURIがあるかどうか調べ、もしあればそちらに転送する動作を示します。
新しいサーバの方の.htaccessでは、新しいサーバの方に該当コンテンツが無ければ、古いサーバ持ってくるようにします。
RewriteCond http://www.naninani.or.jp/~foo/%{REQUEST_URI} !-U
RewriteRule (.+) http://www.hogehoge.or.jp/~foo/$1 [R,L]
RewriteRule (.+) - [PT]
★その他のサーバサイドスクリプト
今注目のサーバサイドスクリプトでは、抜きん出てPerlを使ったものが多いです。しかし、多様性とフリーソフトの精神が息づくUNIXです。それに加え、今注目の分野だけに、多くのソフトウェアベンダーが参入してきています。その結果、Perl以外の選択枝もたくさんあります。ここでは、それらを簡単に紹介していきたいと思います。
サーバサイドスクリプトの機能の要素は、次のように分解できます:
1. ファイル操作(オープン、クローズ、書き込み)
2. 時間測定(今の時間の測定)
3. 数式処理(整数・浮動小数点の加減乗除)
4. 条件分岐(if、while、for)
5. 文字列処理(正規表現、文字列比較、文字列加減)
6. HTMLフォームの処理
日本語正規表現など機能に優劣はややありますが、以上は、PHP/FIも含めて今回紹介する全てのスクリプト技術が備えているものです。問題となるのは次の点です:
7. データベース接続(GDBM、SQL、ODBC、xBase)
8. 変数のスコープ(グローバル、ファイル内、ブロック内)
9. ユーザ定義関数
10. オブジェクト指向(メソッド)
11. インターネット系プロトコル(SMTP、POP3、HTTP)
12. 商業プロトコル(CyberSource SCMP、CyberCash、IC Verify)
13. セキュリティ(実行権限、アクセスログ、認証)
以上の観点から、各スクリプト技術を簡単に比較していきましょう。
Miva (htmlscript 3.0)
http://www.htmlscript.com/
動作環境 CGI、ISAPI、NSAPI
使用条件
NSAPI版以外:1サーバ当たり$497、複数ライセンス割引、年間アップグレード料金あり
NSAPI版:1サーバ当たり$995、複数ライセンス割引、年間アップグレード料金あり
Miva言語とは、XMLによって定義が与えられる言語です。従って、スクリプトの見た目はHTML(SGML)に似ています。
ページによると、現在、最新バージョンである3.0が"final beta"状態にあり、もうすぐ3.0リリースが登場するそうです。古いバージョンのhtmlscriptとも互換性があり、Mivaドキュメントの中に埋め込むことも可能です。http://www.webtechs.com/ などが、htmlscriptで運営されています。
・特徴
Open Web Document Connectivity(OWDC):インターネット系プロトコルのサポートを行ないます。PHP/FIでのメールを送信する関数は、内部的にはsendmailを直接起動しパイプで内容を流し込んでいます。MivaではSMTPやPOP3、HTTPと言ったTCP/IP上のプロトコルを使用する関数が用意されています。プロトコルの処理はMiva engineが実行すします。
変数のスコープがはっきりしている。上記のPOP接続機能で取り寄せたデータは、ブロック内のスコープを持つ変数に格納されます。よって、外部からのアクセスができないため安全です。
セキュリティ:hogehoge.mvの所有者権限で動くので、利便性とセキュリティの両立が楽です。CGIはウェブサーバの実行権限で動くので、大抵はnobody権限でウェブサーバを動かします。しかしこれだと、CGIで書き込みを行なうファイルは、全員が書き込み可能でなくてはなりません。つまり、同じホストにいるユーザに、勝手に中身をいじられる可能性があったのです。そのウェブサーバ上の特定のユーザのみが.mvを実行できるように制御可能です。Apacheのsuexecと同様の機能です。
他:質問メールを出せば24時間以内に返すことを約束しています(本当かどうか知りませんが)。サンプルページが豊富についてくるようです。日本語は扱えないかも知れません。
・例
Found
iHTML 2.1
http://www.ihtml.com/
動作環境 ISAPI、NSAPI、WSAPI、CGI
使用条件 フリー〜$895
WindowsNT 3.51、Window95以上でのみ動く。UNIX、NetWare、Macintosh版の出荷も予定されています。フリーも含め、いろいろな価格帯のライセンスが存在します。http://www.boardwatch.com/mag/97/Nov/bwm34.htmに、広告のヒット率の統計をODBCで取るスクリプトと、その説明が載っています。
・特徴
Back Page Processing:HTMLファイルを、あたかも一つのアプリケーションであるかのようにサーバのバックグラウンドで動作させる。
FAX送信のサポート、標準エラー出力のページへのリダイレクト、GD相当の画像生成機能、など。
・例
MetaHTML (Pro)
http://www.metahtml.com/
動作環境 CGIなど
使用条件 フリーソフト(5.05)、$2,500(Pro 6.0)
その名前の通り、HTMLタグにマクロを定義することが出来ます。
sample-macroの定義:
sample-macroの使用:
Hello World !!
出力されるHTML:
GNU GPLのバージョンと、無料だけどバイナリ配布なProバージョンとがあります。ProにはODBCドライバと、GUIでウェブサイトを管理するツールPOWERSTRIPがついてきます。GNU版でも、MySQLとdbmへのインターフェースがあります。ソース公開のデバッガがあるのが大きな特徴でしょう。
NeoWebScript 2.2
http://www.neosoft.com/neowebscript/index.html
動作環境 Apache 1.2.1モジュール
使用条件 組み込んだサーバを売らない限りフリー
tcl/tkインタープリタ(http://sunscript.sun.com/)をApacheに埋め込みます。SSI風の呼びだしを行ないます。
・例
mod_pyapache
http://www.msg.com.mx/pyapache/
動作環境 Apacheモジュール
使用条件 フリーソフト
Pythonインタープリタ(http://www.python.org/)をApacheに埋め込み、Pythonで書かれたCGIの動作速度を高速化する。mod_perlのように、Apache API へのアクセスもあります。
ASP(Active Server Pages)
http://www.microsoft.com/japan/products/iis/iis30/overview/asp.htm
動作環境 Internet Information Server 3.0(WindowsNT Server 4.0)以上、Peer Web Server(WindowsNT Workstation 4.0)以上、パーソナルWebサーバ(Windows95、Macintosh)
使用条件 無料
参考 http://www.nse.co.jp/ASP/
OSに続き、ウェブの世界も主導権を握らんとするマイクロソフト。JScript、VBScript、ActiveX、IDC(Internet Database Connect)と矢つぎ速に新技術を投入してきました。ここにきてマイクロソフトは、複雑化してきた自社のウェブ技術を、ASPに集約させていく模様です。マイクロソフトによると、ASPはCGIとIDCの代替品という位置付けです。
・特徴
IIS、MS SQL Server、ActiveXとの連係が良い:結果、大抵の事が出来てしまいます。商業プロトコルの実装だけはまだ無いみたいです。
任意の言語が使える:サーバサイドスクリプトでは、特定の言語(スクリプト)しか使えませんが、ASPではActive Scriptingプラグインを追加することにより、任意の言語を埋め込むことが出来ます。例えば、Perl for ASP(PerlScript)はhttp://www.ActiveState.com/で手に入ります。とはいえ、VB Scriptで書くのが無難なようです。
・例
sample.asp
<% For i = 3 To 7 %>
Hello World!
<% Next %>
LiveWire、サーバサイドJavaScript
http://www.netscape.com/
参考:http://www.dhw.co.jp/~hong/java/javascript/
対するネットスケープでは、LiveWire (Pro)と呼ばれる対抗技術を持っている。やはり、データベースとの連係、サイト管理、JavaScriptコンパイル機能を持っています。
WML(Website Meta Language)
http://www.engelschall.com/sw/wml/
動作環境 UNIX系
使用条件 フリーソフト
mod_rewriteとePerlと同じ作者の手による、ウェブサイト構築ソフト。9つのソフトが連係して動きます。
WebObjects 3.1J Enterprise
http://software.apple.com/webobjects/
動作環境 OpenStep(WindowsNT、Solaris、HP-UX、NeXTSTEP)
使用条件 198,000〜6,998,000円
Appleと合併したNeXTの目玉商品の一つで、動的にウェブサイトを構築するバックエンドシステムである。http://store.apple.com/のオンライン直接販売もWebObjectsで運営されており、最近話題になっている。
JavaやObjective Cなど任意の言語で書かれたオブジェクトをウェブサーバ側で生成する、複数のデータベースに同時にアクセスして一つのHTMLを出力する、ウェブサーバで実行するバックエンドアプリケーションを、他のマシンの上で実行させることが可能、ビジュアルなHTML、SQLクエリ文構築、など。値段も高いが機能も一番高い。
同様な製品に、NetObject Fusion 2.0(http://www.netobjects.com/)、Lotus Dominoなどがある。
WebMix
http://webmix.epl.co.jp/
動作環境 WindowsNT
ウェブサーバからデータベースにアクセスするための拡張タグを理解する、ウェブサーバそのものを含んだシステムを販売している模様。国産製。
最後に
この記事にPHP/FIの情報などを加えたものを、http://www.first.tsukuba.ac.jp/~urat/ で公開しています。気が向いたら、最新情報などを付け足していきたいと思っています。間違った点やお気づきの点は、urat@first.tsukuba.ac.jpまでメール下さい。
それでは皆さん、楽しいウェブ生活を!