Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜
Search
OGATA Tetsuji
July 16, 2011
Technology
0
7
mod_perl温故知新 〜Perl CGIの高速化からメールサーバまで〜
2011/07/16に Hokkaido.pm#5 で発表したスライドです。
OGATA Tetsuji
July 16, 2011
Tweet
Share
More Decks by OGATA Tetsuji
See All by OGATA Tetsuji
Hokkaido.pmがあって YAPCでトークできた
xtetsuji
0
17
モダンmod_perl入門 #yapcasia
xtetsuji
0
11
札幌でテンプレート #hokkaidopm
xtetsuji
0
18
すごいmod_perl
xtetsuji
0
8
Perl WAF Overview, with mod_perl - Hokkaido.pm#7 #hokkaidopm
xtetsuji
0
8
PerlのTwitterモジュールの紹介
xtetsuji
0
11
mod_perl hacks PHP
xtetsuji
0
5
文字化け2011〜まだまだ化けます〜
xtetsuji
0
11
Other Decks in Technology
See All in Technology
Taming you application's environments
salaboy
0
190
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
600
BLADE: An Attempt to Automate Penetration Testing Using Autonomous AI Agents
bbrbbq
0
310
いざ、BSC討伐の旅
nikinusu
2
780
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
370
開発生産性を上げながらビジネスも30倍成長させてきたチームの姿
kamina_zzz
2
1.7k
EventHub Startup CTO of the year 2024 ピッチ資料
eventhub
0
120
飲食店データの分析事例とそれを支えるデータ基盤
kimujun
0
100
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
130
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
220
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
3.2k
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
6
650
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Speed Design
sergeychernyshev
25
620
BBQ
matthewcrist
85
9.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
A Philosophy of Restraint
colly
203
16k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Visualization
eitanlees
145
15k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Side Projects
sachag
452
42k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
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 + Post fi x)Λ։ൃ • ࠷ۙ৽͍ٕ͠ज़తͳࢼΈʹνϟϨϯδத
ࠓճ͓Λ͍ͤͯͨͩ͘͞ ͜ͱʹͳͬͨܦҢ • ݩʹεΧΠΞʔΫγεςϜͱ͍͏ձ͕ࣾ͋Δ • 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? • ʲ࣭ʳWAFɺPSGI/PlackΛ͑ɺ ApacheͳͲҙࣝ͠ͳ͍͍ͯ͘ͷͰʁ • ʲճʳ͔֬ʹͦ͏͔͠Ε·ͤΜɻ ͚ͩͲɺࣝͱ͓͍ͯͬͯͯ͠ଛ ແ͍ͣͰ͢ •
ྫ͑Plack+mod_perl2Ͱɺมͳόά Λ౿ΜͰ͠·͏͜ͱ͋ΔΑ͏Ͱ͢ ※ http://subtech.g.hatena.ne.jp/cho45/20101221/1292941055 ※1. WAF=Web Application Framework ※1
͍·͞Β Apache+mod_perl? • Apache+mod_perl+WAFͰmod_perlͷ ଆΛଟগ͓͚ͬͯ… • όάΛ౿Μͩ࣌ɺཱͭ • ύϑΥʔϚϯεվળͷώϯτ͕͋Δ
͍·͞Β Apache+mod_perl? • ࠓApache࠷ΘΕ͍ͯΔαʔό • ͲͷLinuxσΟετϦϏϡʔγϣϯʹ େApacheͱmod_perlͷύοέʔδ ඪ४Ͱ༻ҙ͞Ε͍ͯΔ(ͣ)
͍·͞Β Apache+mod_perl? • ࠓApache࠷ ΘΕ͍ͯΔαʔό • ApacheͷγΣΞ 20117݄ݱࡏ65.86% (20116݄ͩͱ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
͍·͞Β 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(ཁҙ) • ※ݱࡏApache1deprecated͕ͩɺੈؒͰݱͱݴ͑ΔͷͰɺmod_perl1 ʹ͍ͭͯɺͳΔ͘৮Ε·͢
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 ΑΓ)
• 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
ྫ͑ hello.pl
mod_perl1ͰHello1.pm • ʮϨεϙϯεϋϯυϥʯΛॻ͘ • ϨεϙϯεϋϯυϥͱɺୈҰҾʹϦΫ ΤετΦϒδΣΫτ($r)Λड͚औΔ handler αϒϧʔνϯ͕ఆٛ͞Εͨύοέʔδ • http://hello.example.jp/
ҎԼʹΞΫηεͨ͠ Βɺว͘ Content-Type: text/plain Ͱఆܗͷѫ ࡰ͢Δ͚ͩͷαϯϓϧΛ࡞ͬͯΈΔ
mod_perl1ͰHello1.pm # apache1.3 con fi guration <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 con fi guration <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_perl1mod_perlͷύοέʔδ໊લ ۭؒ Apache:: ͷΈ • mod_perl2mod_perlͷύοέʔδ໊લ ۭ͕ؒ Apache2::ɺModPerl::ɺAPR::
ͱ ࡉԽ͞Εɺmod_perl1ͷڊେͳΫϥε (Apache object)Mix-inతʹׂ͞Εͨ
Helloͱѫࡰͯ͠... • ࠓ·Ͱ͖ͬͯͨͷCGIWAFͰ Ͱ͖Δ؆୯HTTPϨεϙϯεΛฦ͢ॲཧ • Α͏͘ຊ...
II. mod_perlͷਅ Apacheͷ֦ு
mod_perlͷਅ Apacheͷ֦ு • ࠓ·Ͱݟ͖ͯͨͷɺHTTPϨεϙϯε Λฦ͢ॲཧ • mod_perlHTTPϨεϙϯεΛฦ͚ͩ͢ Ͱͳ͘ɺͦͷલॲཧޙॲཧͰ͖Δ
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/con fi g.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/con fi g/con fi g.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ͷ ϦϑΝΫλϦϯά
• ʮϨεϙϯεϋϯυϥʯͱಉ͡Α͏ͳ จࣈ௨ΓʮϋϯυϥʯΛॻ͖·͢ • sub handler { my $r =
shift; ... } • ଞͷϑΣʔζͰ͜ͷॻ͖ग़͠ఆੴ ࣮ྫ: mod_rewriteͷ ϦϑΝΫλϦϯά
ଞʹͰ͖Δ͜ͱҰྫ • ֤ϑΣʔζͰ͜Μͳ͜ͱ͕Ͱ͖ΔΑʂ ͱ͍͏֓೦͚ͩ͝հ͠·͢ɻ • ࣮ࡍͷମݧஊΛଟ͘Γ͜ΜͰΈ·͢
ଞʹͰ͖Δ͜ͱҰྫ • PerlPostReadRequestHandler औΓٸ͗ѱ࣭ͳDDoSΛःஅ(Ԡٸાஔ) • return DONE; # cut off!
• ຊདྷPerlAccessHandlerͰ͢Δͷ͕ྑ͍ • ࠷ऴతʹLBiptablesͰःஅ͔ͳ
ଞʹͰ͖Δ͜ͱҰྫ • 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-> fi lename())));
ଞʹͰ͖Δ͜ͱҰྫ • ґཔʮ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/con fi g/con fi g.html Λࢀর
Apache2/mod_perl2 Connection αΠΫϧ • ࠓճConnectionαΠΫϧʹ • (HTTPͰͳ͍)ProtocolαΠΫϧͱ • ConnectionαΠΫϧHTTPΛѻ͏ αΠΫϧɾϑΣʔζΑΓલʹҐஔ͢Δ
• Apache2ͰͷԠ༻ྫ: mod_ssl
Connection αΠΫϧͷ ॲཧϑΣʔζ PerlPreConnectionHandler PerlProcessConnectionHandler ※ʮPractical mod_perlʯΑΓൈਮ
• 2͚ͭͩɻHTTPΑΓγϯϓϧʁ • PerlPreConnectionHandler • Apacheॲཧͷຊʹ಄ʹҐஔ͢Δ • PerlProcessConnectionHandler •ࠓճ͜͜ʹSMTPαʔόΛ࡞Γ·͢ Connection
αΠΫϧͷ ॲཧϑΣʔζ
Apache2 SMTPαʔόͷ ࡞ಈػ • ։ൃ༰ϝʔϦϯάϦεταʔϏε • Post fi x pipeΛ͑PerlϓϩάϥϜͰI/O
ॲཧ͕ॻ͚Δ͕ɺforkͷίετ͕ߴ͍ • ॏ͍DBॲཧɺֆจࣈॲཧ͕͔ͨͬͨ͠
Apache2 SMTPαʔόͷߏ • ϋʔυΣΞߏ: 2(load balancing) • ֎෦ͱͷૹड৴SMTPαʔόɺطʹ ՔಇதͷผͷϋʔυΣΞेఔ
ͷΫϥελ͕͋Δ • ʮApache2 SMTPαʔόʯͷ෦Ͱɺ Post fi xʹड৴ͱૹ৴ͷॲཧΛґཔ...
Apache2 SMTPαʔόͷߏ •ҹSMTPͷྲྀΕ •αʔόͰ྆ͰPost fi xΛߏ͑ ͍ͤͯ͞ΔͷɺࡶͳΩϡʔ ͷཧΛল͖͍ͨࢥ͕͋Δ •Apache2
SMTP αʔό͕1ͭͷ Post fi x͔ΒݟͯผϙʔτͰಈ࡞ ͍ͯ͠ΔίϯςϯπϑΟϧλͷ Α͏ʹՔಇ͢Δ
mod_perl2Ͱ PerlProcessConnectionHandler • ʮίωΫγϣϯϋϯυϥʯΛॻ͘ • ࠓ·Ͱͷ$rͱҧ͍$c (Apache2::Connection) ΦϒδΣΫτΛୈҰҾʹड͚औΔ • sub
handler { my $c = shift; ... } • Apacheͷઃఆ • ࣮ࡍͷྫΛհ͠·͕͢ɺ͍ͷͰൈਮ
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ Listen 10025 gm fi lter AcceptFilter gm fi
lter none <VirtualHost 127.0.0.1:10025> 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 </VirtualHost>
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ ࣾίʔυ ARM/G4/Apache2/GMFilter.pm ΑΓൈਮ1:಄෦
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • ϙΠϯτɿॏ͍ͨϞδϡʔϧΛେྔʹ useͯ͠େৎʂ • $cͷͨΊʹ use Apache2::Connection •
Socket I/OॲཧͷͨΊʹAPR::Socket, APR::Brigade, APR::Bucketuse͢Δ
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ ࣾίʔυ ARM/G4/Apache2/GMFilter.pm ΑΓൈਮ2:handler෦
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • Socket I/Oͷѻ͍ํ͞·͟· • ͪͳΈʹPreforkͳͷͰchdir()ͯ͠OK
PerlProcessConnectionHandler Ͱॻ͍ͨSMTPαʔόͷৄࡉ • ͜͏ͯ͠ɺPost fi x 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Ͱͳ͍ͱࢥͬͨ • ݱࡏPost fi x pipeͰՔಇ͍ͯ͠Δɺฐࣾ ண৴௨ϓϩάϥϜΛqpsmtpdͰॻ͖͔
͍͑ͨͱࢥ͏΄Ͳɺࠓྑ͍ҹΛ ͍࣋ͬͯΔ
qpsmtpd·ͱΊ • ͳͷͰࠓճʮApacheͰಈ࡞͢ΔSMTP αʔόʯʹڵຯΛ࣋ͬͨํ qpsmtpd(Apache::Qpsmtpd)ʹ৮ΕΔͱ͍ ͍Ͱ͢ • ϓϥάΠϯϞμϯͳॻ͖ํͰྑ͍
nginx • http://nginx.org/ • ࠓͷΣϒαʔό • ࠓͷय़ʹstable͕ొͯ͠ීٴʹΈ • FastCGIͷಈ࡞ڥͱͯ͠ΘΕΔ
nginxͷ EmbeddedPerlModule ※ http://wiki.nginx.org/EmbeddedPerlModule ΑΓ
nginxͷ EmbeddedPerlModule ※ 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_perl2Connectionॻ͚ͯɺ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
͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠