FrontPage 新規 編集 検索 一覧 ヘルプ

PWS

PWS (Personal Web Server) メモの目次

はじめに

このページに記載されている情報は、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 というのも、軽めの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のページをご覧下さい。

いちいちレジストリエディタで編集するのが面倒という人は、.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のプログラムです。設置はすこぶる簡単。

 #!/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なのでカレントディレクトリの小細工はいりませんねぇ。

これで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/ からダウンロードできます。

設置する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

リモートスクリプティングとは何?

簡単に言ってしまうと、サーバーサイドスクリプトをクライアントサイドスクリプトから呼び出すことができるものです。

どういう時に使うのか

以下引用です。リモート スクリプティングは、次のようなタスクに使用します。

たとえば

例えば、「メーカー」として100レコードのデータエントリがあったとします。各メーカーには、「商品」として100レコードのデータエントリがあったとします。コンボボックスで、メーカーを選択すると、そのメーカーの商品が、別のコンボボックスに反映されるというような場合、JavaScriptなどローカルサイドスクリプトでやろうとすると、100x100=10000レコードを一気に読み込んでおかなければなりません。使わないデータも読み込まなくてはならないため、非常に無駄な処理となります。1000x1000とかになったらお手上げです。

また、ASPなどサーバサイドスクリプトで実行しようとすると、一度メーカーが選択された時にサーバにアクセスし、データを絞り込んでから画面を再描画しなくてはなりません。

リモートスクリプティングを利用すると、このようなジレンマを避けることができます。実際には、メーカーが選択された時点で、商品コンボボックスの内容だけを変更することが可能になります。

Yesterday Today Total