• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜
 

mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜

on

  • 9,190 views

 

Statistics

Views

Total Views
9,190
Views on SlideShare
9,184
Embed Views
6

Actions

Likes
6
Downloads
0
Comments
0

5 Embeds 6

http://www.linkedin.com 2
http://b.hatena.ne.jp 1
https://si0.twimg.com 1
https://www.chatwork.com 1
https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • よろしくお願いします\n
  • \n
  • 今回の様なカンファレンスや勉強会に出た感想を発表するためにブログを作ってみました\n
  • \n
  • (ここでは大学から入社までのことを説明して、他の説明は後に回す)\nG15はOSS活動が活発な人が集まって、主にDebianJPのホスティングをサポートしている組織\nfonfunもサーバ資源を提供している繋がりがあります\n
  • \n
  • 社名変更から5年ほど経つが、ネットビレッジのほうが通りがよい場合もある(Debian関連)\nリモートメールの中身は、今も多くはレガシー\n第1世代はサーバ1台。Load Average3桁とか平気\n他案件でWAF+DBIC+TTやったことあるがその程度です\n
  • ・YAPC::Asia2010の地域pmのセッションは、行ったら満席で聴けなかったです\n
  • \n
  • \n
  • \n
  • Plackというよりmod_perlの挙動が複雑\n
  • これは半年前の話題\nYAPC::Asia2010で映画のようなハッカーになりたかった方\n引用の許可は得ていませんが…\n開発が活発なPlackだが、まだ「こなれていない」部分もあるのかもしれませんね\nみなさんがmod_perl2でそのバグを踏んでバッドノウハウを開拓していく可能性も\n
  • WAFを他のウェブサーバで動作させればよいという人もいるでしょうが、Apache+mod_perlで動作させるケースが多いのでは?\nApacheのシェアについて後ほど見ていきます\n
  • \n
  • IIS食って成長中\n2009年のくぼみとOtherがよく分からなかった(lighttpdではないみたい)\nnginxの伸びが面白いですね\n
  • IIS食って成長中\n2009年のくぼみとOtherがよく分からなかった(lighttpdではないみたい)\nnginxの伸びが面白いですね\n
  • mod_perlでPHPプログラムをいじらずとも認証を入れることすら可能\nPerl CGIのレガシーコンテンツを渡されて、それをmod_perlで動作させるマイグレーション能力があるだけでも良い場合があるのでは?\n
  • [後述]文法の違いというか、mod_perl1の巨大なクラス構造がmod_perl2で小さく分割された\nmod_perl1.99はApache2のベータ版の時に一瞬作られたmod_perl\nmod_perl1.99はmod_perl{1,2}の合いの子の不思議な文法で触るな危険\n昔これに当たって酷い目にあったことがあります\nCatalyst::EngineもPlackもmod_perl1.99には対応していないはず\n
  • 当然Apache1とApache2の歴史はそれより前\n2003年にはApache2/mod_perl2が出ていたけど、当時はまだこなれていなかったので、2003年のリモートメール第4世代はApache1.3/mod_perl1で作成しました\n
  • 書いたことがある方も多い、基本ですね\nスペースの都合で改行を \\ でエスケープしています。実際にこういう書き方もできます\n
  • ・今回のプレゼンいろいろ悩みました。聴講者のスキルなども。\n・小さい文字を見せ続けるのも気が引けるので、今回はコードは大胆に抜粋してお送りします\n・聴講者のスキルは今回高いですね…。前回 #4 の資料を見てもうちょっと初心者が来ると思っていた節があります\n・実はCGI.pmはmod_perl対応しています。興味がある方はソースコードを。\n
  • \n
  • \n
  • ・ざっくりいろいろ省略しています (VirutualHost以前、Hello1.pmにパス通すなど)\n・パスの通し方はPerlSwitches方法もありますが、@INC以下に配置してしまうのが個人的に好き\n
  • \n
  • \n
  • \n
  • 「明快になった」というところは後で分かるところです\n
  • \n
  • 先ほども、mod_perl2では$r->print()のためにApache2::RequestIOをuseしたりしていましたね\n
  • \n
  • \n
  • \n
  • ・workerすなわちスレッドというものもありますが、スレッドセーフなPerlプログラム(いや、Perlに限らず)は難しいので避けます\n
  • \n
  • \n
  • ・単に「フェーズ」とも言います\n
  • ・皆さんの興味のあるレスポンス処理をオレンジで塗っています\n・PerlHandler Apache::Registry とはコレ\n
  • ・処理フェーズを一巡したリクエストサイクルの図です\n・これはApache1の図なので、Perl*Handlerではなく役割名の英単語になっています\n・簡単に読み替えできます\n・各フェーズでエラーをreturnすると、そこでresponseをもげってloggingに行きます\n
  • ・PerlHandler → PerlResponseHandler\n・PerlResponseHandler ModPerl::Registry はこれです\n・PerlMapToStorageHandler は mod_perl1 の PerlTransHandler の仕事を分業するために出来た新しいフェーズ\n
  • ・フィルタについては割愛します\n
  • \n
  • \n
  • \n
  • \n
  • ・Perlなんでmod_rewriteに容易にできないこと、DBさえ引けます\n・DECLINEDというものもあります。後続の処理のため、実際は何もすることがなかったと「嘘を付く」常套句です\n
  • ・Perlなんでmod_rewriteに容易にできないこと、DBさえ引けます\n・DECLINEDというものもあります。後続の処理のため、実際は何もすることがなかったと「嘘を付く」常套句です\n
  • \n
  • ・非常に早いフェーズで処理を打ち切るというところに醍醐味がある\n・さらに return DONE; という定数を返してやるとrequest/responseを一切せず、HTTPの処理すらぶった斬るという荒業までできます(やりました)\n・弊社のケースでは、インフラ担当者の準備が整い次第iptablesで遮断しました\n
  • \n
  • ・DBアクセスだって出来ちゃう\n・Apache::DBIなど使えば永続的接続が保てる\n
  • ・Apacheではここに当たるフェーズでBASIC認証などをやってます\n
  • ・PerlFixupHandlerは、response直前でちょっと何かやりたい時にうってつけ\n
  • ・既に存在する巨大な静的サイトに動的なスパイスを加える\n・どう「かぶせる」か。そのかぶせ方。CGI/PHP/WAFではないmod_perlならではの軽量なやりかたと思ってもらえれば\n
  • ・絵文字変換は昔からPerlが得意ですよね\n
  • ・Keplerの由来は、雑誌「ニュートン」のサイトを作った(手を加えた)時に、プロジェクト汎用のクラスやモジュールを打ちたてようとして名づけた洒落\n・sub handler { my $r = shift; まで出さずすみません。プレゼン後にお見せすることは可能。CPANに上げたいくらい。PAUSEの登録のやりかた教えてください。\n・Encode::NVは社内2003年製絵文字モジュール。UCM書きました。Encode::JP::Mobileの先駆かも\n
  • ・先程の図の通り、PerlHandler / PerlResponseHandler 以前のフェーズでエラーになった場合も、PerlLogHandlerは実行されます\n
  • \n
  • ・ようやく本題\n
  • ・responseではないと思いますが $r->print() (Apache2::RequestIO) など response でもありますね\n
  • \n
  • ・ほかも興味深いですが、時間の都合上割愛\n・逆にmod_deflateはフィルタの応用例です\n・SSLへの対処法はpoundやLBが手前でほどくなど、他にも対処法はあるでしょう\n
  • ・今回はPerlProcessConnectionHandlerにフォーカスを当てます\n・これらをひっくるめてConnectionフェーズと言ったりすることもあります\n
  • ・PerlPreConnectionHandlerはApache処理の本当に冒頭。ここでIPブロックは効果大といった活用法\n・mod_perl自身が、このpre_connectionでフィルタを準備したりしていますし、Apacheはプロトコル非依存のSSL処理を行っています\n\n
  • ・現在ユーザ数は少ないですが、別の着信通知プログラムがPostfix pipeを使っていてスケールしづらい構成になっていたので、それを解決するための実験的意味合いもありました\n・\n
  • ・メルマガ配信業者ほど台数は多くないですが、ケータイ向けウェブメールを運営しているシステムならではの配置になっていますが割愛します\n
  • ・TCPのポート番号、外から最初のPostfix受けるところは25番ですが、Apache2 SMTPと、下のPostfixは別の番号でSMTPを待ち受けています\n・やっつけ図ですみません\n・postfix masterプロセスが2ついるわけではありません。1つのpostfixが別々に2つのポートで待ち受ける構成にしています\n
  • \n
  • ・実際の設定ファイルから抜粋しました\n・Apache::DBIでDBの永続的な接続だってできます。pipeでDBにアクセスしたらコスト大きすぎ!\n・(次に GMFilter.pm 抜粋1)\n
  • ・実際の設定ファイルから抜粋しました\n・Apache::DBIでDBの永続的な接続だってできます。pipeでDBにアクセスしたらコスト大きすぎ!\n
  • ・先ほども出てきたAPR=Apache Portable Runtime\n
  • ・実際の設定ファイルから抜粋しました\n・Apache::DBIでDBの永続的な接続だってできます。pipeでDBにアクセスしたらコスト大きすぎ!\n
  • ・先ほども出てきたAPR=Apache Portable Runtime\n
  • ・先ほども出てきたAPR=Apache Portable Runtime\n
  • \n
  • \n
  • ・当時のインフラ担当者に説得できなかった\n・今回のグループメール開発を通して、Postfix pipeで動作している着信通知プログラムをマイグレーションできれば、サーバ台数を半減できるくらいの試算をしている\n
  • ・POEは激しいトラフィックがやってくるとしばしば無言で死にます\n・今はAnyEventとか堅いですよね\n\n
  • ・Apache2 Connection で動くし。Experimentalだって古い資料には書かれていたけど\n・AnyEventベースのものは最新のにも無いようですが、作ると面白いかもしれませんね\n
  • ・先ほどの好印象の理由がこれです\n
  • \n
  • ・すごい結論ですね\n
  • ・最初のほうのネットクラフトのグラフを思い出してください\n・メールプロキシなどの機能もあるみたいですね\n
  • ・Apacheの mod_perl に対応するモジュールとして EmbeddedPerlModule が目立つところにあげられています\n
  • ・そこからサンプル\n・あれ?どこかでみたことが…\n
  • ・そこからサンプル\n・mod_perl1 っぽい!というかそのまま\n
  • ・ApacheのMPMのような仕組みはないから、nginxってworker=スレッド動作のみなのかな\n・FastCGIのほうがノウハウあります\n
  • ・時間の都合上、詳細にあまり触れられずすみません\n
  • ・最後のほう駆け足になってしまいましたが…\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • ・聴講者の皆さんに感謝!\n

mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜 mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜 Presentation Transcript

  • mod_perl Perl CGI fonfun (OGATA Tetsuji) Twitter: @xtetsuji 2011/7/16
  • (1/2)• (OGATA Tetsuji) Twitter: @xtetsuji• http://post.tetsuji.jp/ ( )• ( ) 18
  • (2/2)• ( …)•( ) Perl 30• JavaScript / Shell Script(bash) // Emacs Lisp• :
  • (1/2)• fonfun( ) http://www.fonfun.co.jp/ • http://rmail.jp/• g15 http://g15.jp/
  • (2/2)• fonfun( : ) • 1999 ( : ) • 2003 4 (Perl + Apache/ mod_perl + Oracle + Postfix) •
  • •• YAPC::Asia2010• (@onagatani)• Hokkaido.pm•
  • Agenda
  • Agenda• I. mod_perl• II. mod_perl Apache• III. Apache2&mod_perl2 HTTP• IV. - qpsmtpd & nginx...•
  • I. mod_perl
  • Apache+mod_perl?• ※1 WAF PSGI/Plack Apache ※1. WAF=Web Application Framework•• Plack+mod_perl2 ※ http://subtech.g.hatena.ne.jp/cho45/20101221/1292941055
  • Apache+mod_perl?• Apache+mod_perl+WAF mod_perl … • •
  • Apache+mod_perl?• Apache• Linux Apache mod_perl ( )
  • Apache+mod_perl?• Apache• Apache 2011 7 65.86% (2011 6 64.88%) (http://news.netcraft.com/ archives/2011/07/08/ july-2011-web-server- Market Share for Top Servers Across All Domains survey.html ) August 1995 - June 2011• Apache
  • Apache+mod_perl?• WAF• Apache Perl CGI(or PHP)• ...
  • mod_perl• Apache1.3 → mod_perl1• Apache2.x → mod_perl2• 1 2 mod_perl• mod_perl1.99( )• ※ Apache1 deprecated mod_perl1
  • mod_perl• mod_perl1 first public release: 1996/3/25 (http://perl.apache.org/dist/mod_perl-1.0-current/Changes )• mod_perl2 first public release: 2002/4/6 (http://perl.apache.org/dist/mod_perl-2.0-current/Changes )
  • Perl CGI # ↓Apache Configurations• mod_perl1 AddHandler perl-script .pl PerlHandler Apache::Registry• mod_perl2 AddHandler perl-script .pl PerlResponseHandler ModPerl::Registry• ”.pl” Perl CGI
  • hello.pl
  • mod_perl1 Hello1.pm•• ($r) handler• http://hello.example.jp/ Content-Type: text/plain
  • mod_perl1 Hello1.pm # apache1.3 configuration <VirtualHost A.B.C.D:80> ServerName hello.example.jp SetHandler perl-script PerlHandler Hello1 </VirtualHost>
  • mod_perl1 Hello1.pm
  • mod_perl2 Hello2.pm•• mod_perl1•
  • mod_perl2 Hello2.pm # apache2.x configuration <VirtualHost A.B.C.D:80> ServerName hello.example.jp SetHandler perl-script PerlResponseHandler Hello2 </VirtualHost>
  • mod_perl2 Hello2.pm• PerlHandler → PerlResponseHandler• Hello2.pm
  • mod_perl2 Hello2.pm
  • mod_perl2 Hello2.pm• mod_perl1 mod_perl Apache::• mod_perl2 mod_perl Apache2:: ModPerl:: APR:: mod_perl1 (Apache object ) Mix-in
  • Hello ...• CGI WAF HTTP• ...
  • II. mod_perl Apache
  • mod_perl Apache• HTTP• mod_perl HTTP
  • Apache• MPM Prefork• (prefork)• HTTP• HTTP ...
  • Apache••• URL DocumentRoot• (BASIC )• MIME• ( )• ( )•
  • Apache•• →Apache Module mod_xxxxxx)• Apache Module Perl mod_perl• mod_perl
  • Apache/mod_perl• : ( )•• Apache/mod_perl 1 2• Apache/mod_perl 2
  • :mod_perl1 PerlChildInitHandler PerlPostReadRequestHandler PerlInitHandler PerlTransHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlFixupHandler PerlHandler PerlLogHandler PerlCleanupHandler PerlChildExitHandler ※http://perl.apache.org/docs/1.0/guide/config.html#toc_Perl_Handlers
  • :mod_perl1 ※ Practical mod_perl
  • :mod_perl2 PerlChildInitHandler PerlPostReadRequestHandler PerlInitHandler PerlTransHandler PerlMapToStorageHandler PerlHeaderParserHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler PerlTypeHandler PerlFixupHandler PerlFixupHandler PerlResponseHandler PerlLogHandler PerlCleanupHandler PerlChildExitHandler※ http://perl.apache.org/docs/2.0/user/config/config.html
  • :mod_perl2 ※ Practical mod_perl
  • : mod_rewrite• mod_rewrite• URL• ( )
  • : mod_rewrite• mod_rewrite URL PerlTransHandler•( ) Perl• mod_rewrite PerlTransHandler C API ※ PerlFixupHandler
  • : mod_rewrite# required “RewriteURL.pm”<VirtualHost A.B.C.D:80> ServerName hello.example.jp PerlTransHandler RewriteURL</VirtualHost>
  • : mod_rewrite
  • : mod_rewrite•• sub handler { my $r = shift; ... }•
  • ••
  • • PerlPostReadRequestHandler DDoS ( ) • return DONE; # cut off!• PerlAccessHandler• LB iptables
  • • PerlTransHandler• mod_rewrite PerlTransHandler• URL (return REDIRECT; )
  • • Perl{Authen,Authz}Handler PHP Cookie Perl• Access,Authen,Authz 3 3A
  • • HTML• User-Agent *.html Content-Type text/html application/xhtml+xml• PerlTypeHandler PerlFixupHandler ( : $r->headers_in, $r->headers_out)
  • • HTML </body> (ry• PerlHandler / PerlResponseHandler• $r->print(thiswork(slurp($r->filename())));
  • • i HTML HTML SBM (ry• PerlHandler / PerlResponseHandler
  • Kepler/Apache/ConvertEmoji.pm
  • • HTTP / PerlHandler / PerlResponseHandler ...• PerlLogHandler $r HTTP• DB
  • • mod_perl HTTP
  • III. Apache2&mod_perl2 HTTP
  • Apache2&mod_perl2 HTTP• mod_perl HTTP Request/Response • $r : Apache (mod_perl1) • $r : Apache2::RequestRec (mod_perl2)• $r r request/response r
  • Apache2/mod_perl2• Apache2 HTTP • ServerLifeCycle • Protocol / Connection • Filter • Thread• mod_perl2 HTTP ※ http://perl.apache.org/docs/2.0/user/config/config.html
  • Apache2/mod_perl2Connection• Connection• (HTTP )Protocol• Connection HTTP• Apache2 : mod_ssl
  • Connection PerlPreConnectionHandler PerlProcessConnectionHandler ※ Practical mod_perl
  • Connection•2 HTTP• PerlPreConnectionHandler • Apache• PerlProcessConnectionHandler • SMTP
  • Apache2 SMTP•• Postfix pipe Perl I/O fork• DB
  • Apache2 SMTP• : 2 (load balancing) • SMTP• Apache2 SMTP Postfix ...
  • Apache2 SMTP• SMTP• Postfix• Apache2 SMTP 1 Postfix
  • mod_perl2PerlProcessConnectionHandler•• $r $c (Apache2::Connection)• sub handler { my $c = shift; ... }• Apache •
  • PerlProcessConnectionHandler SMTPListen 10025 gmfilterAcceptFilter gmfilter none<VirtualHost 127.0.0.1:10025> TransferLog /var/log/httpd/gmfilter.log ErrorLog /var/log/httpd/gmfilter_error.log PerlModule Encode::NV ARM::G4::Apache2::GMFilter Apache::DBI PerlProcessConnectionHandler ARM::G4::Apache2::GMFilter</VirtualHost>
  • PerlProcessConnectionHandler SMTP ARM/G4/Apache2/GMFilter.pm 1:
  • PerlProcessConnectionHandler SMTP• use• $c use Apache2::Connection• Socket I/O APR::Socket, APR::Brigade, APR::Bucket use
  • PerlProcessConnectionHandler SMTP ARM/G4/Apache2/GMFilter.pm 2:handler
  • PerlProcessConnectionHandler SMTP• Socket I/O• Prefork chdir() OK
  • PerlProcessConnectionHandler SMTP• Postfix pipe Perl DB• : URL: http://rmail.jp/feature/4_5.html•
  • IV.qpsmtpd & nginx...
  • • Apache2 Connection SMTP••• qpsmtpd Perl SMTP
  • qpsmtpd• http://smtpd.develooper.com/•
  • qpsmtpd• Perl daemon ( POE )• qpsmtpd Engine•
  • qpsmtpd• qpsmtpd Engine=Transport • pipe (CGI like) • fork-server • prefork-server • Apache (Apache::Qpsmtpd) • async (Danga::Socket base?)
  • qpsmtpd• Apache::Qpsmtpd•
  • qpsmtpd• Danga::Socket qpsmtpd• Postfix pipe qpsmtpd
  • qpsmtpd• Apache SMTP qpsmtpd(Apache::Qpsmtpd)•
  • nginx• http://nginx.org/•• stable• FastCGI
  • nginxEmbeddedPerlModule ※ http://wiki.nginx.org/EmbeddedPerlModule
  • nginxEmbeddedPerlModule ※ http://wiki.nginx.org/EmbeddedPerlModule
  • nginx EmbeddedPerlModule• mod_perl1• mod_perl1•
  • nginx EmbeddedPerlModule• worker(single threaded process) I/O• (mod_perl )
  • nginx EmbeddedPerlModule•• mod_perl1• C10K Apache(mod_perl)
  • • mod_perl ( )• mod_perl• Apache2/mod_perl2 Connection HTTP (Apache ) Perl(mod_perl)• mod_perl
  • • Filter • mod_perl1 Filter Apache::Filter, Apache::OutputChain • mod_perl2 Filter Perl{Input,Output}FilterHandler
  • • mod_perl 3 • Practical mod_perl (Orelly 2003; http://modperlbook.org/) • The mod_perl Developer’s Cookbook (Sams Publishing 2002; http://www.modperlcookbook.org/) • mod_perl2 User’s Guide (Onyx Neon 2007; http://modperl2book.org/)
  • • Apache C API(mod_*.c) • Apache ( ) (Oreilly 2000; C API mod_perl ) • The Apache Modules Book (Prentice Hall 2007; C API )
  • • WEB+DB PRESS Vol.33 (2006/6) Recent Perl World 2 mod_perl 2.0• Net::DNS DNS http://gihyo.jp/magazine/wdpress/archive/2006/vol33