【激速】mod_perl SpeedyCGI FastCGI【激速】 802 :
nobodyさん :2008/12/21(日) 16:16:34 ID:5iT7SRyD
>>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 ってのは、ないと思う。
804 :
802 :2008/12/21(日) 19:19:34 ID:???
>>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
805 :
802 :2008/12/21(日) 20:46:58 ID:???
すいません、今、思いついて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 です。
807 :
nobodyさん :2009/01/30(金) 17:46:30 ID:FjWtrZEq
代理age
808 :
nobodyさん :2009/01/31(土) 16:58:46 ID:8MtMaIxA
ちょっと通りますが、 Windows XPで、Apahc2+mod_perl2で、下のエラーが出るときの対処方法って知ってますか? failed to resolve handler `MyHandler': Can't load 'C:/Perl/site/lib/auto/APR/Pool/Pool.dll' 〜
dllがないんじゃねーの?
810 :
nobodyさん :2009/01/31(土) 18:57:57 ID:8MtMaIxA
いや、普通にあるんだけどね。
>>810 あるならエラー出ない気もするんだが。。。
今出してる情報だけだとあとはそのエラー出てるファイルまでの
ディレクトリ(パス)が違うか、権限(実行権か読み取り権)が無いかだと思う。
Windowsだし単純にあぱっちとぱーるのインストールドライブが違うんじゃね? ドライブが同じでもあぱっちのほうのぱす検索部分修正してないとか 初期設定をきちんとできてない素人質問な気はする
813 :
nobodyさん :2009/01/31(土) 19:32:31 ID:8MtMaIxA
>>811 ぐぐってもそんな感じで解決してたな。
でもパスとかちゃんと合ってるんだよな。
815 :
nobodyさん :2009/01/31(土) 19:39:02 ID:8MtMaIxA
ドライブはCドライブ一個しかないからそこは大丈夫だな。
>>815 ※mod_perl2からはPerlSetEnv PERL5LIB じゃなくて PerlSwitches -Iに変わった
これは試した?
てか何を試したか書かないと一からこっちが聞いて回答して
やった、大丈夫とかの返事になりムダが多い
情報の小出しはどこに行っても嫌われるぞ、エスパースレかどっかいけよ
もう一度Apache2.2+mod_perl2か、バージョン確認かな。
818 :
nobodyさん :2009/01/31(土) 19:58:11 ID:8MtMaIxA
Win32 Binary including OpenSSL 0.9.8i (MSI Installer): apache_2.2.11-win32-x86-openssl-0.9.8i.msi OpenSSL入りだと何か違うのかな?なしで一回入れなおしてみようかな。
無敵の再インストールという道もある
820 :
nobodyさん :2009/01/31(土) 20:00:18 ID:8MtMaIxA
ここって、普通ひっかからないとこだよね
普通の定義が広すぎて返答が難しい。 人それぞれだからね、「普通」なんて。
perl-status は使えないのかい? EnvironmentでPathチェックは出来ると思うが
823 :
808 :2009/02/01(日) 15:15:23 ID:XdqdLFq+
>>808 です。
問題解決しました。
perl 5.8.8をつかってたんだけど、perl 5.8.9にしたら直りました。
mod_perlの.pmファイルにperl -cでチェックかけてたら、なんか「perl58.dll になんとかていうエントリポイントなんてないよ」
っていうエラーがでたんで、調べたら perl 5.8.9から新しく追加されたエントリポイントなんだって。
825 :
_ :2009/04/01(水) 14:59:15 ID:???
826 :
nobodyさん :2009/07/16(木) 22:14:00 ID:Gas3E2EY
mod_perlのオライリー本「Apache拡張ガイド」の上325P、 requiresメソッドは「カレントディレクトリとその親ディレクトリに存在するすべてのrequireディレクティブ…」を取り出すって書いてあるけど、間違いじゃないか? 継承はするけど追加じゃなくて上書きするから、すべてじゃないよね。
827 :
nobodyさん :2009/07/25(土) 21:10:58 ID:0I94bAC0
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の情報が書き換わるということはなくなりました
833 :
nobodyさん :2009/10/12(月) 09:35:39 ID:Ndxd3B+x
apache1.3.41 + mod_speedycgiで動かしてるんですが、 通常のCGI(perlです)でSTDERRに向かって出力するとapacheがエラーログの方に それを出力してくれるんですが、mod_speedycgi環境下で動かすと全く出てきません。 CGIの方を「#/usr/bin/speedy」とするとちゃんと出る(ある意味当たり前)ので、 mod_speedycgiのstderrの扱いがおかしいのかと思ってソースみたけどわけわかめ。 どなたか解決方法ご存じでしたら教えてください。だいぶググったけど見つからない・・
plackつかえよおまえら
833です。 とりあえずmod_speedycgi2.cあたりから見よう見まねでパッチ書いたら うまくSTDERR -> エラーログに出るようになりました。 (長期間動かしたときどうなるかなどは未検証ですけど)
コマンドラインで動すとか、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 同じように試してみたけども、だめでした。
>>839 はuseし忘れてただけでした。
すみません。
[root@localhost hogehoge]# ./speedy.pl
syntax error at ./speedy.pl line 8, near "do something here "
syntax error at ./speedy.pl line 10, near "do something here "
Execution of ./speedy.pl aborted due to compilation errors.
speedy_backend[24310]: perl_parse error
speedy[24308]: Cannot spawn backend process
http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.podの # shutdownハンドラの登録
$sp->add_shutdown_handler(sub { do something here });
# クリーンアップ・ハンドラの登録
$sp->register_cleanup(sub { do something here });
ここが原因みたいです。
ごめんなさい、載せ忘れ。
ほんと連レスすみません。
>>837 の実行結果
[root@localhost hogehoge]# ./sp.pl
b
print "b" のとこは "cleanup" にでもしといたほうがよかったか スクリプトが終わる際に登録した処理が行われるだけだけど。 Speedyのバックエンドが終わる際には、cleanupも終わって標準入出力閉じた後に shutdownが行われる。そこはprintしても表示ができないのでわざと`touch shutdown` して ファイルを生成している。いつそのファイルが作られるかを見てほしい。 たぶんタイムアウト(t)が迫った場合や再利用回数(r)が迫った場合に作成されると思う。 -r6 くらいにするとたぶん5回目の実行の際に作られるかな。 多分これを使えばSpeedyで動いてた間に蓄積したデータとか吐かせたりとか 有用な使い方できるんだろうけど、絶対動くような信用性があるかはわからんので スクリプト内のグローバル変数で同じようなことを実現したほうが確実かも。 -r -t 自体結構信用ならないので、2chではshutdown_next_timeも活用してた気がする。
>>842 返信遅れてすみません。
rootで-r6 -t10でlsしながら実行したところタイムアウトが迫ったときに所有権がrootのshutdownファイルが
スクリプトと同じディレクトリに生成されるみたいです。
mod_perlとSpeedyCGIとFastCGIの違いを教えて下さい。
どれもググれない人には使えないので一緒
mod_perlで、Java Servlet2.4以前のHttpServletRequest#getRequestURL() と同じような結果を取得する方法を探しているのですが、何かよいモジュールは ありませんか?
Windows2000 Apache 2.2.22 mod_perl/2.0.4 activeperl 5.12.4 mod_perl でエラー発生したとき、CGI::Carp qw(fatalsToBrowser) が有効にならないのですが、 ブラウザでエラーとかを把握する方法ってあるのでしょうか?
848 :
nobodyさん :2012/04/14(土) 19:26:27.93 ID:d0KbMnsL
どうして2chだけFastCGIが不人気なんですか?
簡単にWindows環境で動くやつが ないよね?
このスレは激遅
851 :
nobodyさん :
2014/01/21(火) 18:35:02.53 ID:yT6VQ/mu CGI以外のインタフェースいちいち覚えるの面倒だから誰も使わないんだよ 中の人がmod_cgidso作ったことからもわかるでしょ?