このファイルは Zopeインストールディレクトリ/doc/ の中にあった WEBSERVER.TXT をテキトーに訳したものである。ローカルのディスクに保存して読みやすいように適当なエディタなりビュワーで見てほしい。 History ------- rev. 20020603 とりあえず Web に載せてみる 他の Web サーバと同時に Zope を使う ----------------------------------- Zope は Web サーバにくっついてくるにも関わらず、あなたは他の Web サーバを使いたいと思うかもしれない。そんなときは Unix と Windows での話になるが永続CGI(PCGI)や FastCGI を使うことで他の Web サーバと Zope を協働させることができる。 おおまかに言えば、PCGI とは Web サーバからの CGI リクエストを Zope リクエストに変換するものである。CGI リクエストは伝統的には一つのイベントである。Web サーバは CGI スクリプトのためのリクエストをハンドリングし、新しいプロセスを生成し、プロセスが終了したときにその戻り値を返す。 Zope は長い時間動きつづけているプロセスである。これは伝統的な CGI プログラムのようにはリクエストに応じて開始したり終了したりするものではないことを意味する。そんなことをしたら Zope のようなアプリケーションサーバを動かし、またそれを止めるのが原因で、一つのリクエストの処理に莫大な時間が掛かってしまうだろう。だから PCGI は個別の CGI プロセスから長時間動いている Zope プロセスへと橋渡しをする一つのオプションなのである。 FastCGI は PCGI にとてもよく似ている。PCGI は Apache と Zope を接続する「とても薄い」外部 CGI プログラムであるが、FastCGI は Apache のモジュールである。これは Apache が PCGI という CGI プログラムを実行するために fork するときに課せられる「fork tax」と呼ばれるものを節約するものである。 ZServer のマルチスレッドモードで Zope を使う -------------------------------------------- ZServer は Zope オブジェクトを様々な伝送プロトコル上で公開するための一般的な目的の TCP サーバである。Zope をマルチスレッドで動かすためには ZServer を使う必要がある。 ZServer は Sam Rushing の Medusa ソフトウェアをベースにしている。ZServer のコアとして Medusa を使うメリットは、それがプロトコルに依存していない(Medusa は様々なプロトコルに対してライブラリを提供する)点と容易に拡張できる点にある。Medusa は Python で書かれており、設計において非常に高いパフォーマンスを有しており、HTTP サーバ、FTP サーバが付属してくる。だから我々は Zope のコアに Medusa を採用したのだ。 それはしかし Zope が実際に HTTP リクエストを待ち受けるために必要不可欠というものではない。もし Apache に実際の待ち受けとサービスを行なわせたいのであれば、 ZServer の PCGI や FastCGI コンポーネンツを Apache と通信させることができる。 PCGI ZServer を PCGI を動かすためには、'z2.py' スタートアップスクリプトに対して -p オプションを指定しなければいけない。Zope のトップディレクトリから、 bash% python2.1 z2.py -p と入力するだけだ。 気をつけてほしいのは、これをやるためには 'INSTALL.txt' に書かれている指示をすでにやり終えていなければいけないってことだ。 このコマンドは ZServer を PCGI(デフォルトでは、他にも HTTP サーバと FTP サーバが動くことになっている)とともに起動するだろう。PCGI が働くためには Web サーバと Zope が PCGI のリソースファイルについて共通理解を作っておかなければいけない。もしこのファイルが 'Zope.cgi' 以外の名前で、'z2.py' と同じディレクトリにない場合は -p のあとにそのファイル名を指定してという方法がある。こんな感じだ。 bash% python2.1 z2.py -p /path/to/PCGI/resource/file さぁこれで Zope という長時間動き続けるプロセスが開始された。そして PCGI コンポーネントがロードされて Web サーバからの CGI リクエストを受け取る準備ができたのだ。 このインストールプロセスは 'Zope.cgi' という PCGI ファイルを作る。この 'Zope.cgi' ファイルを Web サーバの 'cgi-bin' ディレクトリにコピーすること。 Unix の場合はシンボリックリンクでもいい。例えばこんな感じだ。 ln -s /home/amos/Zope/Zope.cgi /usr/local/apache/cgi-bin/Zope この時点で Web サーバの要求するインストールと CGI スクリプトの設定に関する手続きは済んでいないと済ましておくように。 追記。PCGI についてより詳細を知りたければ Jeff Bauer の "PCGI pages" http://starship.skyport.net/crew/jbauer/persistcgi/ をチェックされたし。 Zope.cgi ファイルがお使いの Web サーバにとって正しい CGI スクリプトとして設定されたら、Web を通じて Zope にアクセスする準備完了だ。ブラウザに 'http://youmachine.example.com:8998/cgi-bin/Zope.cgi/manage' を表示させよう。(URL はたぶん Web サーバをどのように設定したかによって違うだろうけど) ユーザー名とパスワードを入力するように要求されるはずだ。そしたら Zope の管理者("super manager")の名前とパスワードを入力してほしい。 注意。Apache は Zope に HTTP 認証ヘッダ情報を渡すためにあるトリッキーな設定を要する。「外部 Web サーバと連携した Zope 認証」のセクションを参照のこと。 Zope/PCGI のための Apache モジュールがある。 http://www.zope.org/Members/phd/mod_pcgi2/ これは簡単にコンパイルして設定することゴアできる。それは HTTP 認証ヘッダと他の環境変数を通してくれるものだ。バーチャルホストもサポートしている。 FastCGI FastCGI はすでに Apache モジュールをインストールし終えているのであれば比較的簡単にセットアップできる。まだだとしても心配無用だ。別に難しいことじゃない。インストラクションに真っ直ぐ従ってくれればオーケー。 mod_fastcgi モジュールを FastCGI.com からダウンロードしなければいけないはずだ。 http://www.fastcgi.com 2.2.2 よりも新しいバージョンが必要だ。もし 2.2.3 やそれ以降のものがまだ利用できないのであれば、10月6日バージョン以降の snapshot を get してほしい。 http://www.fastcgi.com/dist/ アーカイブを紐解き、INSTALL ファイルの指示に従ってくれ。DSO という方法を使うのが普通はいちばん簡単だ。 次に Zope が FastCGI を使うようにセットアップしないといけない。このとき FastCGI を UNIX socket と TCP ポートのどちらで使うかを決めなければいけない。 Win32 環境やその他の UNIX socket(ファイルシステムの中の socket)を提供してくれない OS を使っている場合は TCP ポートを使わなければいけないだろう。Apache と Zope を別々のコンピュータに別居させる場合もこの方法を採らないといけない。これ(ポート番号)は恣意的なものであるが、すでに使われているものであってはいけない。仮にスーパーユーザーでないのであれば、十分に大きな数字にしなければいけない。ここでは説明のために 8889 を使うこととする。 # Win32版 Zope 2.4.3 はデフォルトで 8090 が PCGI のために使われることになっています。 UNIX socket は TCP ポートを開かない。これは堅固なセキュリティを要する場面では有用であろう。しかしそのためにはもうしばしのセットアップが必要だし、ちょっと道具としての保証に欠けるところがある。まず socket に使う場所とファイル名を選ばないといけない。'/tmp/zope.soc' のようなオプションであったり、Zope の中の 'var' ディレクトリなどである。Zope と Apache の両方がソケットファイルを読み書きできるパーミッションを設定していることを確認するように。説明のためにここでは '/tmp/zope.soc' を使おう。 これを設定するオプションは '-F (port #|socketファイル名)' である。'start' スクリプトを編集してくれ。Zope をインストールしたルートディレクトリにあって、こんな風になっていると思う。 #! /bin/sh reldir=`dirname $0` PYTHONHOME=`cd $reldir; pwd` export PYTHONHOME exec /usr/bin/python \ $PYTHONHOME/z2.py \ -D "$@" '$PYTHONHOME/z2.py \' の行のうしろにに挿入してほしい。もし TCP ポートを使うのならこうなっているだろう。 -F 8889 \ socket を使うときはこの行がこんな風になっているはずだ。 -F /tmp/zope.soc \ バックスラッシュは重要だよ! さぁこれで 'start' スクリプトを動かすことで Zope を起動することができる。 $ ./start 注意してほしいのはデフォルトでは start スクリプトは Zope をデバッグモードで起動してしまうということである。そしてこのコマンドは Zope を終了するまでシェルのプロンプトには戻ってこないだろう。 次に、Apache を Zope への FastCGI の リクエストを通すようにセットアップしなければいけない。これは Apache の httpd.conf の中の 'FastCGIExternalSever' ディレクティブの中で行なう。'FastCGIExternalServer' を使って FastCGI に長時間動き続けるプロセスを手動で起動したり終了したりするのは教えてやるのだ。「セクション2」の始めで行なわれている。このディレクティブは TCP ポートを使う設定になっている場合はこのようになっているだろう。 FastCgiExternalServer /PATH/TO/apache/htdocs/zope \ -host localhost:8889 \ -pass-header Authorization 、、、あるいは socket を使うための設定はこんな感じだ。 FastCgiIpcDir /tmp FastCgiExternalServer /PATH/TO/apache/htdocs/zope \ -socket zope.soc \ -pass-header Authorization FastCgiIpcDir ディレクトリは FastCGI にどこで socket ファイルを見つければいいのか教えるために必要である。デフォルトでは FasiCGI は /tmp/fcgi の中に見つけようとする。'-socket' オプションでフルパスを指定することは「できない」。FastCgiIpcDir ではファイル名だけである。 # なんか変じゃないか? ディレクティブ名のあとの最初の引数はややこしい。Apache は URL を 'DocumentRoot' の中のディレクトリとファイルの数々にマップする。DocumentRoot ディレクトリ内のファイルの名前を指定する必要があるが、そのファイルは現実に存在する必要はない(またあるいはあるべきでない)。Apache はそのファイルをサービスしようとするときには、代わりに FastCGI へとリクエストを渡すだろう。分かった? じゃあ例えば、Zope を以下の URL からアクセスできるようにしたいとしよう。 http://myserver.org/myzope /usr/local/apache に Apache をインストールしたと想像してみてくれ。ディレクティブはこのようにならないといけない。 FastCgiExternalServer /usr/local/apache/htdocs/myzope \ ... ... 次の引数は TCP ポートを使うか socket を使うかによる。-host(port) 引数がホスト名を必要とすることに注意してほしい。例えば同じホストで Apache が動いている場合にはこれは問題にはならない。socket を使っているなら Apache がそれを見つけるための適切な特権を持っていることを確認してほしい。 最後の引数、'-pass-header Authorization' は FastCGI に Zope へと認証ヘッダを通すことを教えるものだ。この設定なしには Zope の Web マネジメント画面や他の認証を必要とするすべてのものを使えるようにはならない。(注意:この特徴については mod_fastcgi 2.2.2 にはなかった。) もう一つの項目を httpd.conf に加えなければいけない。'FastCgiExternServer' ディレクティブ以下に次のように入力する。 SetHandler fastcgi-script '/zope' の部分は適当に変えてほしい。上の例の 'http://myserver.org/myzope' を用いれば、このようになるだろう。 SetHandler fastcgi-script これはロケーションを決定する特殊なケースを生み出す。Apache に FastCGI がリクエストをハンドルすることを許すことを教えるものである。 これで必要なことの全部だ。Zope が動いていることを確認したら、Apacha を起動かもしくは再起動してくれ、それでおしまいだ。 Zope をシングルスレッドで PCGI Publisher として使う --------------------------------------------------- インストールプロセスで 'Zope.cgi' という PCGI ファイルが作られるはずである。この 'Zope.cgi' を Web サーバの cgi-bin ディレクトリにコピーしてくれ。 Unix では cgi-bin ディレクトリからシンボリックリンクを張ってもいい。例えばこんな風に。 ln -s /home/amos/Zope/Zope.cgi /usr/local/apache/cgi-bin/Zope この時点で Web サーバの要求するインストールと CGI スクリプトの設定に関する手続きは済んでいないと済ましておくように。 追記。PCGI についてより詳細を知りたければ Jeff Bauer の "PCGI pages" http://starship.skyport.net/crew/jbauer/persistcgi/ をチェックされたし。 Zope.cgi ファイルがお使いの Web サーバにとって正しい CGI スクリプトとして設定されたら、Web を通じて Zope にアクセスする準備完了だ。ブラウザに 'http://youmachine.example.com:8998/cgi-bin/Zope.cgi/manage' を表示させよう。(URL はたぶん Web サーバをどのように設定したかによって違うだろうけど) ユーザー名とパスワードを入力するように要求されるはずだ。そしたら Zope の管理者("super manager")の名前とパスワードを入力してほしい。 他の Web サーバを使っての Zope 認証 ----------------------------------- Zope は通常、ユーザーについて認証(authentication)と権限の付与(authorization)の両方を行なう。いくつかの Web サーバは CGI スクリプトへの認証情報を渡さない。もし Web を通して「super manager」の名前とパスワードでの Zope へのアクセスを試みても弾かれ続けているとすれば、それは Web サーバが Zope に認証情報をよこしていないと見るよいきっかけだ。 Apache を認証ヘッダを渡すようにする Apache と Zope についての試みの前に、Zap を見てみることを強くオススメする。Zap とは Linux 用にすでにコンパイルと設定のしてある Apache であり、それは何の面倒もなくまさに Zope のために作られたものである。どうしても今動いている Apache を使いたいとしても、あるいは Apache を Linux ではなく別なプラットフォームで使っていたとしても Zap の 'httpd.conf' ファイルは Apache の設定をするためにとても有用だ。 Zap は Zope の Web サイトのここで見つけることができる。 http://www.zope.org/Download/Releases/Zap-1.1.0 Apache を使っている場合は Apache に Zope へ認証ヘッダを渡すように説得する必要があるだろう。Apache 1.3 以上を使ったいちばん簡単な方法は mod_rewrite を使うことである。Apache の設定ファイルの中に置く設定情報の例はこんな感じ。 # Zope configuration maps /Zope/ to the Zope.cgi CGI script RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^/Zope(.*) /usr/local/apache/cgi-bin/Zope.cgi/$1 [e=HTTP_CGI_AUTHORIZATION:%1,t=application/x-httpd-cgi,l] RewriteRule は1つの長い行にすべきで、最後の文字は 1 じゃなくて l(エルの小文字)であることに注意すること。 Apache の 1.3b4 以上では、サーバに認証ヘッダを通す別な方法があるが、そのためには Apache をコンパイルし直すだけの力が必要だ。-DSECURITY_HOLE_PASS_AUTHORIZATION フラグをコンパイルのときに通すと、その結果の Apache のバイナリは認証ヘッダを CGI プログラムへ通すので、上述のように Rewrite ルールを使うのを避けることができる。 サーバ自身が認証をハンドルできるようにする ときに Zope 外部で認証をハンドルしたいと思うかもしれない。例えばすでに Web サーバで込み入った認証を行なっているときなんかだ。あるいは認証情報を Zope に渡すよう説得するのが(設定するのが)難しすぎると思われる場合。 1.9(Zopeのバージョン) において、Zope は Web サーバに認証のハンドルを許可するモードを備え始めた。'REMOTE_USER' 環境変数は Zope においてユーザーオブジェクトの識別と一致するようになった。 以下では Apache をある目的のために設定する段階的なインストラクションを提供する。その目的とは Zope の super manager を Zope の 'access' ファイルで指定し、ユーザーを Zope のユーザーフォルダで指定し、それを Web サーバを通じて認証させることである。 Apache が /cgi-bin/Zope を認証するようにする Apache の設定ファイルにこのようにディレクティブを追加する。 AuthType Basic AuthName Zope-realm AuthUserFile /usr/local/etc/httpd/conf/ru_users require valid-user で、Apache に '-1' シグナルを送り設定ファイルを再読み込みさせる。 *注意* 上の記述は '/cgi-bin/Zope' が設定ファイルの中の他のディレクティブで実行可能になっていることを前提にしている。 Apache が 'superuser' を持つようにする Apache ツールをユーザーデータベースの管理に使うためには、上で設定した 'AuthUserFile' が 'superuser' という名前の妥当なユーザーの情報を持っていることを確認してくれ。 Zope が Apache のユーザー認証を使えるようにする Zope のアクセスファイルを supderuser の ID とそのあとに一つのコロンだけを含むように変更してくれ。こんな感じだ。 superuser: これはスペースを含むどんな値も取れることに注意してほしい。制限は Apache ユーザーデータベースの中で決められているユーザー名に一致する値であること、それだけである。 注意: アクセスファイルの中でパスワードは消しておくこと localhost インターフェイスを通じてあらゆるユーザーからの接続をモニタするためのアクセスを許可するためにも -- 仮にこのプションを信用できないログインを許可するあらゆる box(?) で使う場合は「モニタは無効にする」 こうして Zope を終了する。 kill `cat var/Main.pid` これを Zope のディレクトリから行なう。 Zope を設定する この段階で 'superuser' でログインできる。もし他のユーザーとして Apache のユーザーデータベースを使って Zope で認識できるようにしたければ、ユーザーフォルダ(acl_users という ID を持つオブジェクト)にその名前を追加する必要がある。トップフォルダにあらかじめ設定されてある acl_users をクリックするかユーザーフォルダオブジェクトををサブフォルダに追加する。 Web サーバ固有の情報 Apache * 以上のように、Apache はデフォルトでは CGI スクリプトに認証情報を渡さない。この状況の扱い方の情報は上を参照のこと。 * PCGIをサポートするモジュール(mod_pcgi2)がある。詳細は上の「PCGI」セクションを参照。 Netscape サーバ * Apache のように、Netscape は CGI スクリプトに対し、HTTP 認証情報を渡さない。このアドレスにプラグインがある。http://www.digicool.com IIS * Windows NT のチャレンジ/レスポンス認証はオフにしなければならない。そのためには IIS マネージャからサーバを右クリックし、サービスのプロパティをを選んで 'Windows NT Challenge/Response' と、不思議なことに Basic 認証の*両方*を、サービスタブのワークシートのパスワード認証エリアから選択しないようにする。 * IIS は親切にも PATH_INFO をログから捨ててくれる。そのため実際にアクセスされている Zope オブジェクトを記録したい場合、ISAPI フィルタを詳しく調べる必要があるだろう。 * PCGI をサポートする ISAPI モジュールは現在開発中である。 * IIS 4.0 は Zope のエラーメッセージをデフォルトでは破棄してしまう。この振る舞いはわずかながら認証問題に関するものを含む問題を生む可能性がある。 Microsoft はユーザーが何か失敗したときに IIS 4.0 の提供するクリアなエラーメッセージに自信を持っている。これらのエラーメッセージはカスタムエラーハンドラーのフォームの中に組み込まれている。ハンドラーはあるエラーが起きたとき、ユーザーにファイルか URL を返す。 これは、新しい SQL メソッドを作って喋ろうと思ったときに ID をはめ込むのを忘れてしまった場合は、Zope の生のエラーメッセージは IIS のまったくお門違いなエラーメッセージに取って代わられてしまうということを意味している。また、サーバ内の安全なエリア内にユーザーが IE 5 を使ってログインしようとしたときにも認証を破壊してしまう。これらのカスタムエラーハンドラはデフォルトで有効になっている。 幸い、ハンドラは非常に簡単にオフにできる。 マネジメントコンソールから IIS サイトを開き、実行可能な PCGI を置いたフォルダまで向かう。Zope を'Zope' という名前でインストールしている場合は、'Zope.exe' と呼ばれているだろう。このファイルをダブルクリックしてくれ。プロパティページが現われるはずだ。そこで「カスタムエラー」タブを選ぶ。今度はリストボックスの中から 'Default' タイプになっていないすべての HTTP エラーコードを選び、それぞれ 'Set to Default' ボタンをクリックしてくれ。これで IIS が Zope の返すエラーメッセージをオーバーライドしてしまうのを無効にできる。 OK をクリックして、ほら、Zope が、自分の考える世界に対して間違いを教えてくれるようになっただろ。