PWS
PWS (Personal Web Server) メモの目次
- PWS (Personal Web Server) メモの目次
- はじめに
- IIS 4.0 との比較
- インストール時のエラー
- Perl で CGI の設定
- 任意の拡張子で SSI を使う
- CGI のカレントディレクトリの扱い方について
- 環境変数 PATH_INFO も癖ありだぜ!
- セキュリティに関して
- パーソナルWEBマネージャのタイトルが文字化けする
- PWSの終了
- PHP も使える!
- Another HTML-lintを動かして見よう!
- PukiWikiを動かして見よう!
- 忘れちゃならない!FreeStyleWikiもー
- XOOPS2を動かしてみよう!
- ISAPIカウンターを使おう
- リモートスクリプティング
はじめに
このページに記載されている情報は、Windows98SE と PWS 4.0 という環境での内容です。PWS (Personal Web Server) とは、Microsoft が無償配布しているWEBのサーバソフトウェアで、Windows98 には標準で付属しています。
PWS 4.0は、IIS 4.0 (Internet Information Server) とコアコンポーネントが同一で、基本的に同機能を持っています。そのため、ASP (Active Server Page) なども動かすことができ、イントラネットの簡易サーバやASPの開発用などに便利です。私の場合、ASP の他 CGI/SSI なども全て PWS上 で開発しています。
興味がある人は Microsoft のダウンロードサイトからダウンロードできますので、使ってみましょう!Windows NT 4.0 Option Pack に NT 用と 95, 9x 用が収まっています。Me ユーザも利用できるそうですので自己責任でお試しください。
レジストリの操作など書いていますが、やる前にかならずレジストリのバックアップを取りましょう。これらの操作は全て自己責任でお試しください。
IIS 4.0 との比較
PWS はイントラネット内の運用を想定した簡易WEBサーバのため、IIS と比較した場合、
- 同時接続クライアント数が 10 に制限される
- PWS にはパーソナル Web マネージャという管理ツールが付属される
- ODBC 経由でのログ収集機能がサポートされない
- IP アドレスとドメイン名による制限機能はサポートされない
- 帯域幅の調整機能がサポートされない
- 複数の Web サイト作成機能がサポートされない
などの機能制限があります。私的には「仕事でちゃんと使えているので開発には十分」といったところです。癖があってなかなか楽しいですよ(^^;
同時接続数 10 というのも、軽めのHTMLを単純に公開するなら1000アクセスくらいのプチ人気サイトになっても多分問題はないでしょう・・・(ホントかよ?)。
ASPなどでセッション処理をするときや、チャットなどの設置でサイトに常駐するとか、同時接続誘発するページ構成はできるだけ避けた方がいいでしょう。
セキュリティ面もヨワヨワなので・・・特にWin98では認証もできないので、CGIの腕が上がるでしょう。:-)
インストール時のエラー
PWSのインストール時に、「システム レジストリへの MTS 固有の変更を書き込み中に不明なエラーが発生しました。 」とかいうエラーダイアログが表示されたよ・・・とほほ。どうしたもんかと調べてみたら、MSサイトに解決策がちゃんと載っていました。お困りの方はどうぞ。
Mtssetup が Transaction Server Core コンポーネントのエラーを修正する
要は、Mtssetup.dllの更新版をダウンロードしてきて、元ファイルと入れ替えてからインストールするだけです。
上記リンクが切れていた時は、MSサイトで、mtssetup を検索してください。これをやるとWindowsMeでも使えるという情報もドコゾのHP(英語)にありました。
Perl で CGI の設定
Perl で CGI/SSI のレジストリ設定をまとめておきます。Windows98用です。他の環境で同じかどうかは知りません。
尚、ActivePerl を ダウンロード&インストールしてあるのが前提条件です。ActivePerl のインストールが解らない人はPerlのページをご覧下さい。
- [スタート]→[ファイル名を指定して実行]で regedit と入力してレジストリエディタを開きます。
- 左側のツリーで、[HKEY_LOCAL_MACHINE]→[System]→[CurrentControlSet]→[Services]→[W3SVC]→[Parameters]→[Script Map]を開く。
- 右側のウィンドウで右クリックして、[新規]→[文字列] を選択。作成されたレジストリ値の名前を .cgi に変更します。
- 変更した .cgi をダブルクリックして c:\perl\bin\perl.exe "%s" "%s" と値欄に書きこみます。尚、c:\perl\bin\perl.exe 部分は perl.exe のパスです。自分の環境に合わせて変更してください。ActivePerlを普通にインストールするとこのパスになります。
いちいちレジストリエディタで編集するのが面倒という人は、.regでも簡単に登録できます。下のコードをコピーして .regという拡張子の適当なファイル名で保存して、ダブルクリックするだけで登録できます。
REGEDIT4 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\Script Map] ".cgi"="c:\\perl\\bin\\perl.exe \"%s\" \"%s\""
もう一つ。Perl.exeでなくISAPIを使用する方法がありますが、こちらの方がトラフィックが少なくお勧めです。
REGEDIT4 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\Script Map] ".cgi"="c:\\perl\\bin\\perlis.dll"
任意の拡張子で SSI を使う
CGIの設定でやったように、[HKEY_LOCAL_MACHINE]→[System]→[CurrentControlSet]→[Services]→[W3SVC]→[Parameters]→[Script Map] のレジストリに、c:\windows\system\inetsrv\ssinc.dll を追加します。
REGEDIT4 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\Script Map] ".htm"="c:\\windows\\system\\inetsrv\ssinc.dll"
注意).html 拡張子に適用したら.htmlのファイルにアクセスするとエラーが表示されるようになりました。設定を元にもどしても、このエラーは直らず・・・(/_;) 仕方がないので、PWSを再インストールしました。とほほ。
CGI のカレントディレクトリの扱い方について
PWS でCGIを動作させると、CGI内でのカレントディレクトリの位置が、サーバのルートディレクトリや仮想ディレクトリを設定していればそのルートディレクトリになってしまいます。
作成した CGI を、PWS/IIS 上で使用するのであれば問題ないのですが、Apacheなど他のWEBサーバ上に持っていくと、ディレクトリの扱いの違いにより、CGIが動作しなかったりします。
これを回避するには色々な方法がありますが、私の場合、以下のようなコードをプログラムの先頭に入れています。
#!/usr/bin/perl -w # pwsdir - IIS/PWSならばカレントディレクトリを移動する # (C) 2003 by tuka. All rights reserved. use strict; if($ENV{SERVER_SOFTWARE} =~ /^Microsoft-IIS/i){ my $curdir = ($ENV{PATH_TRANSLATED} =~ m!(^.*)\\.*!)[0]; chdir($curdir); }
サーバソフトウェアがIISだったならカレントディレクトリを移動するプログラムです。こうすることでPWS上で開発したCGIがそのままApacheなどで使えるようになります。( 環境変数 PATH_INFO を良く使う人は次の節も参照して下さい。)尚、一行目のPerlへのパスはLinuxなどの環境に合わせておきます。PWS4.0の場合これでWarningも通ります。
面倒臭いのであまりお勧めしませんが、使用するディレクトリが決まっているのであれば、仮想ディレクトリの下に仮想サブディレクトリを作ると小細工なしで使えるようになります。予めディレクトリを作っておかなければなりませんので、あくまでも使用するディレクトリが決まっている場合に限ります。
環境変数 PATH_INFO も癖ありだぜ!
前節のカレントディレクトリもそうでしたが、PATH_INFO も癖があります(^^;。PATH_INFO は、私的には結構使う環境変数なので放ってはおけない問題なのでした。
環境変数をクールに表示するPerlプログラムを載せておきます。
#!/usr/bin/perl -w # env.cgi - 環境変数一覧を表示する # (C) 2003 by tuka. All rights reserved. use strict; use CGI qw(:standard); local $/; my $TITLE = '環境変数一覧'; my $STYLE = <DATA>; print header(-charset=>'Shift_JIS'); print start_html(-title=>$TITLE, -style=>$STYLE); print h1($TITLE); print table map { Tr[th $_, td $ENV{$_}] } sort keys %ENV; print end_html; exit; __DATA__ body { text-align: center; } table, th, td { border: 1px double navy; } th { background-color: teal; color: white; } td {font-weight: bold; color: gray; } h1 { color: navy; }
例として、http://www.xxx.yyy.zzz/cgi-bin/env.cgi にアクセスしたと過程すると、Apacheの場合、PATH_INFO は表示されません。PWSの場合、/cgi-bin/env.cgi が PATH_INFO として設定されます。
また、http://www.xxx.yyy.zzz/cgi-bin/env.cgi/foo/hoge.html などとした場合、Apacheでは、/foo/hoge.html が PATH_INFO となり、PWSでは当たり前のように、/cgi-bin/env.cgi/foo/hoge.html となります。
対処法ですが、一番簡単なのは CGI.pm を使って、path_info 関数で PATH_INFO を取得する方法だと思います。この CGI.pm ってやつがまた、一癖も二癖もあって・・・ブツブツ。後ほど別のページにまとめておこうと思います。上記の環境変数一覧でも CGI.pm を使っていますが、この関数を追加して表示してみると解ります。例えば、
print h1($TITLE), path_info;のような感じです。タイトルのすぐ下に CGI.pm の吐き出した PATH_INFO が表示されます。
これ以上簡単な方法はないと思うので、考えるのをやめにしようと思ったのですが、CGI.pm に頼らずに、PATH_INFO を取得したい場合はどうするか?ということで、ちょっとだけ検討の余地があります。
環境変数一覧を眺めていて気がついたのですが、SCRIPT_NAME という環境変数が、ルートからCGIファイルまでのパスで、http://www.xxx.yyy.zzz/cgi-bin/env.cgi にアクセスしても http://www.xxx.yyy.zzz/cgi-bin/env.cgi/foo/hoge.html にアクセスしても、/cgi-bin/env.cgi という値が設定されます。
すなわち、PWS の PATH_INFO - SCRIPT_NAME = Apache の PATH_INFOとなりそうな気がしてきました。いや、なるでしょう。
$path_info = ($ENV{PATH_INFO} =~ /^$ENV{SCRIPT_NAME}(.*)$/)[0];となって、めでたしめでたしでしょうか・・・。ちょっと自信なし。
セキュリティに関して
PWSでWEB公開してない私などには関係ないですが、セキュリティ上消すことが望ましいファイルがありました。
次の3種類のファイルをコンピュータ内から抹消します。Dvwssr.dll, htimage.exe, imagemap.exe
消さないとどうなるか、消すとどうなるか等、詳しくは以下のMSサイトに掲載されています。
パーソナルWEBマネージャのタイトルが文字化けする
私の環境(Windows98SE)ではパーソナルWEBマネージャのタイトルが文字化けしてしまいました。PWSの機能に問題はなかったのですが、気持ちのいいものではないので解決策をいろいろ調べていたのですが、見つからず・・・。
日本語環境に文字化けは付き物ですなぁ。いっそのこと英語版にしてしまえ!ということで、日本語版をアンインストールして、英語版を入れました。ということで、一通り操作に慣れたら、英語版を入れるのも吉です。なかなかカッコイイですよ。
PWSの終了
PWSは一度立ち上げてから停止しても、完全に終了していない状態です。そのため停止してから、他のHTTPサーバでポート80を利用しようとしても、ポートが使えないというエラーがでます。PWSを完全に終了するには、ファイル名を指定して実行から以下のように/stopオプションを指定して、pws.exe を実行します。
c:\windows\system\inetsrv\pws /stop
PHP も使える!
はい。今回はPHPのインストールです。
まずPHP4をダウンロードしてきます。今回私がインストールしたバージョンは、4.3.1です。2種類あります。インストーラーの方はインストールは簡単ですが、CGIのみの機能しかないので、Windows Binaries の PHP 4.3.1 zip package [5,853Kb] という方を選択しました。 ダウンロードした圧縮ファイルを解凍し、c:\php というフォルダに移動します。
sapiフォルダにある .reg ファイルをテキストエディタで開いてパスを修正します。折角なので、CGIモードではなく超高速な isapi モードで使いましょう。pws-php4isapi.reg を開きます。
".php4"="c:\\php\\sapi\\php4isapi.dll"
修正したらダブルクリックしてレジストリを登録します。上の例では、拡張子も php4 に修正しています。(拡張子 .php だとなぜか Internal Server Error 500になってサーバに認識されなかったため。)
<html><body> <?php echo "PHPも使えるぞよ!"; ?> </body></html>
色々調べてみたら標準の拡張子 .php でもいけました。
Another HTML-lintを動かして見よう!
CGI/Perlのプログラムです。設置はすこぶる簡単。
- まず、http://openlab.ring.gr.jp/k16/htmllint/ からフルパッケージの圧縮ファイルをダウンロードし適当なフォルダに解凍します。ダウンロードはSJIS版(htmllint.lzh)がいいでしょう。
- パーソナルWEBマネージャで解凍したフォルダに仮想ディレクトリを設定します。
- htmllint.cgi と tagslist.cgi の先頭に上で記載したカレントディレクトリ変更用のコードを挿入します。
#!/usr/local/bin/perl # CGI script for Another HTML-lint gateway ## 開発環境(PWS)ならばカレントディレクトリを移動 if($ENV{SERVER_SOFTWARE} =~ /^Microsoft-IIS/i){ my $curdir = ($ENV{PATH_TRANSLATED} =~ m!(^.*)\\.*!)[0]; chdir($curdir); } require 5.004; $VERSION = '1.11'; $PROGNAME = 'Another HTML-lint';
これだけでOKです。さあPWS経由でアクセスしてみましょう!
PukiWikiを動かして見よう!
今度はPHPのPukiWikiを動かしてみます。PHPなのでカレントディレクトリの小細工はいりませんねぇ。
- http://pukiwiki.org/ から最新版(3/5/23現在Ver1.3.4)をダウンロードしてきます。
- 適当なフォルダに解凍&PWSで仮想ディレクトリを設定します。
- file.php 内の flock() 関数をコメントアウトします。
これでOKです。さあ、PukiWikiも使ってみよう!
忘れちゃならない!FreeStyleWikiもー
おっとお世話になっている FreeStyleWiki を忘れるところでした。基本的に他のCGIと同じです。
#!/usr/bin/perl BEGIN{ use File::Basename; chdir(dirname($0)); }
Wiki.cgi の先頭でカレントディレクトリを変更します。BEGINは、use lib を使っているので、コンパイル時に変更する必要があるため括っています。
今回はモジュールをスマート使ってスマートに書いてみた。
XOOPS2を動かしてみよう!
といいつつ書くことは何もなかったりします。ごめんなさい。MySQLをインストールするだけで、修正の必要はありませんでした。(^^;ちなみに私の環境は、Windows98SE、PWS4、PHP4.3.1、MySQL4.0.13 です。
ISAPIカウンターを使おう
今回はISAPIカウンターに挑戦です。といっても、優秀なフリーソフトを利用するだけなのですが・・・。ISAPIなのでディスクアクセスが無く(PWSのプロセス内で処理されるので)非常に高速に動作します。利用するのは、BabaCenterfoldsさんのBWEBCTR DLL です。
http://www.hi-ho.ne.jp/babaq/ からダウンロードできます。
- 解凍すると3ファイルあります。
- Bwebctr.ini を開き、とりあえずパスワードだけ変更して保存します。
- Bwebctr.dll を C:\Inetpub\wwwroot\cgi-bin に移動します。
- Bcount.dll と Bwebctr.ini を System フォルダに移動します。
- http://マシン名/cgi-bin/BWebCTR.dll?command にアクセスするとBWebCTR 2.31 for IIS Service Manager が開きます。ここでカウンタの設定を行えます。
設置するHTMLファイルには以下のように記述します。ちょっとオカしな表記なので注意してください。dfはカウンタ名、ddは画像のパターンです。8種類あります。
<IMG SRC="/cgi-bin/BWebCTR.dll?counter?p=df=sample,dd=a">
時刻表示などもできるので、 BWebCTR 2.31 for IIS Service Manager を参考にしてください。
通常時はカウンタをメモリに書き込み一定時間毎(デフォルト30分ごと)にファイルに書き込むようになっています。使ってみるとわかりますが、ディスクアクセスが無くとても高速です。(^^)
リモートスクリプティング
リモートスクリプティングをご存知でしょうか。多分、知らないか、知っていても使ったことのない人が殆どのはず(=マイナーな技術なのでございます。)。私自身は仕事で利用したことは1度しかありません。サーバプラットフォームか限られているので、利用価値が低いのかもしれません。http://www.microsoft.com/japan/msdn/scripting/default.asp
リモートスクリプティングとは何?
簡単に言ってしまうと、サーバーサイドスクリプトをクライアントサイドスクリプトから呼び出すことができるものです。
どういう時に使うのか
以下引用です。リモート スクリプティングは、次のようなタスクに使用します。
- ユーザーとデータエントリ フォームとの対話を維持したまま、サーバー上でデータの検索およびデータ妥当性検査を実行するようなタスク。
- ブラウザの画面を最新の状態に更新しなくても、サーバーの情報に基づいて Web ページの情報を更新するようなタスク。
たとえば
例えば、「メーカー」として100レコードのデータエントリがあったとします。各メーカーには、「商品」として100レコードのデータエントリがあったとします。コンボボックスで、メーカーを選択すると、そのメーカーの商品が、別のコンボボックスに反映されるというような場合、JavaScriptなどローカルサイドスクリプトでやろうとすると、100x100=10000レコードを一気に読み込んでおかなければなりません。使わないデータも読み込まなくてはならないため、非常に無駄な処理となります。1000x1000とかになったらお手上げです。
また、ASPなどサーバサイドスクリプトで実行しようとすると、一度メーカーが選択された時にサーバにアクセスし、データを絞り込んでから画面を再描画しなくてはなりません。
リモートスクリプティングを利用すると、このようなジレンマを避けることができます。実際には、メーカーが選択された時点で、商品コンボボックスの内容だけを変更することが可能になります。