【激速】mod_perl SpeedyCGI FastCGI【激速】
■ このスレッドは過去ログ倉庫に格納されています
>>736 あ。ありがとうございます。 標準出力についてですが、そもそも標準出力ってオンメモリーみたいなものだと思ってたのですが、 俺の勘違いでしょうか? フルパスでどこを指定すればよいのでしょうか? >sudo -u apache /var/www/hoge.cgi >で動かしたいんだけど、permissionエラーになるの。 >当然って言えば当然なんだけど、mod_perlならパーミッション関係なく動くよね? mod_perlは独自にapache権限で実行権限があるか調べています。 >これはapacheが予めコンパイルしてるからだろうけど、そのコンパイル済みのperlとして呼び出したいんだけどなぁ。 >つまり、cronをはじめ、外部から呼び出す時にはmod_perlで動かす事は不可能って事でよいのかな? >url叩けばmod_perlとして動くのかな? mod_perlは初回プログラム実行時に実行状態のままapacheプロセスの中で待機します。 なのでcronやコンソールから呼び出すときには必ずapacheを通さなければいけません。 >それと他のspeedyとかでも挙動は同じなのかなって質問です。 speedycgiではお望みの動作をします。独自にプロセスを立ち上げるのでapacheには依存しません。 cronやコンソールからの実行でも高速に動作することが可能です。面倒なsocketの管理も勝手にやってくれます。 >普通"-"で標準出力を指すよね?mod_perlではこれを標準出力として認識しないようなんですが。 エラーの原因は標準出力部分ではないと推測します。 出力以前に $Image->Read('./hoge.jpg'); 等をしていませんか? mod_perl2から標準ではカレントディレクトリの位置がスクリプトを置いたディレクトリ にならないためno such〜エラーが発生していると思われます。 >>740 詳しい説明ありがとうございました。 なるほど。やはりmod_perlですとcronからはURLとして叩く(Apacheを通す)しかないのですね。 speedycgiは挙動が違うというのも非常に知りたい情報でした。ありがとうございます。 標準出力についてですが、 $image->Read('フルパス'); としています。その時点ではエラーは吐いておらず、 $image->Write('フルパス'); としてファイルに書き込む場合は同じく問題ないのですが、 $image->Write('jpeg:-'); と標準出力に出力しようとした場合にエラーとなります。 >>740 お詳しいようなのでもう一点質問して良いですか? mod_perlだとDBとの接続も維持したままになると思いますが、それはspeedyCGIでも同じでしょうか? なぜcronでmod_perlとして動かしたいかというと、そこにあるので。 > $image->Write('jpeg:-'); > と標準出力に出力しようとした場合にエラーとなります。 それはWrite時に初めてリード時のエラーを指摘されているだけだと思います。 $image->Read('フルパス') or die $!; とすればRead時にエラーが発生しているのが分かるかと思います。 >mod_perlだとDBとの接続も維持したままになると思いますが、それはspeedyCGIでも同じでしょうか? speedyCGIでもコネクションプーリングする事は可能です。 但しmod_perlのApache::DBIのようにトランスペアレントではありませんから 自分でDBハンドルを再利用するようにロジックを組む必要があります。 もしかするとspeedyCGIからでもApache::DBIが利用できるかもしれませんが試したことが無いので分かりません。 >>743 ありがとうございます。 ご指摘の通り、Readの時点でこけます。 フルパスで指定しているのに、なぜNo suchが出るのでしょうか? それとファイルに書き込む時は(or dieをつけなければ)そのままエラー無く処理が完了します。 試しに標準出力ではなくファイル書き込み時ではReadの時点でInappropriate ioctl for deviceというエラーになります。 なぜエラー内容が変わってくるのでしょうか? pwdの結果は/でしたのでフルパスの指定は間違いないと思うのですが。 ちなみに標準出力時に出るエラーとは以下のものです。 Exception 450: Output file write error --- out of disk space? `-' うそでした。 すいません。どちらの場合もReadの時点で以下のエラーが出ています。 Inappropriate ioctl for device DBとのコネクションプーリングの件は私には敷居が高そうなのでmod_perlでやってみようと思います。 実際試して状況を把握しました ・Readは如何なる場合でも真を返さない ・今回の件はmod_perl時に起こる問題 XSなimageMagickがレイヤー飛び越えて標準出力してるのでIOエラーが出ている模様 標準出力とメモリ展開を混同されているっぽいですがオンメモリでやりたいという事であれば $image->Write('jpeg:-'); を print $image->ImageToBlob; とすれば良いと思います。 なまじっかスキルがあると自分の解釈で勝手に理解してこういう当を得ない質問になるんだよなと 生暖かく見てたがそれは俺でした/(^o^)\ >>748 わざわざ試してまでもらって恐縮です。 ImageMagickは標準出力がmod_perlでは出来ないんですね。 ImageToBlobでやってみます。 長々と素人にお付き合いありがとうございました。m(__)m WindowsのInstantRails(Apache1.3.33)でFCGIを動かそうと RubyForApache-1.3.1.exe をダウンロードしてきて LoadModule fastcgi_module modules/mod_fastcgi.so するんですが、そんなモジュールは無いとapacheがMSGを出します。 その他mod_fastcgi-2.4.6-AP22.dll等も入れてみてるのですが、 そんなモジュールは無いといわれるのですが、そもそも LoadModule する前になにかする必要があるのでしょうか?apacheが古い? 教えてください。 AddModule はLoadModuleの後に設定するはずですから・・・。 mod_fast_cgiのインストールに関してググると、 apache2.2のためにはパッチをあてるってあるけど 2.4.6の今もパッチは必要なの? FastCGIは、apache1.3と組み合わせるのが 一番安定するという話をネットで目にしたのですが これは今でもそうですか? 一昔前ならともかく、1.3系はもう古いという印象があるんですが > 一昔前ならともかく、1.3系はもう古いという印象があるんですが あなたの基準で「古い」と何か問題? なぜ煽り気味? 目にしたブログの記事が少し古いものばかりなので 今の状況は少し変わってるのではないかと思ったのです 1.3.41のリリース日みた? 状況も解らずに「古い印象」とかなんとかヌかしてるから言われるんでしょ >>760 757 ではないが、お前が「古い」の意味を混同してるよ。 日本語が読めればわかると思うが、>>759 で書かれてるのは、 「FastCGIは、apache1.3と組み合わせるのが一番安定するという話」 が書かれた記事が 「少し古いものばかりなので今の状況は少し変わってるのではないかと」 ってことだろ。 Apache 1.3 系が古いか否かや、メンテナンスが続いているか否かとは別次元の話。 で、 > あなたの基準で「古い」と何か問題? を俺なりに勝手に考えると、 ・今時のディストリビューションには標準で付属していないことが多いので 1.3 の導入やメンテが面倒、できればやりたくない ・今はメンテが続いているけどいつかは終わるだろう、当然ながら 2.0 系より早い時期に ってとこじゃね? > ・今時のディストリビューションには標準で付属していないことが多いので 1.3 の導入やメンテが面倒、できればやりたくない debian stable 使えばいいと思うよ。今のところ全部そろってるよ。 >>762 Debian でも ・少なくとも静的なファイル配信は Apache2 の方が優れてるからできれば Apache2 に一本化したい ってのはあると思うよ。 > Debian でも > ・少なくとも静的なファイル配信は Apache2 の方が優れてるからできれば Apache2 に一本化したい > ってのはあると思うよ。 何おっしゃりたいのか、さっぱりいみわかんなーい。 持論はブログで展開してくれよ。 >>764 一応マジレスしておくと、 仮に「FastCGI を Apache 1.3 で動かすべき」という前提が今日も変わらないとした場合、 FastCGI を使う Web サイトを運営するには ・Apache 2.x で静的なファイルを配信しつつ、動的な部分だけ Apache 1.3 に橋渡しする ・静的なファイルも動的なコンテンツも Apache 1.3 で配信する の2択になるわけだ。 前者は明らかに面倒だわな。避けたい。 後者はまあ Apache 2.x だけで運営する場合と手間的には大差ないが 静的コンテンツの配信パフォーマンスはやや落ちる。 Apache 1.3 がいつまでメンテされ続けるかも不安がある。 しかしもし「FastCGI を Apache 1.3 で動かすべき」という前提がもう過去の話になっていて 現在は別に Apache 2.x でも全然信頼性変わらんよという状態なのであれば 静的なファイルも動的なコンテンツも Apache 2.x に一本化できるわけだ。 どちらの方向で行くかはこの「FastCGI を Apache 1.3 で動かすべき」という伝説が 現在も正しいかどうかにかかってるから、どうなの? というのが>>757 の質問でしょう。 1.3のほうがいいってのは何が根拠なの? まあ、2.x用のmod_fastcgiもmod_fcgiもしょーもないとは思うけど 一応俺の Debian 鯖の各種 Apache で ab -c 10 -n 100000 http://localhost/ した結果置いとく。 ■apache (1.3.34) Time taken for tests: 87.821402 seconds (略) Requests per second: 1138.67 [#/sec] (mean) Time per request: 8.782 [ms] (mean) Time per request: 0.878 [ms] (mean, across all concurrent requests) Transfer rate: 1279.89 [Kbytes/sec] received ■apache2 (2.2.3 mpm-prefork) Time taken for tests: 28.611753 seconds (略) Requests per second: 3495.07 [#/sec] (mean) Time per request: 2.861 [ms] (mean) Time per request: 0.286 [ms] (mean, across all concurrent requests) Transfer rate: 1744.21 [Kbytes/sec] received ■apache2 (2.2.3 mpm-worker) Time taken for tests: 32.149481 seconds (略) Requests per second: 3110.47 [#/sec] (mean) Time per request: 3.215 [ms] (mean) Time per request: 0.321 [ms] (mean, across all concurrent requests) Transfer rate: 1552.25 [Kbytes/sec] received localhost から空のコンテンツを取るベンチだから実利用環境ではこんな大きな差は出ないと思うが、参考まで。 1.3おせええええ パフォーマンスをとるか安定度をとるかってことか fastcgiって昔からあって、積極的な開発はされてないし、1.3の方が安定してるっていうのは何となくそういう感じはする。 開発時、プログラム書き換えるたびにapache再起動するのが激しく面倒くさいんだが なんとかならない? mod_perlの話?Apacheの設定を変えるのでも再起動しなきゃいけないんだから しょうがないでしょ fastcgiって、ろくにメンテナンスされてないだろ。 最終更新去年の4月だから メンテされてないってことはないんじゃね? 枯れてるだけじゃないの 〜 時間がありません!協力をお願いします!!広めてください。 〜 【緊急】 7・2(水) 毎日新聞本社前抗議活動 ___ / \ / \ , , /\ / (●) (●) \ 行動は起こさないと、何にも始まらない! | (__人__) | 数は圧力です! その場にいるだけでいい! \ ` ⌒ ´ ,/ . /⌒〜" ̄, ̄ ̄〆⌒,ニつ | ,___゙___、rヾイソ⊃ | `l ̄ 「毎日新聞本社前抗議活動」 でググってください!!! 「毎日新聞本社前抗議活動」 でググってください!!! http://jp.youtube.com/watch?v=XnVCDtGRhFU 【緊急】 7・2(水) 毎日新聞本社前抗議活動 〜 時間がありません!協力をお願いします!!広めてください。 〜 FastCGIってapache再起動しなくても .fcgiファイルをtouchしたら再読み込みされるらしいね! これ常識なん? そりゃApacheとはプロセスが別だからね。 mod_perlとか系に対するアドバンテージかもね >>777 そりゃ mod_fastcgi の設定次第だろ。 どんな設定したらできんの? そもそもtouchするなんていうハック的な方法じゃなくて 正式にapiを提供したらいいのにな・・・ > mod_perlとか系に対するアドバンテージかもね なるのかなー? fastcgi つかうと、FCGI::ProcManager アプリ側と front 両方いじらないと アプリを再起動できなくね。 メモリ共有せずにプロセスの数分メモリ使っていいなら別だけど。 mod_perlにもApache::Reloadあるし%INCからdeleteすれば 再読み込みしてくれるから更新を検知してリロードするロジックやプログラムを 自分で書くことも出来るよ。 > mod_perlにもApache::Reloadあるし つかったことある? >>784 自分は783ではないけれど、Apache::Reload使ったことある。 なんつーか、これ入れると(httpd.confで有効に設定)、全てのアクセスが激しく重くなる。 それも、mod_perl絡みだけでなくて、phpからstaticなhtmlからして全て。 (自前Benchで、有効時と無効時で、2倍近く差がでる。) なので自分は、開発時はApache::Reload有効にする時もあるけど、 実運用では有効にはしないなぁ。 Linux 2.6.22.5-49.fc6 Apache 2.2.3 SpeedyCGI 2.22 上記環境で mod_speedycgi2 を検証中です。 スクリプトの先頭に以下のように書いてます。 #!/usr/bin/speedy -- -t300 -r100 mod を経由して同スクリプトを実行すると、ps で確認した際のプロセス名が /usr/bin/speedy_backend /path/to/script のようになるのですが、 この場合に -t300 や -r100 は効いてないと思って良いのでしょうか? 効かせたい場合にはどうしたら良いのでしょうか? perldoc CGI::SpeedyCGI に書いてあった・・・orz 試してみます。 Apache If you are using the optional Apache module, SpeedyCGI options can be set in the httpd.conf file. The name of the apache directive will always be Speedy followed by the option name. For example to set the Timeout option, use the apache directive SpeedyTimeout. 度々ですみません。一応、完了報告まで。 SpeedyTimeout 300 SpeedyMaxRuns 100 Windowsで http://perl.apache.org/docs/2.0/user/handlers/filters.html#Output_Filters にあるサンプル #file:MyApache2/FilterReverse1.pm #---------------------------- package MyApache2::FilterReverse1; use strict; use warnings; use base qw(Apache2::Filter); use Apache2::Const -compile => qw(OK); use constant BUFF_LEN => 1024; sub handler : FilterRequestHandler { my $f = shift; while ($f->read(my $buffer, BUFF_LEN)) { for (split "\n", $buffer) { $f->print(scalar reverse $_); $f->print("\n"); } } return Apache2::Const::OK; } 1; を実行しようとすると Can't load 'C:/Perl/site/lib/auto/Apache2/Filter/Filter.dll' for module Apache2::Filter: 。。。。。 としかられるんだけどなぜ? windowsでSpeedyCGI使えないかなぁ。 CGI.pmとmod_perlの不具合みたいなのですが、uploadInfoが取得できません。 use CGI; my %FORM; my $cgi = new CGI; foreach my $key ( $cgi->param() ){ $FORM{$key} = $cgi->param($key); } my $info = $cgi->uploadInfo($FORM{file}); unless (ref $info eq 'HASH') { print "error";} これ試してみてください。$FORM{file}にはしっかりとファイル名が渡っているにも関わらず、undefが返ってきます。 ファイルのみをフォームにする場合には問題ないのですが、textareaなどもフォームに含めると取得できません。 該当コードより前の処理でmy $cgi = new CGI;をしている所はありませんか。 use CGI; use Data::Dumper; my $cgi = new CGI; my $fh = $cgi->upload('file'); print Dumper $fh, $cgi->tmpFileName($fh), $cgi->uploadInfo($fh); これを最小構成のコードで実行するとどのような出力が得られますか。 >>794 最小構成で再現しませんでした。 グローバル変数が使いたくてvars.pmを使っていたのですが、それが悪さをしていたようです。 局所変数を使うと問題ないようです。 レスありがとうございました。 FastCGIをWindows環境に導入したみたんですが、Internal Server Error が毎回発生してしまってうまくいきません。 error.logに「(OS 109)パイプは終了しました。」のメッセージが出るんですが FastCGIが通信出来ていないって事なんでしょうか? 何か解れば、教えて下さい。 エラー内容 Internal Server Error perlスクリプト test.fcgi #!c:/perl/bin/perl print "Content-type: text/html\n\n"; print "Hello world."; 環境 OS : WindowsXP Pro SP2 http : Apache/2.2.10 (Win32) FastCGI : mod_fastcgi-2.4.6-AP22.dll httpd.conf LoadModule rewrite_module modules/mod_rewrite.so LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll <IfModule mod_fastcgi.c> FastCGIConfig -initial-env PERL5LIB=C:/Perl/lib;C:/Perl/site/lib -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesses 3-maxProcesses 15 -startDelay 30 AddHandler fastcgi-script .fcgi </IfModule> >>797 の続き logs/error.log [Thu Nov dd hh:mm:ss yyyy] [warn] FastCGI: (dynamic) server "C:/cgi-bin/test.fcgi" started (pid 388) [Thu Nov dd hh:mm:ss yyyy] [warn] FastCGI: (dynamic) server "C:/cgi-bin/test.fcgi" (pid 388) terminated with exit with status '0' [Thu Nov dd hh:mm:ss yyyy] [warn] FastCGI: (dynamic) server "C:/cgi-bin/test.fcgi" restarted (pid 2516) [Thu Nov dd hh:mm:ss yyyy] [error] [client 127.0.0.1] (OS 109)パイプは終了しました。 : FastCGI: comm with server "C:/cgi-bin/test.fcgi" aborted:GetOverlappedResult() failed [Thu Nov dd hh:mm:ss yyyy] [error] [client 127.0.0.1] FastCGI: incompleteheaders (0 bytes) received from server "C:/cgi-bin/test.fcgi" [Thu Nov dd hh:mm:ss yyyy] [warn] FastCGI: (dynamic) server "C:/cgi-bin/test.fcgi" (pid 2516) terminated with exit with status '0' >>797 fastcgi の使い方がおかしい。 cpan でいろいろ探してみてみるといいよ。 今かりているレンタル鯖でmod_perl使えると知って、せっせと勉強始してたのはいいんだけど htaccessしか使えないレンタルユーザーが使えるのってやっぱCGIの高速化だけですよね? mod_perlのプログラミング、なんかしっくりくるから続けたいけど・・・ どうにかしたら使えるんじゃないかってまだ判断しかねてます。 実際どうなんでしょ? mod_perl は、その下にぶら下げておく perl の子が常駐することによって、 いろんな恩恵を受けれる。 ちなみにどこの鯖よ? >>801 鯖はJust-Sizeってとこ。mod_perlとmod_pythonがロードされてて 問い合わせたらサポ外だけど使っていいと言われた(宣伝はしてない) 実際htaccessの記述でCGIならmod_perlでの動作を確認できてるんだけど mod_perlスクリプトはユーザのディレクトリが@INCに入ってないから 当然自作モジュールは読み込めないです。 それであきらめかけてるんだけど・・変にテスト繰り返してメモリ食いなど迷惑かけたくないので こちらに書き込みました。 基本的に mod_perl って、httpd.conf 編集できて apache の再起動を 自由にできる人が使うものだと思うんだ。 で、Apache::Reload とかパフォーマンス落とすものを使わない限り、 再起動するまでは、ファイルをいくら新しくしても apache 側には反映されない。 500MB か 1GB しか積んでない共有鯖で mod_perl ってのは、ないと思う。 >>803 >httpd.conf 編集できて apache の再起動を自由にできる人が使うものだと ううっ、真理だと思います・・・ >500MB か 1GB しか積んでない共有鯖で mod_perl ってのは、ない これは一般に、CGIをmod_perlで動かす場合にも当てはまるでしょうか。 実はCGIをmod_perlで試したテストでは、サーバー側の設定かと思うのですが .htaccessでModPerl::Registryを指定していてもファイルの変更/モジュールの変更とも即反映されてます。 スクリプト中で@INCに追加したパスも毎回反映されるので、モジュールも再読み込みされるようです。(つまりCGIと勝手が同じ) 環境変数にはMOD_PERLがあり、1行目にperlのパスを指定しなくても動くのでmod_perlで動いてるのは確かだと思うんですが、 ひょっとして毎回新たにプロセスが開始されてるような、自分のスキルでは図りかねる状況なんです。 非サポートとはいえ鯖の動作にもかかわることだから、少しまとめてから問い合わせしてみようとは思ってるんですが、 経験則としてご意見うかがえたらうれしいですm(_ _)m すいません、今、思いついてCGIのプロセスIDを調べてみたら やっぱりブラウザのリロードごと、毎回IDが新しくなっていました。 >>804 の件、鯖の方に問い合わせてみます。 話がずれてしまったけど、非CGIのmod_perlスクリプトの方は レン鯖ではあきらめるふんぎりがつきました。ありがとうございました〜! すみません、教えてください。 RHEL4上で、Apache2+ModPerl2 の環境があります。 1つの仮想ホスト上に複数(現状4つ)のシステムを同居させてます。 つまり、DocumentRootには、4つのログインページがあり、ログインに成功するとそれぞれ サブディレクトリに移動します。 それぞれのシステムのセッション管理をCGI::Sessionにやらせています。 セッションIDは、それぞれのシステムでCookie名を変えて発行しています。 セッション情報を取得するために、 my $cgi = new CGI; CGI::Session->name('SYS1SESSID'); my $session = new CGI::Session("driver:hoge",$cgi,{Handle=>$dbh}); といった感じで使いまわしていたんですが、「ModPerl環境だと、CGI::Session::NAMEがモジュールローカル なので、new CGI::Session()で他のIDを使おうとしてしまうかもしれない」 という理解は正しいでしょうか? 結構頻繁にアクセスされているシステムです。 ログイン対象システムのセッションIDを正確に取るには、 my $cgi = new CGI; my $sid = $cgi->cookie('SYS1SESSID'); my $session = new CGI::Session("driver:hoge" ,$sid, {Handle=>$dbh}); の様に、使うべきセッションIDを指定しなければならない という理解で合っているでしょうか? CGI::Session は、現状、4.20 です。 ちょっと通りますが、 Windows XPで、Apahc2+mod_perl2で、下のエラーが出るときの対処方法って知ってますか? failed to resolve handler `MyHandler': Can't load 'C:/Perl/site/lib/auto/APR/Pool/Pool.dll' 〜 >>810 あるならエラー出ない気もするんだが。。。 今出してる情報だけだとあとはそのエラー出てるファイルまでの ディレクトリ(パス)が違うか、権限(実行権か読み取り権)が無いかだと思う。 Windowsだし単純にあぱっちとぱーるのインストールドライブが違うんじゃね? ドライブが同じでもあぱっちのほうのぱす検索部分修正してないとか 初期設定をきちんとできてない素人質問な気はする >>811 ぐぐってもそんな感じで解決してたな。 でもパスとかちゃんと合ってるんだよな。 >>813 ドライブ跨ってない? >>812 も言ってるがWinのドライブは越せないよ ドライブはCドライブ一個しかないからそこは大丈夫だな。 >>815 ※mod_perl2からはPerlSetEnv PERL5LIB じゃなくて PerlSwitches -Iに変わった これは試した? てか何を試したか書かないと一からこっちが聞いて回答して やった、大丈夫とかの返事になりムダが多い 情報の小出しはどこに行っても嫌われるぞ、エスパースレかどっかいけよ もう一度Apache2.2+mod_perl2か、バージョン確認かな。 Win32 Binary including OpenSSL 0.9.8i (MSI Installer): apache_2.2.11-win32-x86-openssl-0.9.8i.msi OpenSSL入りだと何か違うのかな?なしで一回入れなおしてみようかな。 普通の定義が広すぎて返答が難しい。 人それぞれだからね、「普通」なんて。 perl-status は使えないのかい? EnvironmentでPathチェックは出来ると思うが >>808 です。 問題解決しました。 perl 5.8.8をつかってたんだけど、perl 5.8.9にしたら直りました。 mod_perlの.pmファイルにperl -cでチェックかけてたら、なんか「perl58.dll になんとかていうエントリポイントなんてないよ」 っていうエラーがでたんで、調べたら perl 5.8.9から新しく追加されたエントリポイントなんだって。 mod_perlのオライリー本「Apache拡張ガイド」の上325P、 requiresメソッドは「カレントディレクトリとその親ディレクトリに存在するすべてのrequireディレクティブ…」を取り出すって書いてあるけど、間違いじゃないか? 継承はするけど追加じゃなくて上書きするから、すべてじゃないよね。 FastCGIについて質問です 環境:debian+lighttpd+fcgi(C) FCGI_printfで Cntent-Length: xxxxとかConnection: closeとか 付けてるつもりなんですけど、 実際にクライアントと通信させると送られてきません。 (勝手にチャンク転送になったりします) あとFCGIでプロキシみたいなものを作ろうとしていて while(1){ r_ret = recv(socket, buf, sizeof(buf), 0); FCGI_fwrite(buf, r_ret, 1, FCGI_stdout); } みたいなコードを書いてますがFCGI_fwriteで書き込んだ データ全てが送られないのですが、 (recv終了時点ではnバイトのデータを持ってても、 クライアントにnバイト送られなかったり) コードで指定してるとおりに動作させたいんですが lighttpd.conf等の設定が悪いんでしょうか? lighttpdかーそっちはわからんけど 例えばApacheの場合は、Content-LengthとかConnectionとか そういうのを取り扱うのはHTTPサーバーの役割だって考えだから、 CGIがそういうヘッダを付けてもApacheの都合で勝手にkeepaliveになったりチャンク転送になったりする Apacheだろうとlightyだろうと、そういう思想が正しいと思う。 CGIはコンテントの中身だけ出してればいい。 そんなHTTPの範囲まで口を出すな、と。 自分も前にApache+perlでCGI作った時とか そのときも勝手にチャンクになったりしてたのは確認してました。 CGI系共通の動作なんですかね。 (Content-Length教えたのに削除するってのは微妙ですけど) 2番目の方はBODY部が変わるって致命的な動作なんで なんかいい解決方法があればいいのですが HTTP1.1的にはチャンク転送はきちんとした転送方法で、 それは「BODYが変わった」とは言わないと思う。 チャンク転送がいやならHTTP1.0でリクエストすればいいのでは? すいません、2番目っていうのは >あとFCGIでプロキシみたいなものを作ろうとしていて >while(1){ >r_ret = recv(socket, buf, sizeof(buf), 0); >FCGI_fwrite(buf, r_ret, 1, FCGI_stdout); >} ってほうの話です チャンクとか抜きにしても明らかに不完全なデータしか 送られないって動作になるんです 追加情報ですが 1回あたりのFCGI_fwriteで書き込むサイズは256kBくらいです 自己解決しました FastCGI応答処理にて Content-LengthなどCGIで削除される情報を消してContent-Typeだけにしたら BODYの情報が書き換わるということはなくなりました apache1.3.41 + mod_speedycgiで動かしてるんですが、 通常のCGI(perlです)でSTDERRに向かって出力するとapacheがエラーログの方に それを出力してくれるんですが、mod_speedycgi環境下で動かすと全く出てきません。 CGIの方を「#/usr/bin/speedy」とするとちゃんと出る(ある意味当たり前)ので、 mod_speedycgiのstderrの扱いがおかしいのかと思ってソースみたけどわけわかめ。 どなたか解決方法ご存じでしたら教えてください。だいぶググったけど見つからない・・ 833です。 とりあえずmod_speedycgi2.cあたりから見よう見まねでパッチ書いたら うまくSTDERR -> エラーログに出るようになりました。 (長期間動かしたときどうなるかなどは未検証ですけど) 一番新しいSpeedyCGI(mod_speedycgi/Apache2.2.3)のやつインストールして SpeedyCGIで普通のやつ(hello worldとか)は動くのだけど http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod のサンプルコードが500errorで動かないのだけどヤバイかな…? 誰かご教示ください コマンドラインで動すとか、error_logを見るとかすれば原因わかるだろうに。 sub内のdo something hereのとこは適宜にシャットダウン時やクリーンアップ時に行う 処理を書いておくところだよ。詳しくはメソッドの解説を参照。 #!/usr/bin/speedy -- -r1 -t1 $sp->add_shutdown_handler(sub { `touch shutdown` }); $sp->register_cleanup(sub { print "b" }); とかにすれば一応動きがわかるんじゃないかな ./speedy.pl ls の繰り返しで。 これじゃだめか #!/usr/bin/speedy -- -r3 -t100 かね >>837 [root@localhost hogehoge]# ./speedy.pl Can't call method "add_shutdown_handler" on an undefined value at ./speedy.pl line 2. そもそもadd_shutdown_handlerが無い的な感じなのかしら。 >>838 同じように試してみたけども、だめでした。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる