Slide 1

Slide 1 text

Ϟμϯmod_perlೖ໳ (Modern mod_perl Guide) ඌܗ మ࣍ (OGATA Tetsuji) Twitter: @xtetsuji 2012/09/29 YAPC::Asia Tokyo 2012

Slide 2

Slide 2 text

Attention for audience • This slide is mainly written by Japanese, and few English. In the future, I will write and share this slide of English version, perhaps. • I speach by Japanese language. • If you do not known Japanese language, please fun and feel from some Perl code and few English description on this slide.

Slide 3

Slide 3 text

Self-introduction

Slide 4

Slide 4 text

ࣗݾ঺հ • ඌܗ మ࣍ (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • SlideShare: http://www.slideshare.net/xtetsuji • Α͘ߦ͘: Hokkaido.pm, Hachioji.pm • ಘҙٕ: mod_perl (ଞ͸Α͘஌Βͳ͍)

Slide 5

Slide 5 text

ॴଐ঺հ • גࣜձࣾfonfun(ϑΥϯϑΝϯ) http://www.fonfun.co.jp/ • ओྗ੡඼ɿϦϞʔτϝʔϧ http://rmail.jp/

Slide 6

Slide 6 text

Agenda

Slide 7

Slide 7 text

Agenda • About mod_perl basics • mod_perl handler basics • Refactoring mod_rewrite • mod_perl meets PHP • Apache worker MPM and Perl ithreads • compare mod_{lang} families • In future my activities

Slide 8

Slide 8 text

If time is left • Compare with others • Connection cycle: Let’s make SMTP Server by mod_perl • Other topics

Slide 9

Slide 9 text

In the fi rst

Slide 10

Slide 10 text

Respect for ... ϞμϯPerlೖ໳ (ᠳӭࣾ 2009; http://books.shoeisha.co.jp/book/b73388.html )

Slide 11

Slide 11 text

ࢀߟจݙ • ༸ॻʹͳΓ·͕͢ɺ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/)

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

About mod_perl basics

Slide 14

Slide 14 text

History of mod_perl • mod_perl1 fi rst public release: 1996/3/25 (see: http://perl.apache.org/dist/mod_perl-1.0-current/Changes) • mod_perl2 fi rst public release: 2002/4/6 (see: http://perl.apache.org/dist/mod_perl-2.0-current/Changes)

Slide 15

Slide 15 text

• mod_perl1 • mod_perl2 • ͜͏ॻ͘͜ͱͰɺ֦ுࢠ”.pl”ͷPerl CGI ͕ߴ଎Խ͢Δ (Registry→PerlRunͰ΋Մ) Perl CGI ͷߴ଎Խ AddHandler perl-script .pl PerlHandler Apache::Registry AddHandler perl-script .pl PerlResponseHandler \ ModPerl::RegistryPrefork # ↓Apache Con fi gurations

Slide 16

Slide 16 text

Perl CGIͷߴ଎Խ • CGI.pmɺCGI::Simple ౳͸಺෦Ͱ mod_perlߴ଎Խ؀ڥΛαϙʔτࡁΈ • ͱ͸͍͑Ӭଓ؀ڥͳͷͰɺάϩʔόϧ ม਺ͷѻ͍౳஫ҙ͕ඞཁ →ϞμϯPerlͳίʔυΛॻ͜͏

Slide 17

Slide 17 text

mod_perlͬͯԿʁ • Perl CGIͷߴ଎Խʁˠ෭࣍తͳޮՌ • ຊ౰͸ʮApache͕ϞδϡʔϧͰఏڙ͢ ΔػೳΛCݴޠΛ࢖ΘͣPerlͰॻ͚Δ Α͏ʹͨ͠΋ͷʯ͕mod_perl • Cݴޠ͕ಡΈॻ͖Ͱ͖ͳ͍Զ׻ت

Slide 18

Slide 18 text

About mod_perl basics • Perl CGIͷߴ଎Խʹ͍ͭͯ͸͍ͩͿׂѪ ͍͖ͤͯͨ͞·͕͢ɺੈؒʹग़ճͬͯ ͍Δؒҧͬͨ஌ࣝͷੋਖ਼͚ͩ͸Ͳ͔͜ Ͱ͍ͨ͠ • ޙ͸Apacheͷmod_perl֦ுϋϯυϥΛ ಡΈॻָ͖ͯ͠͠Έ·͠ΐ͏

Slide 19

Slide 19 text

mod_perl handler basics

Slide 20

Slide 20 text

mod_perl essence is extension of Apache • mod_perl ͷ Perl CGIߴ଎Խ؀ڥͰ͸ɺ HTTPϦΫΤετΛड͚ͯϨεϙϯεΛ ฦ͢͜ͱ͕ग़དྷΔͷ͸प஌ͷ௨Γ • mod_perl͸HTTPϨεϙϯεΛฦ͚ͩ͢ Ͱͳ͘ɺͦͷલॲཧ΍ޙॲཧ΋Ͱ͖Δ

Slide 21

Slide 21 text

Apache internal • MPM͸ଟ͘࢖ΘΕ͍ͯΔpreforkΛ૝ఆ • ਌ϓϩηεΛىಈ͢Δͱɺઃఆʹैͬ ͯࢠϓϩηεΛઃఆͷ਺͚ͩىಈ (prefork) • ֤ࢠϓϩηε͸HTTPϦΫΤετΛ଴ͭ • Ͱ͸ࢠϓϩηε͝ͱͷHTTPॲཧ͸...

Slide 22

Slide 22 text

Apache internal • ϦΫΤετΛड͚Δ • ϔομΛղੳ͢Δ • ඞཁʹԠͯ͡URLΛม׵ͨ͠ΓɺDocumentRootΛख͕͔Γʹ࣮ύε ΛׂΓग़͢ • ΞΫηε੍ޚɺೝূɺঝೝ(BASICೝূͳͲ) • MIMEλΠϓΛߟ͑Δ • ϨεϙϯεΛग़͢(੩తϑΝΠϧɺϓϩάϥϜग़ྗ) • ϩά(ΞΫηεϩάɺΤϥʔϩά)Λग़ྗ͢Δ • ࣍ͷϦΫΤετΛ଴ͭ

Slide 23

Slide 23 text

Apache internal • ֤ॲཧΛߦ͍ͬͯΔ෦෼ʹ͸ϑοΫ͕ ͋ͬͯɺ͜͜ʹ֤छॲཧΛڬΉ͜ͱ͕ Մೳ → Apache Moduleʢmod_xxxxxx) •Apache Module ͰͰ͖Δ͜ͱΛ Perl ͰͰ͖ΔΑ͏ʹͨ͠΋ͷ → mod_perl

Slide 24

Slide 24 text

Apache/mod_perl process phase • ֤ϑοΫ͕͋Δ෦෼: ʮ(ॲཧ)ϑΣʔζʯ • ϦΫΤετ଴ͪঢ়ଶ͔Β֤ϑΣʔζΛ Ұ८͢ΔͷͰɺશମΛ ʮϦΫΤεταΠΫϧʯͱݺͼ·͢

Slide 25

Slide 25 text

Phase of 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/con fi g.html#toc_Perl_Handlers

Slide 26

Slide 26 text

Phase of mod_perl1 ※ʮPractical mod_perlʯΑΓൈਮ

Slide 27

Slide 27 text

Phase of 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/con fi g/con fi g.html

Slide 28

Slide 28 text

Phase of mod_perl2 ※ʮPractical mod_perlʯΑΓൈਮ

Slide 29

Slide 29 text

fi rst mod_perl1 handler package MyApache::Hello; use strict; use warnings; use Apache::Constants qw(OK); sub handler { my $r = shift; # "Apache" object $r->send_http_header('text/plain'); $r->print("Hello! mod_perl1.\n"); return OK; } 1;

Slide 30

Slide 30 text

fi rst mod_perl2 handler package MyApache2::Hello; use strict; use warnings; use Apache2::RequestRec (); # for $r->content_type() use Apache2::RequestIO (); # for $r->print() use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; # "Apache2::RequestRec" object $r->content_type('text/plain'); $r->print("Hello! mod_perl2.\n"); return Apache2::Const::OK; } 1;

Slide 31

Slide 31 text

Apache{1,2} con fi gs # Apache1 SetHandler perl-script PerlHandler MyApache1::Hello # Apache2 SetHandler modperl PerlResponseHandler MyApache2::Hello

Slide 32

Slide 32 text

fi rst mod_perl handler • શͯ͸ sub handler ͱ $r ͷड͚औΓ͔Β • ͜Ε͸ͲͷॲཧϑΣʔζͰ΋ಉ༷ • mod_perl2 Ͱ͸ $r ͷϝιου܈͕֤छ ผύοέʔδͰ؅ཧ͞Ε͍ͯΔͨΊɺ ϝιουʹΑͬͯࣄલʹద੾ͳ Apache2::* Λ use ͓ͯ͘͠ඞཁ͕͋Δ

Slide 33

Slide 33 text

fi rst mod_perl handler • PerlHandler / PerlResponseHandler ʹϋϯ υϥΛηοτ͓͚ͯ͠͹ɺશͯͷϑΝ ΠϧͷॲཧΛϑοΫͰ͖ΔͷͰɺ*.html ϑΝΠϧ౳Λ͔͋ͨ΋ಁաతʹॲཧ͢ Δ͜ͱ͕Ͱ͖Δ → ֆจࣈॲཧͳͲ

Slide 34

Slide 34 text

Refactoring mod_rewrite

Slide 35

Slide 35 text

About mod_rewrite • URLΛॻ͖׵͑ΔApacheϞδϡʔϧ • ʮApacheͷεΠε੡ΞʔϛʔφΠϑʯ • ؆୯ͳίʔυͰURLॻ͖׵͕͑Մೳͩ ͚ΕͲɺ਺ेߦ΋ॻ͚͹ຐ۸ͷ׬੒ • ࠇຐज़ͱݺ͹ΕΔཧ༝

Slide 36

Slide 36 text

Refactoring mod_rewrite • mod_perl Ͱ͸ PerlTransHandler ͱ͍͏ URL Λॻ͖׵͑ΔϑΣʔζΛ༻ҙͯ͠ ͍Δ • ͜͜ʹ URL ม׵ॲཧΛڬΊΔ

Slide 37

Slide 37 text

Apache1 URI Trans package MyApache1::Trans; use strict; use warnings; use Apache::Constants qw(DECLINED); sub handler { my $r = shift; my $uri = $r->uri(); # e.g. "/path/to/foo.html" ### ... modify $uri ... $r->uri($uri); return DECLINED; # I tell a lie that I do nothing. } 1;

Slide 38

Slide 38 text

Apache2 URI Trans package MyApache2::Trans; use strict; use warnings; use Apache2::RequestRec (); # for $r->uri() use Apache2::Const -compile => qw(DECLINED); sub handler { my $r = shift; my $uri = $r->uri(); # e.g. "/path/to/foo.html" ### ... modify $uri ... $r->uri($uri); # set $uri return Apache2::Const::DECLINED; # I tell a lie that I do nothing. } 1;

Slide 39

Slide 39 text

Apache{1,2} con fi gs # Apache1 # e.g. In Directive PerlTransHandler MyApache1::Trans # Apache2 # e.g. In Directive PerlTransHandler MyApache2::Trans

Slide 40

Slide 40 text

mod_perl URI Trans pros than mod_rewrite • mod_rewriteʹൺ΂ͯՄಡੑ͕ߴ͘ͳΔ • DBΛҾ͍ͨΓmemcachedʹΞΫηε͠ ͨΓPerlͰग़དྷΔ͜ͱ͸ԿͰ΋Ͱ͖Δ

Slide 41

Slide 41 text

mod_perl URI Trans cons than mod_rewrite • ෳ਺ͷϑΝΠϧ؅ཧ͕ඞཁͱͳΔ(*.pm) • Perl/mod_perl͕෼͔Βͳ͍୲౰ऀ΁ͷ Ҿ͖ܧ͕͗೉͘͠ͳΔ • Directory Context(, .htaccess) ʹॻ͔Εͨmod_rewriteઃఆͷ৔߹͸ɺ ผ్έΞ͕ඞཁͳέʔε΋͋Δ

Slide 42

Slide 42 text

mod_perl meets PHP

Slide 43

Slide 43 text

PHP pathetic story of Perl Monger • ୭͔͕ൃ஫ͨ͠ΞϓϦ͕PHP੡Ͱɺطʹ উखʹೲ඼ͪ͠Ό͍ͬͯΔ • ֖Λ։͚Δͱ࣮૷ͱ͔͕ςΩτ΢ա͗ • ܖ໿΍ॾʑͷཧ༝ͰखΛೖΕΒΕͳ͍ • ӡ༻୲౰ͰPerl͔͠஌Βͳ͍Զ͕PHPͷ σόοάͱ͔…

Slide 44

Slide 44 text

mod_perl meets PHP • PHP͕࣮ߦ͞ΕΔલޙʹmod_perlͰԿ͔ ϑοΫΛࠩ͠ࠐΊͳ͍͔ • PHPॲཧલʹೝূɾڐՄॲཧ • PHPॲཧޙʹग़ྗΛϑΟϧλ…౳ʑ

Slide 45

Slide 45 text

Review request phase

Slide 46

Slide 46 text

Access/Authen/Authz and PHP • session_*()ͷ࢖͍ํ౳͕μϝͳέʔεͰ ͸ɺPHPதͷͦΕΒͷίʔυΛআڈͯ͠ mod_perlͷAccess/Authen/AuthzϑΣʔζ Ͱରॲ͢Δέʔε΋ߟ͑ΒΕΔ • CookieɺX-UP-Subno౳ͷRequest Header ͸શͯಡΊΔ → ೝূΛݞ୅ΘΓͰ͖Δ

Slide 47

Slide 47 text

package MyApache2::Auth; use strict; use warnings; # $r->headers_in() and $r->headers_out() returns APR::Table use APR::Table (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK REDIRECT); sub handler { my $r = shift; my $cookie = $r->headers_in->get('Cookie'); # raw cookie my $x_up_subno = $r->headers_in->get('X-UP-Subno'); my ($is_success, $location, $set_cookie); ### ### ... modify and analyze this session information ... ### if ( $is_success ) { $r->headers_out->set('Set-Cookie' => $set_cookie); return Apache2::Const::OK; } else { $r->headers_out->set(Location => $location); $r->err_headers_out->set(Location => $location); return Apache2::Const::REDIRECT; } } 1; # e.g. In Directive PerlAccessHandler MyApache2::Auth

Slide 48

Slide 48 text

Request output fi lter and PHP • PHPͷग़ྗΛϑΟϧλ͢Δ • Apache2ͷωΠςΟϒϑΟϧλͳͷͰɺ PHPͷ ob_*() (output buffering) ౳ͷઃఆ ʹҰ੾Өڹ͞Εͳ͍ • Ԡ༻ྫ: ֆจࣈม׵ɺPHPͰॻ͖͖Εͳ ͍෦෼ΛޙͰஔ׵͢Δɺ౳ʑ

Slide 49

Slide 49 text

Requets output fi lter practice • Filter ͷ৔߹ sub handler { ... } ͸ $r (Request Object)Ͱ͸ͳ͘ɺ $f (Filter Object) ΛୈҰҾ਺ʹड͚औΔ • PerlOutputFilterHandler σΟϨΫςΟϒ • ࠓճ͸վߦΛআڈ͢Δ؆୯ͳαϯϓϧ Λ঺հ

Slide 50

Slide 50 text

package MyApache2::FilterObfuscate; use APR::Table (); use Apache2::Filter (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); my $READ_CHUNK_LENGTH = 2048; sub handler { my $f = shift; # $f is "Apache2::Filter" object ### If filter is chained, this filter is first? unless ($f->ctx) { $f->r->headers_out->unset('Content-Length'); $f->ctx(1); } while ($f->read(my $buffer, $READ_CHUNK_LENGTH)) { $buffer =~ s/[\r\n]//g; $f->print($buffer); } return Apache2::Const::OK; } 1; # e.g. In Directive PerlOutputFilterHandler MyApache2::FilterObfuscate

Slide 51

Slide 51 text

PHP and Perl are friend • Apacheͷ্ͰPHPͱPerl͸༑ୡʂ • ଞʹ΋֤छϑοΫΛ࢖ͬͯmod_perl͸ PHPΛॿ͚Δ͜ͱ͕Ͱ͖Δ • Մೳੑ͸ແݶେ

Slide 52

Slide 52 text

Apache worker MPM and Perl ithreads

Slide 53

Slide 53 text

Apache worker MPM and Perl ithreads • Apache worker MPM: εϨου(pthread) ͱϓϩηεͷϋΠϒϦοτಈ࡞ • Perl ithreds: ݏΘΕऀ • ಉ࣌ฒߦॲཧ͢ΔͳΒParallel::Prefork ౳΍AnyEventΛ࢖͏ͷ͕ࠓͷPerlྲّྀ

Slide 54

Slide 54 text

εϨουͷϝϦοτ • ֤ϦΫΤετϑΣʔζؒͰม਺ڞ༗͕ Մೳ (poor man’s memcached?) • Կ͔ਓͱ͸ҧ͏ࣄΛͯ͠ΔϫΫϫΫײ

Slide 55

Slide 55 text

εϨουͷσϝϦοτ • Perl ithreads͕҆ఆ͍ͯ͠ͳ͍ • ֤εϨουຖʹΠϯλʔϓϦλϓʔϧ Λ࡞੒͢Δઃܭ্ɺpreforkͱίετ͸ ͦΕ΄ͲมΘΒͳ͍ • εϨουηʔϑΛҙࣝ͢Δඞཁ͕͋Δ

Slide 56

Slide 56 text

Instruction worker MPM & mod_perl • worker MPM্Ͱͷmod_perlͷϊ΢ϋ΢ ͸ಛʹগͳ͍ͷͰϋϚΔͱةݥ • PerlͷεϨου͸ෆ҆ఆͰ͋ΔࣄΛ৺ಘ ্ͨͰɺෳࡶͳࣄ͸ͤͯ͞͸͍͚ͳ͍

Slide 57

Slide 57 text

Queue server by mod_perl2 thread • ࠓճ͸εϨουͷม਺ڞ༗Λར༻ͨ͠ mod_perl2ͷจࣈྻQueueαʔόΛ࣮ԋ • “POST /” ͰRequest BodyΛQueueingɺ • “GET /” ͰQueueΛPickup

Slide 58

Slide 58 text

Queue server by mod_perl2 thread (1) package My::Queue; use strict; use warnings; use threads; use threads::shared; my @queue :shared; sub push_queue { my $value = shift; return 0 if !defined $value; push @queue, $value; return 1; } sub shift_queue { return shift @queue } 1;

Slide 59

Slide 59 text

Queue server by mod_perl2 thread (2) package MyApache2::ThreadQueue; use strict; use warnings; use threads; use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(OK HTTP_METHOD_NOT_ALLOWED); use My::Queue; my $READ_CHUNK_LENGH = 2048; ### ### ... following sub handler { ... } ... ###

Slide 60

Slide 60 text

Queue server by mod_perl2 thread (3) ### continued sub handler { my $r = shift; if ( $r->method eq 'POST' ) { my $value; while ( $r->read(my $buf, $READ_CHUNK_LENGH) ) { $value .= $buf; } My::Queue::push_queue($value); $r->content_type('text/plain'); $r->print('Queued'); return Apache2::Const::OK; } elsif ( $r->method eq 'GET' ) { my $retval = My::Queue::shift_queue(); $r->content_type('text/plain'); $r->print($retval); return Apache2::Const::OK; } else { return Apache2::Const::HTTP_METHOD_NOT_ALLOWED; } } 1;

Slide 61

Slide 61 text

worker MPM and perl ithreads practice • ෳࡶͳࣄ͸ͤͯ͞͸͍͚ͳ͍ • ෳࡶͳࣄΛͤ͞Δ৔߹ʹ͸े෼ࢼݧΛ • େࣄͳ͜ͱͳͷͰ(ry • લग़ͷQueue server͸100KBఔ౓ͷจࣈ ྻͷೖग़ྗΛ10K/minͤͯ͞΋໰୊ແ͠

Slide 62

Slide 62 text

compare mod_{lang} families

Slide 63

Slide 63 text

mod_{lang} (1) • mod_perl: ࠷΋ྺ࢙͕ݹ͍΋ͷͷҰͭ • mod_ruby: ։ൃఀ଺ঢ়ଶˠmod_mruby • mod_python: ։ൃఀ଺ঢ়ଶ • mod_lua: Apache2.4͔ΒίΞϞδϡʔϧ • mod_mruby: 2012೥4݄ʹొ৔͠׆ൃ

Slide 64

Slide 64 text

mod_{lang} (2) • mod_wsgi: Python WSGI ࣮૷ • mod_php: ͍ΘΏΔPHP • ͪ͜Β͸ࠓ·ͰͷҙຯͰApacheΛ ʮ֦ுʯ͢Δ΋ͷͰ͸ͳ͍ • ଞʹ΋ͨ͘͞Μmod_{lang}͸͋ΔΒ͍͠

Slide 65

Slide 65 text

Benchmark http://blog.matsumoto-r.jp/?p=2669 ΑΓ

Slide 66

Slide 66 text

Benchmark http://blog.matsumoto-r.jp/?p=2669 ΑΓ

Slide 67

Slide 67 text

Benchmark • Perl CGIߴ଎Խ؀ڥ(PerlRun, Registry)ͷ ৔߹͸mtime(ϑΝΠϧͷ࠷ऴߋ৽೔࣌) Λ౎౓ݟΔͷͰɺstatγεςϜίʔϧͷ ίετ͕ແࢹͰ͖ͳ͍ • mod_perlωΠςΟϒϋϯυϥͰউෛʂ

Slide 68

Slide 68 text

Benchmark • ࣮ࡍɺmod_perlωΠςΟϒϋϯυϥͰ ಉ౳ͷϕϯνϚʔΫΛߦ͏ͱ About 7000 Response/secͱͷ͜ͱ (Thanks @matsumotory) • Yet another perl5 implement Ͱ mod_*perl Λ࡞Δͱྑ͍উෛ͕Ͱ͖Δ͔ͳ

Slide 69

Slide 69 text

In future my activities

Slide 70

Slide 70 text

In future my activities • mod_perlͷ໾ཱͭ৘ใ΍ίʔυΛެ։ ͍͖͍ͯͨ͠ • mod_perlͰࠔ͍ͬͯΔਓΛॿ͚͍ͨ

Slide 71

Slide 71 text

In future my activities • ࠓޙ΋mod_perlք۾Λ੝Γ্͍͛ͨ • TwitterΞΧ΢ϯτ࡞ͬͨ @mod_perl_info • ΢ΣϒαΠτ΋࡞੒த(ະ׬੒) http://modperl.info/ • ৄࡉɺׂѪͨ͠෦෼ͷଓ͖͸Ͳ͔͜Ͱ

Slide 72

Slide 72 text

Timeup?

Slide 73

Slide 73 text

Questions?

Slide 74

Slide 74 text

ˑService Slidesˑ

Slide 75

Slide 75 text

Compare with others

Slide 76

Slide 76 text

Compare with others • Pure CGI • FastCGI • PSGI/Plack, WAF

Slide 77

Slide 77 text

mod_perl and pure CGI • ύϑΥʔϚϯεΛཁٻ͠ͳ͚Ε͹ྑ͍ • ApacheҎ֎ͷ΢ΣϒαʔόͰ΋࢖͑Δ • Ϩϯλϧαʔό౳ɺmod_perl͢Β࢖͑ ͳ͍؀ڥ͸ະͩʹଟ͍

Slide 78

Slide 78 text

mod_perl and FastCGI • ͲͪΒ΋ಉ͡Ӭଓ؀ڥɺదࡐదॴ • Apache֦ுͳΒmod_perlɺCGIͷߴ଎Խ ͷΈͳΒFastCGI • mod_perlͷ৔߹Apacheϓϩηεࣗ਎͕ ංେԽ͍ͯ͘͜͠ͱΛݏ͏޲͖΋͋Δ

Slide 79

Slide 79 text

mod_perl and PSGI/Plack, WAF • Ϟμϯͳ΢ΣϒΞϓϦΛࠓ͔Βॻ͘ͷ Ͱ͋Ε͹PlackϕʔεͷWAFΛબ΅͏ • ApacheΛ֦ுͯ͠ଞͷݴޠͱͷ࿈ܞ΍ Apacheࣗମͷಈ࡞Λ֦ுͰ͖Δͷ͸ mod_perlͷ໘໨༂೗

Slide 80

Slide 80 text

Should you choice mod_perl? • Apacheͱ͍͏࿮ͷதͰ͸͋Δ΋ͷͷɺ mod_perlͷՄೳੑ͸ͱͯ΋޿͍ • ύϑΥʔϚϯεɺҠ২ੑɺ༷ʑͳཁૉ Λݕ౼ͯ͠ɺmod_perlΛ࢖͏͔ߟ͑Δ • طʹ͋ΔApache্ͷϨΨγʔίʔυΛ ϦϑΝΫλϦϯά͢ΔͳΒྑ͍બ୒

Slide 81

Slide 81 text

Connection cycle: Let’s make SMTP Server by mod_perl

Slide 82

Slide 82 text

Connection cycle • HTTPҎ֎ͷαʔόΛॻ͖͍ͨ • Apacheͱಉ༷ͷ҆ఆੑ͕ཉ͍͠ • Apache2/mod_perl2Ͱ͸ɺConnectionΛ HTTPҎ֎ͷࣗલͷ΋ͷʹॻ͖׵͑Δࣄ ͕Ͱ͖Δ (e.g. mod_ssl)

Slide 83

Slide 83 text

About Connection Cycle PerlPreConnectionHandler PerlProcessConnectionHandler ※ʮPractical mod_perlʯΑΓൈਮ

Slide 84

Slide 84 text

Why I want to write SMTP server by perl • DBҾ͖͍ͨ • ֆจࣈॲཧ͍ͨ͠ • ௨ৗͷMTA(Sendmail/qmail/Post fi x౳)ͷ pipeͰ͸εέʔϧͰ͖ͳ͍

Slide 85

Slide 85 text

Qpsmtpd • http://smtpd.develooper.com/ • ࣮ࡍʹࢲ(ձࣾ)΋mod_perl2 Connection cycleͰSMTPαʔόΛ࣮૷ͯ͠Έͨ΋ͷ ͷɺطʹPerlք۾ʹ͸Qpsmtpdͱ͍͏ MTA͕͋Δ

Slide 86

Slide 86 text

Qpsmtpd has some Engine=Transport • pipe (CGI like) • fork-server • prefork-server •Apache (Apache::Qpsmtpd) • async (Danga::Socket base)

Slide 87

Slide 87 text

Qpsmtpd’s Apache::Qpsmtpd • Apache2 / mod_perl2 ͷ Connection cycle ͷྑ͍Ԡ༻ྫ • ͜ΕΛݟΔͱApache2ΛEngineͱͯ͠ MTAΛ࡞Δํ๏͕ྑ͘෼͔Δ

Slide 88

Slide 88 text

Other topics

Slide 89

Slide 89 text

Test of mod_perl handler • ʮϞμϯPerlೖ໳ʯʹৄ͘͠ॻ͍ͯ͋Δ • Apache2::FakeRequestΛ࢖ِͬͯ෺ͷ$r Λ࡞ͬͯϋϯυϥΛςετͰ͖Δ • ॲཧ୯Ґͷςετ͸Test::More౳Ͱ • ৄ͘͠͸ׂѪɺ΋͘͠͸্ड़ͷॻ੶Λ

Slide 90

Slide 90 text

nginx: HttpPerlModule http://wiki.nginx.org/HttpPerlModule

Slide 91

Slide 91 text

nginx: HttpPerlModule • ߏจ΍ߟ͑ํ͕mod_perl1ͱࠅࣅ ˠmod_perlͷ஌ࣝΛྲྀ༻Մೳ • ͨͩ͠ΠϕϯτۦಈαʔόͳΒͰ͸ͷ ֤छ੍ݶ΋͋ΔͷͰ஫ҙ • ੈؒͰͷԠ༻ྫ΋গ͠ग़͖͍ͯͯΔ • Ҏલ͸EmbeddedPerlModuleͱ͍͏ ໊લͩͬͨ(1.0→1.2Ͱ໊শมߋʁ)

Slide 92

Slide 92 text

nginx: HttpPerlModule package hello; use nginx; sub handler { my $r = shift; $r->send_http_header("text/html"); return OK if $r->header_only; $r->print("hello!\n
"); $r->rflush; if (-f $r->filename or -d _) { $r->print($r->uri, " exists!\n"); } return OK; } 1; __END__ http://wiki.nginx.org/HttpPerlModule ΑΓ

Slide 93

Slide 93 text

nginx: HttpPerlModule • mod_perl2Ͱ͸ͳ͘mod_perl1ͷߏจͷ ӨڹΛڧ͘ड͚͍ͯΔ ($r->send_http_headers()౳ʹݟΒΕΔ) • nginxઃఆϑΝΠϧͷॻ͖ํʹ͍ͭͯ͸ ׂѪˠલड़ͷWikiʹৄࡉ͕͋Δ

Slide 94

Slide 94 text

ׂѪͨ͜͠ͱ • Perl CGIͷߴ଎Խ؀ڥͷৄࡉ • Apache2.4؀ڥͰͷmod_perl→ݱ࣌఺ (2012/09)Ͱਖ਼ࣜʹαϙʔτ͍ͯ͠ͳ͍ • Apache2.4 event MPM؀ڥͰͷ mod_perl→্هಉ༷

Slide 95

Slide 95 text

͜Ε͔ΒͷApache • Apache2.4Ͱmod_perl͕αϙʔτ͞Εͨ Βɺevent MPM্Ͱmod_perlಈ͔͍ͨ͠ • Apache͸͜Ε͔Β΋ਐԽ͍͖ͯ͠·͢ • mod_lua, mod_sed͕Apache2.4ͰίΞϞ δϡʔϧೖΓɺ͔͠͠Experimentalѻ͍

Slide 96

Slide 96 text

Questions?

Slide 97

Slide 97 text

͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠