Writing Apache Modules with Perl and C By Lincoln Stein, Doug MacEachern
こちらで続けようと思います。 とりあえず、CentOS5、CentOS6の共生と cpanmでのImage::Magick の取り扱い、Imagerがいまいち美しい処理をしてくれないあたりが目下の目標です。
LoadModule log_config_module "/usr/libexec/apache2/mod_log_config.so" LoadModule env_module "/usr/libexec/apache2/mod_env.so" LoadModule perl_module "/usr/libexec/apache2/mod_perl.so" ServerName localhost:8080 Listen 0.0.0.0:8080 ServerRoot "/tmp/dumy" DocumentRoot "/tmp/dumy" PidFile /tmp/dumy/httpd.pid ErrorLog /tmp/dumy/error_log LogLevel debug TransferLog /tmp/dumy/access_log LockFile /tmp/dum
以下のperlのコードが動かない理由を教えて下さい。 FizzBuzzのコードなのですが、$iが11,26,41,56,71,86の時にBuzzと出力されてしまいます。 なんとなく直前のループ時の$outの内容が引き継がれている気がしますが、理由がわかりません。 --- #!/usr/bin/perl use strict; use warnings; use Perl6::Say; foreach my $i (1..100) { my $out = "Fizz" if $i%3 == 0; $out .= "Buzz" if $i%5 == 0; say $out || $i; } --- なお$outの宣言を別にしたところ、正常に動作しています。 --- foreach my $i (1..100) { my $out; $out = "Fizz" if $i%3 == 0; $ou
こちらで続けようと思います。 とりあえず、CentOS5、CentOS6の共生と cpanmでのImage::Magick の取り扱い、Imagerがいまいち美しい処理をしてくれないあたりが目下の目標です。
Not sure if this is what people are running into, but if you use variables, even lexicals scoped on the package level, in a subtype of HTML::Parser, they won't get reset if you call new() on your class unless you overload the default new() or otherwise reset them.For example (untested, but this is approximately what I recall doing on my own) package Foo::Parser; our @ISA=qw(HTML::Parser); my $foo;
mod_perlでどのくらいメモリー使われてるかとか調べたかったのでApache2::Statusを使ってみた。 Shibuya.pmのLTにも含めようと思ったけど5分に押し込めるのは無理なのでここで公開。 テスト対象としてCGI::Applicationで package HelloWorld; use strict; use warnings; use base 'CGI::Application'; sub setup { my $self = shift; $self->start_mode('index'); $self->run_modes( ['index']); } sub index { "HelloWorld"; } 1; runスクリプトとして #!/usr/bin/perl use strict; use warnings; use lib './lib'; use
前々回も書きましたが,worker MPM で mod_perl を使うと,インタプリタプールなるものが作成されます。このインタプリタプールというのはまさに Apache におけるプロセスプール(prefork MPM の場合)やスレッドプール(worker MPM の場合)の Perl インタプリタ版のようなものです。 このインタプリタプールでの PerlInterpMax(総数の最大)はデフォルトで 5 になっています。ですから,「prefork MPM から worker MPM にしたらメモリ消費量がガツンと減ったぜ!httpd の thread 数 150 でぶんまわしてるのに!スレッドマンセー!」とぬか喜びしていると,実は Perl は並列に 5 つしか走っていなかった,ということがありえます。 2007/09/27 追記。adiary 作者さんからトラバいただきました(⇒Pe
だらだらと3日にわたって書いてきましたが,明日から遅めのお盆休みになるのでまとめをメモ書きしておきます。 worker MPM での mod_perl は Perl の ithread を使っている httpd のスレッドプールとは独立して Perl インタプリタプールが存在する Perl インタプリタプールの最大インタプリタ数などは設定で変更可能 デフォルトで最大 5(少ない!) インタプリタプールはインタプリタのステート保持構造体のプールであり,インタプリタスレッドのプールではない(実行時アタッチ)←ちょっと推測 だから httpd のスレッドプールのスレッド数より多くも少なくも設定できる インタプリタ数が足りなくなったときは空きがでるまでブロックする Perl ithread では変数は TLS (スレッド間で独立したロケーション)に保持され,基本的にスレッドセーフ 他インタプリタス
daily dayflower などの情報をみて worker MPM な Apache を利用しても、同時に利用可能な Perlインタプリタ(mod_perlプロセス) は PerlInterpMax に制限されるように思っていました。デフォルトではこの値は 5 であり、一見少なく感じられます。 サーバDoS事件 ご存じのとおり本 blog.abk.nu サーバは、以前まで「データベースに接続できないエラー」を吐いてブログが表示されないことが多々発生していました*1。以前の設定値は次のとおりです。 mod_perl : PerlInterpMax 5 PostgreSQL : max_connections = 15 これでも、PostgreSQLへのコネクションが足りなくなりエラーとなっていました。PostgreSQLへのコネクションを保持するデーモンは adiary の他にありません
大量にアクセスがあってMaxClientを大きく設定したい場合、Apacheの1プロセスあたりのメモリを少なくするのが重要。当然アプリ側で大きなライブラリを読み込まずに画像の変換はGearmandにタスクとして投げたりとかの工夫するのも有効だが、fork元になるApacheの親プロセスと子プロセス間でできる限りCopy on Writeな共有メモリを増やすのも有効。 その辺の詳しい仕組み等の話はnaoyaさんがd:id:naoya:20080212:1202830671でしてるのでそこを参考に。linuxカーネルまわりの仕組みって楽しいよね。会社の案件ではFreeBSDサーバーも結構あるんだけどFreeBSDではどうなるのかは知らない。 で、社内にXenなテストサーバーがあるのでまっさらな環境で色々実験してみた。・・・過程を全部書こうとしたら長くなったので省略。地味にpsしたり/proc/
Apache::Test事始め 年末前後からApache::Testで真面目にテストを書き始めている。 ところが全くドキュメントがないんだね。いや、あるんだけど、携帯の機能を使いたいだけなのにあの厚いマニュアル読むの?みたいな感じで。まぁというわけでとにかくざくざくっとドキュメント読んでテスト書いてたらようやくなんとなく分かってきた。この間ある程度他人にも説明できたので自信ついたしw Apache::Testはmod_perlハンドラをテストするときに使う。ディストリビューション等でmod_perlをテストしようと思うとApache自体を立ち上げたりなんだりしなければいけなくて「一体どうテストすればいいんじゃ?!」となりがちだが、Apache::Testを使うと、テスト用httpd.confの生成テスト用のapacheの起動/停止mod_perlハンドラ上で動かしたTest::More等の
と思ったら知ってることはすべて(しかもそれ以上)mod_perl のドキュメント(⇒mod_perl: Input and Output Filters)に網羅されていました。orz。 Perl に疎くてもフィルタモジュールを書く人なら目を通しておいて損はないです。つかこのレベルのドキュメントが httpd のドキュメントにも欲しかった。 ちなみにさらりと読んで「mod_perl だとレスポンスコンテンツ等にストリーム指向アクセスできるんか」とぬか喜びしたら行ストリーミングをしてくれるわけではなくて,ちょっとがっかり。どういうことかというと,Stream oriented Output Filters のくだりにも書いてありますが,read() や handler の呼び出しが行の途中でぶったぎられている可能性があるということです。だから自分でバッファリングしなきゃいけない。 例題として
mod_perl や PersistentPerl (a.k.a. SpeedyCGI) など Perl インタプリタを永続化させる仕組みのものは*1,一度読み込まれたモジュールは,その後ファイルが変更されたとしても自動的に再読み込みしてくれたりはしません。mod_perl では Apache(2)::Reload というモジュールがあり,そのような場合でもうまくとりはからってくれます。 で,かつて PersistentPerl でも同じようなことができないかと思って苦闘したことがあるのですが(SpeedyCGI と module reload - daily dayflower),最近ふと CPAN を漁っていて Module::Refresh なるものがあることを発見しました。Jesse プロダクトです。 This module is a generalization of the f
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く