浦栃
Last modified: Fri Aug 18 21:50:11 JST 2000

Apache - Perl

CPAN/by-module/Apache/ [ KDDミラー | dtiミラー | jaistミラー ]

リンク


FastCGI Official | Unofficial
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の代替として開発された、より高速で安全に設計された入出力ライブラリです。
      Perl 5.004_04 と、sfio97を手に入れます(今はsfio98が出ています)
            % 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が出てくるのを待つか、ドキュメントを参考に自分で書きましょう。

    Disclaimer

    FastCGIのコンセプト自体は優れていると思いますが、今はまだまだかなりの開発作業が必要な段階です。ビジネスで今すぐ使いたいのであれば、PHP3なりmod_perlなりをお勧めします。会社の方で時間と設備とがふんだんにあるのであれば、FastCGIの開発に貢献するのもまた良いでしょう。SoftwareDesignにFastCGIについて書いたのも、開発コミュニティをもっと広げられたら、と思ったから、というのもあります。今の普通のCGIのはやり具合を見ると、言語・アーキテクチャ非依存のFastCGIは、言語依存のPHP3やmod_perlなんかよりはるかにメジャーになる可能性を秘めているように思えます。

    mod_rewrite
    動作環境
    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.or.jp/~foo/bar/zoo.html
    http://www.hogehoge.or.jp/~foo/boo.html  -> http://www.naninani.or.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]
    
    それぞれの意味:
    さて、実際のウェブページの移転は、一気に新しいサーバに移れるものではなく、少しづつ移転するものです。そこで、新しいサーバにはまだ無いが、古いサーバにはまだコンテンツがある、という場合の処理を加えてみましょう:
    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]
    


    用語

    =head1 NAME
    
    INSTALL - Apache mod_perl installation instructions
    
    =head1 DESCRIPTION
    
    How to build, test, configure and install mod_perl
    
    =head1 PREREQUSITES
    
    =over 3
    
    こんな感じの見ためを持つのはperldocコマンドで見る。
    perldoc: Perlをコンパイルするとついてくる。
    DBMS: データベースマネージメントシステムの略。
    SQL: Simple(Starndard、もしくは Structured という説も?) Query Language。データベースへアクセスする言語。
    CPAN: Comprehensive Perl Archive Network。Perlのモジュールやスクリプトが集まっているところ。近くのCPANに飛んでいってくれるCPAN multiplexer