Slide 1

Slide 1 text

mod_perlԹނ஌৽ ʙPerl CGIͷߴ଎Խ͔Β ϝʔϧαʔό·Ͱʙ גࣜձࣾfonfun ඌܗ మ࣍ (OGATA Tetsuji) Twitter: @xtetsuji 2011/7/16

Slide 2

Slide 2 text

ࣗݾ঺հͳͲ

Slide 3

Slide 3 text

ࣗݾ঺հ(1/2) • ඌܗ మ࣍ (OGATA Tetsuji) Twitter: @xtetsuji • http://post.tetsuji.jp/ (࠷ۙϒϩά࢝Ί·ͨ͠) ͜͜ͰޠΓ͖Εͳ͍͜ͱ΋ॻ͖͍ͨͰ͢ • ๺ւಓͷԻߋொ(ଳ޿ࢢͷྡொ)ग़਎Ͱ͢ɻ ߴߍଔۀ·Ͱͷ18೥ؒΛ๺ւಓͰա͝͠· ͨ͠

Slide 4

Slide 4 text

ࣗݾ঺հ(2/2) • ਓੜॳεϐʔΧʔ (͓खॊΒ͔ʹ…) • (ϙετ)ϞμϯPerlʹ৐Ε͍ͯͳ͍30୅ • JavaScript / Shell Script(bash) // Emacs Lisp • झຯ: ΫϥγοΫԻָɺΧϑΣࢄࡦɺ ࿏ઢόε

Slide 5

Slide 5 text

ॴଐ঺հ(1/2) • גࣜձࣾfonfun(ϑΥϯϑΝϯ) http://www.fonfun.co.jp/ • ओྗ੡඼ɿϦϞʔτϝʔϧ http://rmail.jp/ • ೚ҙஂମg15ΞιγΤʔγϣϯ http://g15.jp/

Slide 6

Slide 6 text

ॴଐ঺հ(2/2) • גࣜձࣾfonfun(چ໊ࣾ:ωοτϏϨοδ) • 1999೥͔Β΢Σϒϝʔϧ (঎඼໊:ϦϞʔτϝʔϧ)Λӡ༻ • 2003೥ʹୈ4ੈ୅γεςϜ(Perl + Apache/ mod_perl + Oracle + Post fi x)Λ։ൃ • ࠷ۙ৽͍ٕ͠ज़తͳࢼΈʹνϟϨϯδத

Slide 7

Slide 7 text

ࠓճ͓࿩Λ͍ͤͯͨͩ͘͞ ͜ͱʹͳͬͨܦҢ • ஍ݩʹεΧΠΞʔΫγεςϜͱ͍͏ձ͕ࣾ͋Δ • YAPC::Asia2010ͰεϙϯαʔΛ͍ͯ͠ΔͷΛൃݟ • ڵຯ͕͋Δͱݴ͍ͬͯͨΒɺͱ͋Δਓ͕தͷਓ Ͱ͋ΔӬ୩͞Μ(@onagatani)Λ঺հͯ͘͠Εͨ • ͔͠΋ Hokkaido.pm ͷҒ͍ਓͩͬͨʂ • ͍·͜͜

Slide 8

Slide 8 text

Agenda

Slide 9

Slide 9 text

Agenda • I. mod_perlΛৼΓฦͬͯΈ·ͤΜ͔ʁ • II. mod_perlͷਅ਷͸Apacheͷ֦ு • III. Apache2&mod_perl2ͰHTTPͷ֎΁ • IV. ଵଦͱԠ༻ - qpsmtpd & nginx... • ·ͱΊ

Slide 10

Slide 10 text

I. mod_perlΛ ৼΓฦͬͯΈ·ͤΜ͔ʁ

Slide 11

Slide 11 text

͍·͞Β Apache+mod_perl? • ʲ࣭໰ʳWAFɺPSGI/PlackΛ࢖͑͹ɺ ApacheͳͲҙࣝ͠ͳ͍͍ͯ͘ͷͰ͸ʁ • ʲճ౴ʳ͔֬ʹͦ͏͔΋͠Ε·ͤΜɻ ͚ͩͲɺ஌ࣝͱͯ͠஌͓͍ͬͯͯ΋ଛ͸ ແ͍͸ͣͰ͢ • ྫ͑͹Plack+mod_perl2Ͱ΋ɺมͳόά Λ౿ΜͰ͠·͏͜ͱ΋͋ΔΑ͏Ͱ͢ ※ http://subtech.g.hatena.ne.jp/cho45/20101221/1292941055 ※1. WAF=Web Application Framework ※1

Slide 12

Slide 12 text

͍·͞Β Apache+mod_perl? • Apache+mod_perl+WAFͰ΋mod_perlͷ ಺ଆΛଟগ஌͓͚ͬͯ͹… • όάΛ౿Μͩ࣌ɺ໾ཱͭ • ύϑΥʔϚϯεվળͷώϯτ͕͋Δ

Slide 13

Slide 13 text

͍·͞Β Apache+mod_perl? • ࠓ΋Apache͸࠷΋࢖ΘΕ͍ͯΔαʔό • ͲͷLinuxσΟετϦϏϡʔγϣϯʹ΋ େ఍Apacheͱmod_perlͷύοέʔδ͸ ඪ४Ͱ༻ҙ͞Ε͍ͯΔ(͸ͣ)

Slide 14

Slide 14 text

͍·͞Β 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- survey.html ΑΓ) • ͍ͭͷੈ΋൒਺Ҏ্Apache Market Share for Top Servers Across All Domains August 1995 - June 2011

Slide 15

Slide 15 text

͍·͞Β Apache+mod_perl? • ͍ͭͰ΋θϩ͔Β࠷৽ͷWAFΛ࢖ͬͯ ։ൃ͕Ͱ͖Δͱ͸ݶΒͳ͍ • डୗҊ݅΍ίϯςϯπҠ؅Ҋ݅ͳͲɺ ϨΨγʔͳApacheͱPerl CGI(or PHP)ͷ ੡඼Λ౉͞ΕΔ͜ͱ΋͋Δେਓͷੈք • ϦϑΝΫλϦϯάɺ ϚΠάϨʔγϣϯ...

Slide 16

Slide 16 text

mod_perlͷόʔδϣϯ • Apache1.3 → mod_perl1 • Apache2.x → mod_perl2 • 1ͱ2Ͱ͸mod_perlͷจ๏ͷҧ͍͸େ͖͍ • ྺ࢙ͷڱؒͷmod_perl1.99(ཁ஫ҙ) • ※ݱࡏApache1͸deprecated͕ͩɺੈؒͰ͸ݱ໾ͱݴ͑ΔͷͰɺmod_perl1 ʹ͍ͭͯ΋ɺͳΔ΂͘৮Ε·͢

Slide 17

Slide 17 text

mod_perlͷྺ࢙ • mod_perl1 fi rst public release: 1996/3/25 (http://perl.apache.org/dist/mod_perl-1.0-current/Changes ΑΓ) • mod_perl2 fi rst public release: 2002/4/6 (http://perl.apache.org/dist/mod_perl-2.0-current/Changes ΑΓ)

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

ྫ͑͹ hello.pl

Slide 20

Slide 20 text

mod_perl1ͰHello1.pm • ʮϨεϙϯεϋϯυϥʯΛॻ͘ • Ϩεϙϯεϋϯυϥͱ͸ɺୈҰҾ਺ʹϦΫ ΤετΦϒδΣΫτ($r)Λड͚औΔ handler αϒϧʔνϯ͕ఆٛ͞Εͨύοέʔδ • http://hello.example.jp/ ҎԼʹΞΫηεͨ͠ Βɺว͘ Content-Type: text/plain Ͱఆܗͷѫ ࡰ͢Δ͚ͩͷαϯϓϧΛ࡞ͬͯΈΔ

Slide 21

Slide 21 text

mod_perl1ͰHello1.pm # apache1.3 con fi guration ServerName hello.example.jp SetHandler perl-script PerlHandler Hello1

Slide 22

Slide 22 text

mod_perl1ͰHello1.pm

Slide 23

Slide 23 text

mod_perl2ͰHello2.pm • ಉ༷ͷαϯϓϧΛ࡞੒ • جຊ͸mod_perl1ͱಉ͡ • จ๏͸݁ߏҧ͍·͢

Slide 24

Slide 24 text

mod_perl2ͰHello2.pm # apache2.x con fi guration ServerName hello.example.jp SetHandler perl-script PerlResponseHandler Hello2

Slide 25

Slide 25 text

mod_perl2ͰHello2.pm • PerlHandler → PerlResponseHandler ໊લ͕Α͏΍͘໌շʹͳͬͨ • ͨͩ Hello2.pm ͷίʔυ͸݁ߏҧ͍·͢

Slide 26

Slide 26 text

mod_perl2ͰHello2.pm

Slide 27

Slide 27 text

mod_perl2ͰHello2.pm • mod_perl1͸mod_perlͷύοέʔδ໊લ ۭؒ͸ Apache:: ͷΈ • mod_perl2͸mod_perlͷύοέʔδ໊લ ۭ͕ؒ Apache2::ɺModPerl::ɺAPR:: ౳ͱ ࡉ෼Խ͞Εɺmod_perl1ͷڊେͳΫϥε (Apache object౳)΋Mix-inతʹ෼ׂ͞Εͨ

Slide 28

Slide 28 text

Helloͱѫࡰͯ͠΋... • ࠓ·Ͱ΍͖ͬͯͨͷ͸CGI΍WAFͰ΋ Ͱ͖Δ؆୯HTTPϨεϙϯεΛฦ͢ॲཧ • Α͏΍͘ຊ୊΁...

Slide 29

Slide 29 text

II. mod_perlͷਅ਷͸ Apacheͷ֦ு

Slide 30

Slide 30 text

mod_perlͷਅ਷͸ Apacheͷ֦ு • ࠓ·Ͱݟ͖ͯͨͷ͸ɺHTTPϨεϙϯε Λฦ͢ॲཧ • mod_perl͸HTTPϨεϙϯεΛฦ͚ͩ͢ Ͱͳ͘ɺͦͷલॲཧ΍ޙॲཧ΋Ͱ͖Δ

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Apacheͷ಺෦ॲཧ • ͬ͘͟Γྻڍ͚ͨͩ͠ͳͷʹϏογϦ • ֤ॲཧΛߦ͍ͬͯΔ෦෼ʹ͸ϑοΫ͕͋ͬͯɺ ͜͜ʹ֤छॲཧΛڬΉ͜ͱ͕Մೳ →Apache Moduleʢmod_xxxxxx) •Apache Module ͰͰ͖Δ͜ͱΛ Perl ͰͰ͖ ΔΑ͏ʹͨ͠΋ͷ͕mod_perl • ͜Ε͕mod_perlͷਅ਷Ͱ͢

Slide 34

Slide 34 text

Apache/mod_perl ॲཧϑΣʔζ • ֤ϑοΫ͕͋Δ෦෼: ʮ(ॲཧ)ϑΣʔζʯ • ϦΫΤετ଴ͪঢ়ଶ͔Β֤ϑΣʔζΛҰ ८͢ΔͷͰɺશମΛʮϦΫΤεταΠΫ ϧʯͱݺͼ·͢ • Apache/mod_perlͷ1ͱ2Ͱ݁ߏҧ͍·͢ • Apache/mod_perlͷ2ͷ΄͏͕ߴػೳ

Slide 35

Slide 35 text

ॲཧϑΣʔζ: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 36

Slide 36 text

ॲཧϑΣʔζ:mod_perl1 ※ʮPractical mod_perlʯΑΓൈਮ

Slide 37

Slide 37 text

ॲཧϑΣʔζ: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 38

Slide 38 text

ॲཧϑΣʔζ:mod_perl2 ※ʮPractical mod_perlʯΑΓൈਮ

Slide 39

Slide 39 text

࣮ྫ • ࣌ؒͷ౎߹্ɺଟ͘Λ͝঺հͰ͖·ͤ Μ͕ɺগ࣮͠ྫΛݟͯΈ·͠ΐ͏

Slide 40

Slide 40 text

࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά • Α͘࢖ΘΕ͍ͯΔ͝ଘ஌mod_rewrite • ୯७ͳURLਖ਼نදݱஔ׵ʹศར • ͨͩɺॲཧߦ਺͕ଟ͘ͳ͖ͬͯͨΓɺ (ؤுΕ͹ॻ͚Δ͕)৚݅෼ذ΍൓෮ॲཧ ʹखΛग़͢ͱ్୺ʹࠇຐज़Խ

Slide 41

Slide 41 text

࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά • mod_rewriteॲཧΛɺURLΛॻ͖׵͑Δ ϑΣʔζͷPerlTransHandlerͰ࣮૷͢Δ • (࢖͏ͳΒ)৚݅෼ذ΍൓෮ॲཧ͕Perlͷ ίʔυʹͳΔͷͰՄಡੑ͕Α͘ͳΔ • mod_rewriteࣗ਎PerlTransHandlerʹରԠ ͢ΔC APIͷϑΣʔζͰಈ࡞͍ͯ͠·͢ ※࣮ࡍ͸PerlFixupHandlerʹରԠ͢ΔϑΣʔζͰ΋͓࢓ࣄΛ͍ͯ͠·͢

Slide 42

Slide 42 text

࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά # required “RewriteURL.pm” ServerName hello.example.jp PerlTransHandler RewriteURL

Slide 43

Slide 43 text

࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά

Slide 44

Slide 44 text

• ʮϨεϙϯεϋϯυϥʯͱಉ͡Α͏ͳ จࣈ௨ΓʮϋϯυϥʯΛॻ͖·͢ • sub handler { my $r = shift; ... } • ଞͷϑΣʔζͰ΋͜ͷॻ͖ग़͠͸ఆੴ ࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά

Slide 45

Slide 45 text

ଞʹͰ͖Δ͜ͱҰྫ • ֤ϑΣʔζͰ͜Μͳ͜ͱ͕Ͱ͖ΔΑʂ ͱ͍͏֓೦͚ͩ͝঺հ͠·͢ɻ • ࣮ࡍͷମݧஊΛଟ͘੝Γ͜ΜͰΈ·͢

Slide 46

Slide 46 text

ଞʹͰ͖Δ͜ͱҰྫ • PerlPostReadRequestHandler औΓٸ͗ѱ࣭ͳDDoSΛःஅ(Ԡٸાஔ) • return DONE; # cut off! • ຊདྷ͸PerlAccessHandlerͰ͢Δͷ͕ྑ͍ • ࠷ऴతʹ͸LB΍iptablesͰःஅ͔ͳ

Slide 47

Slide 47 text

ଞʹͰ͖Δ͜ͱҰྫ • PerlTransHandler͸ຊ౰ʹ໾ཱͪ·͢ • mod_rewrite͕εΠε੡ΞʔϛʔφΠϑ ͳΒɺPerlTransHandler͸ϓϩͷྉཧਓ ͕࢖͏ߴڃแஸʁͦΕͱ΋೔ຊ౛ʁ • URLॻ͖׵͚͑ͩͰͳ͘ϦμΠϨΫτ΋ ౰વͰ͖·͢(return REDIRECT; ͳͲ)

Slide 48

Slide 48 text

ଞʹͰ͖Δ͜ͱҰྫ • Perl{Authen,Authz}Handler γϯάϧαΠϯΦϯ࣮૷ PHPͰ΋ϨεϙϯεॲཧʹೖΔલʹ CookieॲཧͳͲΛPerlͰߦ͑Δ • Access,Authen,Authzͷ3छ͸3Aͱ΋ݺ͹ ΕΔɻΞΫηε੍ޚɺೝূɺڐՄɻ

Slide 49

Slide 49 text

ଞʹͰ͖Δ͜ͱҰྫ •طʹେྔͷHTMLϑΝΠϧͷ͋Δ੩తαΠτΛड ͚औͬͨϓϩάϥϚͷݽ܉ฃಆ • ґཔʮUser-AgentΛݟͯ *.html ͷ Content-Type Λ text/html ͔ application/xhtml+xml ͔ɺग़͠෼͚ͯ͠ ͍͚ͨͩ·͔͢ʁʯ • PerlTypeHandler ͔ PerlFixupHandler Ͱ΍Γ·͠ΐ͏ (ೖग़ྗϔομॲཧ: $r->headers_in, $r->headers_out)

Slide 50

Slide 50 text

ଞʹͰ͖Δ͜ͱҰྫ • ґཔʮΞϑΟϦΤΠτͰશͯͷHTML ϑΝΠϧͷ

Slide 51

Slide 51 text

ଞʹͰ͖Δ͜ͱҰྫ • ґཔʮiϞʔυHTMLͰॻ͔Εͨֆจࣈ ೖΓ੩తHTML͕େྔʹ͋ΔΜͰ͕͢ɺ SBM୺຤͕དྷͨΒม׵(ryʯ • ͜Ε΋ PerlHandler / PerlResponseHandler Ͱ͓ख͔ܰͭಁա తʹղܾ͠·͠ΐ͏

Slide 52

Slide 52 text

ଞʹͰ͖Δ͜ͱҰྫ ࣾ಺ίʔυ Kepler/Apache/ConvertEmoji.pm ΑΓൈਮ

Slide 53

Slide 53 text

ଞʹͰ͖Δ͜ͱҰྫ • HTTPϨεϙϯεग़ྗॲཧ / PerlHandler / PerlResponseHandler ͕׬ྃͨ͠ޙ... • PerlLogHandler͸$r͔ΒHTTPϨεϙϯε ݁Ռ΍ૹ৴αΠζ਺͕औಘՄೳͳঢ়ଶ • ༷ʑͳDBʹϩάΛॻ͖ग़ͨ͠Γ௨஌Λ ͨ͠ΓͰ͖·͢

Slide 54

Slide 54 text

ଞʹͰ͖Δ͜ͱҰྫ • ଞʹ΋ຊ౰ʹ৭ʑͳ࢖͍ํ͕Ͱ͖Δ mod_perlͷHTTPॲཧͰ͕͢ɺͦΖͦΖ ࣍ͷ࿩ʹҠΓ·͢

Slide 55

Slide 55 text

III. Apache2&mod_perl2 ͰHTTPͷ֎΁

Slide 56

Slide 56 text

Apache2&mod_perl2Ͱ HTTPͷ֎΁ • ઌ΄Ͳ঺հͨ͠mod_perlͷॲཧϑΣʔ ζ͸HTTP Request/Responseͷ͓࿩ • $r : Apache (mod_perl1) • $r : Apache2::RequestRec (mod_perl2) • ׳श໊ $r ͷ r ͸ request/response ͷ r

Slide 57

Slide 57 text

Apache2/mod_perl2 Ͱͷ৽ઃαΠΫϧ • Apache2ʹ͸HTTPΛѻ͏Ҏ֎ͷαΠΫϧ΋͋Δ • ServerLifeCycle ؔ࿈ • Protocol / Connection ؔ࿈ • Filter ؔ࿈ • Thread ؔ࿈ •౰વmod_perl2Ͱ΋ɺͦΕΛ࢖ͬͯHTTPҎ֎ͷॲ ཧ͕ॻ͚Δ ※ http://perl.apache.org/docs/2.0/user/con fi g/con fi g.html Λࢀর

Slide 58

Slide 58 text

Apache2/mod_perl2 Connection αΠΫϧ • ࠓճ͸ConnectionαΠΫϧʹ஫໨ • (HTTPͰ͸ͳ͍)ProtocolαΠΫϧͱ΋ • ConnectionαΠΫϧ͸HTTPΛѻ͏ αΠΫϧɾϑΣʔζΑΓ΋લʹҐஔ͢Δ • Apache2ͰͷԠ༻ྫ: mod_ssl

Slide 59

Slide 59 text

Connection αΠΫϧͷ ॲཧϑΣʔζ PerlPreConnectionHandler PerlProcessConnectionHandler ※ʮPractical mod_perlʯΑΓൈਮ

Slide 60

Slide 60 text

• 2͚ͭͩɻHTTPΑΓ΋γϯϓϧʁ • PerlPreConnectionHandler • Apacheॲཧͷຊ౰ʹ๯಄ʹҐஔ͢Δ • PerlProcessConnectionHandler •ࠓճ͜͜ʹSMTPαʔόΛ࡞Γ·͢ Connection αΠΫϧͷ ॲཧϑΣʔζ

Slide 61

Slide 61 text

Apache2 SMTPαʔόͷ ࡞੒ಈػ • ։ൃ಺༰͸ϝʔϦϯάϦεταʔϏε • Post fi x pipeΛ࢖͑͹PerlϓϩάϥϜͰI/O ॲཧ͕ॻ͚Δ͕ɺforkͷίετ͕ߴ͍ • ॏ͍DBॲཧɺֆจࣈॲཧ͕͔ͨͬͨ͠

Slide 62

Slide 62 text

Apache2 SMTPαʔόͷߏ ੒ • ϋʔυ΢ΣΞߏ੒: 2୆(load balancing) • ֎෦ͱͷૹड৴SMTPαʔό͸ɺطʹ Քಇதͷผͷϋʔυ΢ΣΞ਺े୆ఔ ౓ͷΫϥελ͕͋Δ • ʮApache2 SMTPαʔόʯͷ಺෦Ͱ͸ɺ Post fi xʹड৴ͱૹ৴ͷॲཧΛґཔ...

Slide 63

Slide 63 text

Apache2 SMTPαʔόͷߏ ੒ •໼ҹ͸SMTPͷྲྀΕ •αʔό಺Ͱ྆୺ͰPost fi xΛߏ͑ ͍ͤͯ͞Δͷ͸ɺ൥ࡶͳΩϡʔ ͷ؅ཧΛল͖͍ͨࢥ࿭͕͋Δ •Apache2 SMTP αʔό͕1ͭͷ Post fi x͔ΒݟͯผϙʔτͰಈ࡞ ͍ͯ͠ΔίϯςϯπϑΟϧλͷ Α͏ʹՔಇ͢Δ

Slide 64

Slide 64 text

mod_perl2Ͱ PerlProcessConnectionHandler • ʮίωΫγϣϯϋϯυϥʯΛॻ͘ • ࠓ·Ͱͷ$rͱҧ͍$c (Apache2::Connection) ΦϒδΣΫτΛୈҰҾ਺ʹड͚औΔ • sub handler { my $c = shift; ... } • Apacheͷઃఆ • ࣮ࡍͷྫΛ঺հ͠·͕͢ɺ௕͍ͷͰൈਮ

Slide 65

Slide 65 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ Listen 10025 gm fi lter AcceptFilter gm fi lter none TransferLog /var/log/httpd/gm fi lter.log ErrorLog /var/log/httpd/gm fi lter_error.log PerlModule Encode::NV \ ARM::G4::Apache2::GMFilter \ Apache::DBI PerlProcessConnectionHandler \ ARM::G4::Apache2::GMFilter

Slide 66

Slide 66 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ ࣾ಺ίʔυ ARM/G4/Apache2/GMFilter.pm ΑΓൈਮ1:๯಄෦෼

Slide 67

Slide 67 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • ϙΠϯτɿॏ͍ͨϞδϡʔϧΛେྔʹ useͯ͠΋େৎ෉ʂ • $cͷͨΊʹ use Apache2::Connection • Socket I/OॲཧͷͨΊʹAPR::Socket, APR::Brigade, APR::Bucket౳΋use͢Δ

Slide 68

Slide 68 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ ࣾ಺ίʔυ ARM/G4/Apache2/GMFilter.pm ΑΓൈਮ2:handler෦

Slide 69

Slide 69 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • Socket I/Oͷѻ͍ํ͸͞·͟· • ͪͳΈʹPreforkͳͷͰchdir()ͯ͠΋OK

Slide 70

Slide 70 text

PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • ͜͏ͯ͠ɺPost fi x pipeΛ࢖ΘͣʹɺPerl Λ࢖ͬͯDB઀ଓ͋Γɺֆจࣈม׵͋Γ ͷϝʔϦϯάϦεταʔϏεΛ࣮૷͢ Δ͜ͱ͕Ͱ͖ͨ • αʔϏε໊: άϧʔϓϝʔϧ • ػձ͕͋Ε͹ΑΖ͓͘͠ئ͍͠·͢ URL: http://rmail.jp/feature/4_5.html

Slide 71

Slide 71 text

IV. ଵଦͱԠ༻ qpsmtpd & nginx...

Slide 72

Slide 72 text

θϩ͔Βॻ͘ͷ͸໘౗ • Apache2 ConnectionϑΣʔζͰSMTPαʔ όΛ࣮૷Ͱ͖Δͷ͸෼͔ͬͨ • ͚ͩͲθϩ͔Β࣮૷͢ΔͳΜͯ໘౗ • ͝΋ͬͱ΋ • ͦΜͳਓͷͨΊʹɺqpsmtpdͱ͍͏ Perl࣮૷ͷSMTPαʔό͕͋Γ·͢

Slide 73

Slide 73 text

qpsmtpd • http://smtpd.develooper.com/ • ։ൃ౰࣌΋ଘࡏΛฉ͖ٴΜͰ͍͕ͨɺ αʔόݎ࿚ੑΛ͏·͘ධՁͰ͖ͳ͔ͬ ͨͷͰ࠾༻Λݟૹͬͨ

Slide 74

Slide 74 text

qpsmtpd͸࣮͸ݎ͍ • Perlͷdaemonʹ͍͍ҹ৅͕ͳ͔ͬͨ (౰࣌ͷPOE౳) • qpsmtpdͷEngineతͳ෺͸޷ΈͰબ΂Δ • ͔͠΋ϝχϡʔ๛෋

Slide 75

Slide 75 text

qpsmtpd͸࣮͸ݎ͍ • qpsmtpdͷࠜఈΛࢧ͑ΔEngine=Transport • pipe (CGI like) • fork-server • prefork-server •Apache (Apache::Qpsmtpd) • async (Danga::Socket base?)

Slide 76

Slide 76 text

qpsmtpd͸࣮͸ݎ͍ • Apache::Qpsmtpdͱ͔ɺ͋Δ͠ʂ • ޙͰιʔείʔυݟͨΒɺฐࣾͰ࣮ફ ͨ͠άϧʔϓϝʔϧͷ࣮૷࿦ͦͷ΋ͷ

Slide 77

Slide 77 text

qpsmtpd͸࣮͸ݎ͍ • Danga::Socketϕʔε΋ݎͦ͏ͩ͠ɺ࣍͸ qpsmtpdͰ΋໰୊ͳ͍ͱࢥͬͨ • ݱࡏ΋Post fi x pipeͰՔಇ͍ͯ͠Δɺฐࣾ ண৴௨஌ϓϩάϥϜΛqpsmtpdͰॻ͖͔ ͍͑ͨͱࢥ͏΄Ͳɺࠓ͸ྑ͍ҹ৅Λ ͍࣋ͬͯΔ

Slide 78

Slide 78 text

qpsmtpd·ͱΊ • ͳͷͰࠓճʮApacheͰಈ࡞͢ΔSMTP αʔόʯʹڵຯΛ࣋ͬͨํ͸ qpsmtpd(Apache::Qpsmtpd)ʹ৮ΕΔͱ͍ ͍Ͱ͢ • ϓϥάΠϯ΋Ϟμϯͳॻ͖ํͰྑ͍

Slide 79

Slide 79 text

nginx • http://nginx.org/ • ࠓ࿩୊ͷ΢Σϒαʔό • ࠓ೥ͷय़ʹstable͕ొ৔ͯ͠ීٴʹ஄Έ • FastCGIͷಈ࡞؀ڥͱͯ͠΋࢖ΘΕΔ

Slide 80

Slide 80 text

nginxͷ EmbeddedPerlModule ※ http://wiki.nginx.org/EmbeddedPerlModule ΑΓ

Slide 81

Slide 81 text

nginxͷ EmbeddedPerlModule ※ http://wiki.nginx.org/EmbeddedPerlModule ΑΓ

Slide 82

Slide 82 text

nginxͷ EmbeddedPerlModule • ͍͢͝mod_perl1ͬΆ͍ • ࣮ࡍɺେ෦෼ͷϝιου͸mod_perl1ͱ ͦͬ͘Γಉ͡ • গ͠ҧ͍͕͋ΔͷͰ஫ҙ͕ඞཁͳఔ౓

Slide 83

Slide 83 text

nginx EmbeddedPerlModule ஫ҙ఺ • worker(single threaded process)ͷಛੑ্ ͱ͋ΔϦΫΤετͰ௕࣌ؒI/OΛϒϩο Ωϯά͢Δͱαʔόશମ͕ࢭ·Γ·͢ • (mod_perlʹൺ΂ͯ)ϊ΢ϋ΢͕গͳ͍

Slide 84

Slide 84 text

nginx EmbeddedPerlModule ·ͱΊ • ஫ҙ఺΋͋Δ͕ັྗతɺ໘നͦ͏ • mod_perl1ษڧ͓͍ͯͯ͠ྑ͔ͬͨʂ • C10K໰୊ͳͲաࠅͳ໰୊ʹཱͪ޲͔͏ ৔߹ɺੑೳʹ಄ଧͪײ͕͋Δ Apache(mod_perl)ͷ༗ྗͳ୅ସͱͳΓ͏ Δ

Slide 85

Slide 85 text

·ͱΊ

Slide 86

Slide 86 text

·ͱΊ • ࠓͰ΋mod_perlͷ஌ࣝΛ஌͓ͬͯ͘ͱɺ͍͟ͱ͍ ͏ͱ͖ྑ͍͜ͱ͕͋Δ(͔΋) • mod_perlͷจ๏͸ଞͷ੡඼ʹ΋ӨڹΛ༩͍͑ͯΔ • Apache2/mod_perl2͸Connection΋ॻ͚ͯɺHTTP Ҏ֎ͷ೚ҙͷ(Apacheͱಉఔ౓ͷ)ݎ࿚ͳαʔό͕ Perl(mod_perl)Ͱ࣮૷Մೳ • ฐࣾͰ͸༷ʑͳܗଶͰmod_perlΛ׆༻͍ͯ͠·͢

Slide 87

Slide 87 text

ࠓճ৮ΕΒΕͳ͔͚ͬͨͲ ڵຯਂ͍τϐοΫ • Filter • mod_perl1 ٖࣅFilterؔ࿈ Apache::Filter, Apache::OutputChain • mod_perl2 ωΠςΟϒFilterؔ࿈ Perl{Input,Output}FilterHandler

Slide 88

Slide 88 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 89

Slide 89 text

ࢀߟจݙ • Apache C API(mod_*.c)ͷࢀߟॻ੶ • Apache֦ுΨΠυ(্ɾԼ) (Oreilly 2000; C APIΛmod_perlʹԊͬͯղઆͨ͠ྑॻͰ͕ͨ͠ ݱࡏઈ൛ͩͦ͏Ͱ͢) • The Apache Modules Book (Prentice Hall 2007; ͪ͜Β͸׬શʹC APIͷຊ)

Slide 90

Slide 90 text

ࢀߟจݙ • 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

Slide 91

Slide 91 text

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