AN HTTPD ゲストブック/コメント集(2000年2月7日11:55)


中田昭雄 nakata@st.rim.or.jp 2000/02/22 21:19

いとさん、浜田さん、
申し訳ないです。確かに 1.24 ではデフォルトが 0 秒になってしまいますね。
次の 1.26以降では、1.25/1.24 からのバージョンアップの場合に ISAPIタイムアウトが 0 であったら 20 に直すようにします。


いと gfh05223@nifty.com 2000/02/22 00:32

中田さん:
> ISAPIのタイムアウトのデフォルトは 20 秒のはずなのですが、0 秒 になっていましたか?

ちょっと調べてみました。v1.25では20秒ですが、v1.24ではなぜか0秒になります。
それ以前のプログラムはもう手元に残っていないので確認できませんが、デフォルトが
0秒の時からAN HTTPDを使い始めた人は最新版にバージョンアップしても0秒のままという
ことになるので、要注意でしょうね。


中田昭雄 nakata@st.rim.or.jp 2000/02/21 21:10

浜田さん、
ISAPIのタイムアウトのデフォルトは 20 秒のはずなのですが、0 秒 になっていましたか?

1.25b から 0 秒 は タイムアウトなし、になっています。ただし、これはこれで問題があるので、もう少し手を入れる予定ですが。

なお、浜田さんの場合は、.pl, .cgi は ISAPI を使わない(つまり perl.exe を使う)方がいいと思います。 PerlIS.dll は何かと制限がありますし、httpd.exe と同じプロセスとして動作するので内部の排他制御の仕組みも違いますから。


浜田 hamada@infonia.ne.jp 2000/02/21 16:02

中田さん、こんにちは。

apacheが動作したので、sleepを含んだスクリプトを動作させて
みましたら、デフォルトの設定で正常にスクリプトが動作しました。
httpd.confに次の記述がありますが、ANhttpのタイムアウトと関係
あるのかないのか分かりませんが、いずれも0秒よりも大きな値です。
ANhttpで試したところでは、最低でも10秒程度は必要な感じです。
(ループ3回,sleep(2)程度で)
そこで要望ですが、この辺を気がつかないユーザがsleepを含んだ
スクリプトを実行させたときに(特にファイルロック)分岐がうまく
行かない等の誤動作が発生するような気がしますので、デフォルトの状態で
0以外の値に(どのくらいが適当かは分かりません)設定しておいた方が
良いと思います。

# Timeout: The number of seconds before receives and sends time out.
Timeout 300

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
KeepAliveTimeout 15

では。


浜田 hamada@infonia.ne.jp 2000/02/21 13:26

富田さん、sleepの問題解決しました。
「ISAPIで実行」にしていたためでした。
実は色々なファイルロックを検証実験していたのですが、
スクリプトの動きと違う動作をするので、あれこれと
試しているうちにsleepとサーバとの相性らしいことを
突き止め投稿したものです。
本日朝から、Win98用のapacheをインストールして実験を
開始していましたが、apacheはFreeBSDの時と違い一寸
手こずっていました。
これでまたANhttpで実験が再開できます。
所でタイムアウトはどのくらいに設定するのが良いのでしょうかね?

では。


冨田 ytomi@hi-ho.ne.jp 2000/02/21 11:23

浜田さんの perl スクリプト(2000/02/20 23:36)ですが、
私の環境ではうまく動き、"12345678910" と表示されました。

ひょっとしてと思い、ISAPIで動作にして、ISAPIタイムアウトを "0" にしたら、
"12" としか表示されませんでした。
sleep 1 の間にタイムアウトしているのではないでしょうか?


浜田 hamada@infonia.ne.jp 2000/02/20 23:36

中田さん、こんばんは。
下記の件、ご助言いただければありがたいのですが。
例のファイルロックの件で相変わらず実験中なのですが、ActivePerl(522)と
ANhttp最新版との組み合わせで下記cgiをブラウザから実行すると
12としか表示されませんが、dos窓でこのcgiを実行すると正常に12345678910と
表示されます。
プロバイダのサーバ上でブラウザから実行しても正常です。
なにが問題なのでしょうか、この件で数日悩んでいます。
sleepを入れるとおかしくなります。

print "Content-type: text/plain\n\n";
$i = 0;
foreach(1..10){
  $i = $i+1;
  print $i;
  sleep 1;
}


中田昭雄 nakata@st.rim.or.jp 2000/02/15 21:52

ファイルロックについて復習するならcgi-mlの過去ログの#01438, #01445あたりを。
UNIXのNFSでの問題から考えると、Windowsでファイル共有した場合はどうなんだろうかという疑問も出てきますね。
もっとも上のスレッドは 1997年11月時点ですから、最近はまた状況が変わっているかもしれません。


ぴゅあ pure@GalaxyCorp.com 2000/02/14 23:13

>浜田さん
 お疲れ様です。
 確かWin95/98でしたよね。
 そこまで慎重に考えるなら素直にWinNTやLinuxでflock()を使って動かした方が手っ取り早い
と言いたいところですが実際にはそうは行かないですよね。
 cygwin版が正しく機能してくれることに期待したいところですが。

 しかしログが飛ぶということに関してはWin95/98だろうがWinNTだろうがLinux/UNIXにして
も必ず発生し得るということも解っている必要があります。

※何処かで「flock()は信用できない」と書いてあるのを見かけました(何処かは忘れました。
CGIスクリプトを配布しているサイトだと思います)がσ(^ー^)はflock()を信用するべきもの
と考えます(ソフトには必ずバグがある論は関係ないとして)。flock()が破錠(字を忘れた(;_;))
するとOSそのものが成り立たなくなるからです。

 一応ログが飛ぶときとしてプロセスが死ぬときがあります。これはどうしようもないと思いま
す。また皆さんは大抵ログが飛ぶときがあるものと想定して扱うようにしていると思います。
プロバイダでもその意味で各自でこまめにバックアップを取るように言っているところも多いと思
います。実際以前のプロバイダでは頻繁にプロセスが死んで飛ばされていました。
 また例えflock()を使っていたとしてもロックの仕方(コード)に問題があると思われる
スクリプトを配布CGIの中に多く見かけます。これは別の理由でログが飛ぶ原因となります。これに
付いてはσ(^ー^)なりの考え方を随分以前に書きましたが。

 この辺を考慮してコードを起こしていたりするので未だうちのサイトは動いていませんが。。。。(>_<)
 ライブラリ化してテスト段階には入っていますけど。。。。


中田昭雄 nakata@st.rim.or.jp 2000/02/14 21:38

浜田さん、
if-open のやり方のものでもそのままだと衝突することの実証は難しいはずです。
そういう意味では mkdir方式も、mkdir の中身を見ないと検証は難しいと思います。
cgi-ml での Mutex は望みありだと思いますけど。

いずれにしろ結論に期待しています。


浜田 hamada@caucus.yamaha.co.jp 2000/02/14 14:35

ぴゅあさん、中田さんこんにちは。
filelock問題で3連休過ごしました。

ぴゅあさんwrote
 》KENT WEBさんの配布スクリプト/FAQページでもファイルオープンによるロックに
 》付いて知ることができます。
 》処理的にはTerraさんの紹介されているものはその拡張という位置付けになるかと

KENT WEBさんのスクリプトは次の通りで、原始的操作(テスト&セットを一命令で行う)
になっていませんので完全なロックではないようで、同時に複数ののクライアントが
ファイルオープンに成功する危険性がある感じです。
(ifでファイルを探して、次の命令openでロックしているので)
中田さんご指摘の通り、Terraさんのスクリプトも同様な危険性があります。
玄人でもこのような過ちが多いですね。
それで素人の私は3連休をパーです。
sub lock2 {
local($flag) = 0;
foreach (1 .. 5) {
if (-e $lockfile) { sleep(1); }
else {
open(LOCK,">$lockfile") || &error;
close(LOCK);
$flag = 1;
last;
}
}
if (!$flag) { &error; }
}

中田さんwrote
 》Perl for Cygwin は、私は、http://www.student.uni-....から入手しました。
有り難うございます。
とても怖くて、それと考えてみると会社で使用しているperlと違うので皆様方が
安全性を確認後、使用させてもらいます。

 》衝突するとファイルが壊れるか、Windowsの場合はDOSプロセスが異常終了するようです。
 》まずは、何もロックせず、衝突させてみるとよいのではないでしょうか?
これも恐ろしい話ですね、サーバがロックして又再起動にならなければ良いのですが。

では、ファイルロックの結論(私が採用する)が出ましたら又投稿します。


中田昭雄 nakata@st.rim.or.jp 2000/02/13 08:06

浜田さん、
Perl for Cygwin は、私は、http://www.student.uni-koeln.de/cygwin/Distribution/Binary/?item=perl から入手しました。ただ、5.005_03 です。
CPANからたどれるようですし、gooなどの検索でも出てきました。
動作の確認はしましたが、ソースはまだ見ていませんしテストもこれからです。

衝突させるのはなかなか大変ですが、衝突するとファイルが壊れるか、Windowsの場合はDOSプロセスが異常終了するようです。まずは、何もロックせず、衝突させてみるとよいのではないでしょうか?


浜田 hamada@infonia.ne.jp 2000/02/12 21:43

浜田@自宅モードです。
DiscXさんwrote
>現在Win95でPerlは5.005_62 built for cygwinを使用していますがsymlink,flock
>共に「一応」使用できるようです。ただ、symlinkはダミーファイルができるし、
このPerlはどこで入手するのですか?

中田さんwrote
>mkdir を使う方法では、簡単には衝突した場合の検証ができないので、原理的な限界がある>のかどうか(私は)知りませんが。
cgiのMLの最初の頃symlinkを議論したことがあります。
サーバ管理者には迷惑をかけたくないのでmkdirの方法を昨日から自宅のパソコンで
実験中ですが、衝突した場合はクライアントにどんな反応があるのでしょうかね。
本日のcgiMLでWin32::Mutexとかを使う方法が投稿されていましたが、よくわかりません。

では。


中田昭雄 nakata@st.rim.or.jp 2000/02/11 07:53

DiscX さん、
それは朗報ですね。どうもありがとうございます。
私も確認してみます。


DiscX discx@lycos.ne.jp 2000/02/11 04:44

はじめまして。ローカルでのCGIテストにAN HTTPDを使用させていただいて
います。httpdとは直接関係はないのですが、symlink,flockが話題に上っ
ているようですので、少しだけ書かせていただきます

現在Win95でPerlは5.005_62 built for cygwinを使用していますがsymlink,flock
共に「一応」使用できるようです。ただ、symlinkはダミーファイルができるし、
シンボリックリンクでファイルを参照することもできるので問題ないと思いますが
flockの方はエラーが出ないだけで実際win95(98)上で有効なのかは?です。
サーバを公開している場合はsymlinkの方がいいかもしれません。

私のように、CGIのテスト目的ならUNIX用のPerlスクリプトをそのまま使用できるの
でおすすめです。

ところで、cygwin32版のjperlってあるのでしょうか?


中田昭雄 nakata@st.rim.or.jp 2000/02/10 20:26

浜田さん、
symlink, flock 以外の方法では、たしかにロックファイルを用いるのが常套手段ですが、その問題点も既に判明していると思います。

Terra さんの例では、(1)unless (-f $tmpfile) でファイルがなければ (2)open(TMP, ">$tmpfile") でロックファイルを作るわけで、(1)(2)の間に他のプロセスの(1)が入る可能性があるので完全ではないと思います。
このことは(1)(2)の間に sleep(10) を入れることで確認できます。
mkdir を使う方法では、簡単には衝突した場合の検証ができないので、原理的な限界があるのかどうか(私は)知りませんが。

もっとも実用上は「ほぼ完璧」と言ってもいいくらいであるとも言えるので、それで使うしかない、ということだと思います。

完璧なのは、やはり AN HTTPD の「単一スレッド」だと思っています。
複数ページ複数CGIであっても「単一スレッド」は有効です。過剰な保護ではありますが。
現在不具合が出ていないということは、すでにチェックされているのかもしれませんね。

それはともかく浜田さんは、CGI-ML の少なくとも2000-3000 番台には参加されていた浜田さんですよね? でしたら、Windows のロック関係はよくご存知のはずだと思うのですが。。。
管理者を助けてあげて、共同で管理するようにされたらいいと思います。


ぴゅあ pure@GalaxyCorp.com 2000/02/10 18:33

>浜田さん
 既に見つけられているようですので必要ないと思いますが。
 KENT WEBさんの配布スクリプト/FAQページでもファイルオープンによるロックに付いて知るこ
とができます。
 処理的にはTerraさんの紹介されているものはその拡張という位置付けになるかと思います。
 尤も簡単に試験はしていますがσ(^ー^)から見た性能の評価はまだ充分には行えていませんの
で念のため。


浜田 hamada@caucus.yamaha.co.jp 2000/02/10 10:54

中田さん、ファイルロックの件有り難うございます。
サーバの管理者は私ではなく、同一サーバ内で複数のホームページを作成していて
cgiも使用しているので、ご提案の内容は実現困難な状況です。
昨日より、あちこちのメーリングリストで質問をしているのですが、あまり反応が
ありませんが、一つだけ収穫があり、次のURLが使えそうですので試してみます。
http://www2q.biglobe.ne.jp/~terra/cgi/checktest.htm
尚、このページの「ローカルでcgi」はanhttpdのようです。
ホームページの制作者は「簡単CGIで作るインタラクティブWEBページ」の
著作者らしいです。
では。


中田昭雄 nakata@st.rim.or.jp 2000/02/09 21:36

浜田さんへ、symlink, flock の代替手段の続き
AN HTTPD では、「単一スレッド」というオプションがあります。
これをチェックしておくと CGIプロセス自体を排他制御する(一度にひとつのCGIしか実行しない)ので、動作は遅くなりますが確実(のはず)です。


中田昭雄 nakata@st.rim.or.jp 2000/02/07 21:06

浜田さん、
ファイルロックについては、WinNTにして flock を使うか、Win95/98なら ロック用ファイルまたはロック用ディレクトリで対応するということになります。

sendmail代替は、Windows用には、そうですね BLATJ などを使うということになります。Windows用perl.exeでもバッククォートは使えます。systemももちろん使えます。
http://www.kent-web.com/www/mail/index.html なども参考になると思います。


浜田 hamada@caucus.yamaha.co.jp 2000/02/07 15:58

先に投稿した質問のうちsendmailの件は中田さんの整理されたFAQでNT用のBlatJを
探し当て使用してみましたら、Win98でも動作しました。
但しperl cgiスクリプトの中でbatファイルを起動するコマンドが分からず
画像張り付けタグで起動していますが、バッククォートはWin98のperlでは
使えないのでしたっけ?(Unixを入れないとだめ?)
どなたかperlスクリプトの中からbatファイルを起動する方法をご存じありませんか。

以上


浜田 hamada@caucus.yamaha.co.jp 2000/02/07 11:55

さて、本日は直接はANhttpとは関係ない事項なのですが、このページには
識者が大勢いらっしゃるようなので、お聞きします。
今まで使用していたFreeBSD上のApacheからWin98上のANhttpに移って、
悩んでいる事項があります。
●その一つはファイルロック機構はどうなっているのかと言うことです。
 実は会社業務に使用しようとしているWeb上で所属のメンバーから提案を募集しようと
 しているのですが、多重投稿に対して元のファイルが消えることはないと思うのですが、
 同時に複数の人が投稿した場合は投稿漏れが発生しないかと言うことです。
 perl上で、flockとかsymlinkが使えればこの問題も解決するのですが、皆様どのように
 対応されていますか。
 カウンタは壊れても実害はないのですが、重要なファイルの場合は心配です。

●その二つ目はFreeBSDではsendmailが使えるためWeb上でQ&A等のページに投稿が
 あった場合は自分宛にメールを送りすぐにレスポンス出来たり、投稿フォームでの意見を
 メール化出来るのですが、Win98上でこれと同等のことは出来るのでしょうか。

以上、どなたか宜しくお願いします。