YAPC::Kyoto 2023
σϓϩΠࠓੲޠʙCGI͔ΒαʔόʔϨε·Ͱʙ@mackee_w a.k.a macopy
View Slide
͢༰
σϓϩΠ
@macopy• ໘ന๏ਓΧϠοΫ eεϙʔπࣄۀ෦TonamelαʔόαΠυςοΫϦʔυ• Perlେ͖ Go͖• GGST༻Ωϟϥ: ϥϜϨβϧ• ISUCON11 ༏উ / ISUCON12 ग़
[AD] Tonamel
[AD] TonamelࠓճͷτʔΫͰհ͢ΔʮσϓϩΠʯͰ͍͏ͱTonamelʮPullܕσϓϩΠʯ͔ͭʮDockerʯͰ͢
͜ͷτʔΫʹ͓͚ΔʮσϓϩΠʯͷൣғ• WebΞϓϦέʔγϣϯΛ։ൃͨ͠ޙ͔ΒɺϢʔβʔ͕ϒϥβͰݟΔ·Ͱʹඞཁͳٕज़܈• ʮσϦόϦʔʯͱݴ͏• ྫ:• αʔόʔͷϓϩάϥϜͷөํ๏• αʔόʔϓϩάϥϜͷϗεςΟϯάํ๏
!DISCLAIMER!͜ͷτʔΫͰҟͳΔϨΠϠʔͷ֓೦͕ަޓʹग़͖ͯͨΓࠞͬͨ͟Γͯ͠͞Ε·͢ॱ൪֓Ͷ࣌ܥྻͰͷొॱͰ͕͢ɺհ͢ΔτϐοΫొஃऀͷڵຯͰܾΊ͍ͯ·͢
͜ͷτʔΫͷਐΊํ• ҎԼͷΛҰͭͷσϓϩΠٕज़ʹର͍͖ͯͯ͠͠·͢•ख๏ͷղઆ•࣌എܠ•࣮ફ
͜ͷτʔΫͷਐΊํ• ҎԼͷΛҰͭͷσϓϩΠٕज़ʹର͍͖ͯͯ͠͠·͢•ख๏ͷղઆ => Ͳ͏͍͏Έͳͷ͔•ొഎܠ => ੜ·ΕͨܦҢ•࣮ફ => ͬͯΈΑ͏ɺମݧͯ͠ΈΑ͏
!DISCLAIMER! ͦͷ2σϞʹ࣌ΘΕ͍ͯͨιϑτΣΞ(όʔδϣϯ)͍ͬͯ·ͤΜʂʂʂࠓݱࡏೖखͰ͖ΔͷΛ͍ͬͯ·͢
ొ͢ΔιϑτΣΞڥ• Perl 5.32.1(system perl), Perl 5.36.0• Apache 2.4.54• mod_perl 2.0.11• Debian 11 bullseye• ݕূڥͱ͜ͷϚγϯؒtailscaleͰVPNΛு͍ͬͯ·͢
Are youready?
CGI
CGIͷख๏
CGIͷొഎܠ• 1993ʹఏҊ͞Ε༷ͨ ͜ͷ࣌ͷόʔδϣϯ1.0• NCSA httpdʹhtbinͱ͍͏ػೳ͕͕͋ͬͨɺଞͷαʔόʔͰ͑ΔΑ͏ʹ”Common”ͳ༷͕ߟ͑ΒΕͨ• ࣌HTMLࡦఆ్্ͰɺWebΛऔΓר͘πʔϧνΣΠϯ͕ੜ·ΕΔᴈ໌ظͱ͍ͬͨײ͡
ʮϨϯλϧαʔόʔʯ※ҰྫͰ͢
࣮ફ: PerlͷCGIϓϩάϥϜΛσϓϩΠ
ඪ४ετϦʔϜͱڥม͕͋ΕͳΜͰ͓k• ϓϩάϥϛϯάݴޠඇґଘͰ͋Δ• PerlͰCGI͋·Γʹ͋Γ͖ͨΓͰ• ͔ͤͬ͘ݴޠඇґଘͳͷʹ͜ͷσϞͰͭ·Μͳ͍Ͱ͢ΑͶʁ
࣮ફ: jqͰCGIϓϩάϥϜΛॻ͍ͯσϓϩΠ
CGIͷσϝϦοτ• ϓϩηεىಈͷίετ͕ॏ͍• ϦΫΤετͷͨͼʹϓϩηεΛىಈ͠ऴྃ͢Δ͜ͱʹͳΔ• PerlͷΑ͏ͳLLͰϞδϡʔϧͷಡΈࠐΈ͕ൃੜ͢Δ͜ͱʹ• ੲ`use`Ͱͳ͘`require`ΛͬͨDynamic Loading͕ଟ༻͞Ε͍ͯͨͷͦͷ͍ͤͩͱฉ͍͍ͯ·͢
੩తΤϯυϙΠϯτͷϕϯνϚʔΫ
CGIͷϕϯνϚʔΫ
mod_perl
mod_perlͷख๏
mod_perlͷొഎܠ• 1996ʹmod_perl, 2002ʹmod_perl2͕ϦϦʔε• Apacheͷػೳ֦ுΛPerlͰߦ͏Ϟδϡʔϧ• Ͱ͋Δ͕CGIϓϩάϥϜΛͦͷ··ޮΑ͘ಈ͔ͨ͢ΊʹΘΕͨ• `ModPerl::Registry`ͷHandlerΛ͑CGIͱͷޓੑΛอͬͨ··͑Δ• άϩʔόϧมͷण໋͕ϦΫΤετ୯ҐͰͳ͘ͳͬͨ• ཪΛฦͤϦΫΤετ୯ҐͰ͋ΔલఏͷCGIϓϩάϥϜͦͷ··Ͱಈ͔ͳ͍
࣮ફ: PerͷCGIϓϩάϥϜΛmod_perlͰಈ͔͢
ྨࣅ• mod_mruby, mod_lua etc…• Perlͷ෦Λผͷݴޠʹஔ͖͑ͨApacheͷϞδϡʔϧ• ngx_http_perl_module• nginxʹPerlΛΈࠐΜͰϦΫΤετॲཧͤ͞ΔϞδϡʔϧ
FastCGI
FastCGIͷख๏
FastCGIͷొഎܠ• 1996ʹఏএ͞Εͨ• mod_perlͷ༻్ͱಉ͘͡ʮCGIϓϩάϥϜͷߴԽʯ• ҰํͰɺmod_perlͱҧ͍ݴޠඇґଘΛࢦͨ͠• શͳdrop-in replacementͰ͖ͳ͍͕ɺηϚϯςΟΫεCGI͔ΒҾ͖ܧ͍Ͱ͍Δ• 1ͭͷίωΫγϣϯͰϦΫΤετͷଟॏԽ͞Ε͍ͯΔ
࣮ફ: PerlͷFastCGI͚ϓϩάϥϜΛಈ͔͢
FastCGIͷྨࣅ• SpeedyCGI/PersistentPerl• CGIϓϩηεΛӬଓԽͯ͠ར༻͢Δվ͞ΕͨperlΠϯλϓϦλΛ༻͍Δ• #!/usr/bin/speedy ʹshebangΛஔ͖͑Δͱར༻Ͱ͖Δ• ApacheͱSpeedyCGIؒCGIͱಉ༷ඪ४ετϦʔϜ+ڥม
PSGI
PSGIͷొഎܠ• 2009ʹspec͕CPANʹshipit͞Εͨ• WebϑϨʔϜϫʔΫͷ࣌ʹͳ͍͕ͬͯͨɺWebϑϨʔϜϫʔΫ͕ͦΕͧΕɺCGIFastCGIɺmod_perl͚ͷରԠΛߦͳ͍ͬͯͨ…• ͦ͜ͰWebΞϓϦͷೖग़ྗΛநԽͨ͠ΠϯλʔϑΣΠεΛ༻ҙͯ͠(=PSGI)ͦͷΠϯλʔϑΣΠεΛѻ͍ͨ͘͢͠ϥΠϒϥϦ(=Plack)Λ༻ҙͯ͠ɺPlack::Handlerͱͯ͠CGImod_perlͷϋϯυϥ͕࣮͞Εͨ
PSGIͷొഎܠ ͦͷ2• ҰํͰϓϩάϥϛϯάݴޠϥϯλΠϜࣗମͰHTTPαʔόʔΛಈ͔͢Α͏ʹͳͬͨ• ”ϦόʔεϓϩΩγ”ͱ͍͏֓೦͕ҰൠతʹͳΓ࢝Ίͨ• lighttpd, nginx etc…• Plack::Handlerͱͯ͠StarmanStarletͱ͍ͬͨPreforkܕͷHTTPαʔόʔ͕࣮͞Εͯ͘ΘΕΔΑ͏ʹͳͬͨ
Plack/PSGIͷख๏
࣮ફ: ੜPSGIΛॻ͍ͯΈͨ
PSGIͷྨࣅ• Java Servelet API• WSGI (Python)• Rack (Ruby)• ͜ͷॱ൪Ͱspecʹݴٴ͕͋Δ• PSGIʹWSGIͱRackͱ”JSGI”ʹݴٴ͕͋Δ
Plackͷྨࣅ(ΠϯλʔϑΣΠεࢹ)• ઌͨͪ• CGI.pm• CGI::Application• Apache::Request• HTTP::Engine• Catalyst::Engine
͜Ε·ͰΞʔΩςΫνϟϓϩάϥϛϯάΠϯλʔϑΣΠεΛத৺ʹ͝հ
͔͜͜Βαʔόʔͷөํ๏ʹ͍ͭͯ͝հ
FTP
CGI/mode_perl/FastCGIͰFTPΛͬͯσϓϩΠ͍ͯͨ͠ͷͰলུ※2023࣌ͷҙݟͰ͢
PushܕσϓϩΠ
PushܕσϓϩΠͷख๏
࣮ફ: PSGIΞϓϦΛPushܕσϓϩΠ͢Δ
PushܕσϓϩΠͷ• αʔόʔ͕େ͖͘ͳΓ࢝Ίͨ• Push͢ΔଆͷϦιʔεͷͯ͠σϓϩΠ͕͘ͳΔ• ύϒϦοΫΫϥυͷීٴͰΦʔτεέʔϧ͢ΔΑ͏ʹͳ͕ͬͨɺͦͷ߹ͷ৯͍߹Θ͕ͤѱ͍
PullܕσϓϩΠ
PullܕσϓϩΠͷख๏
࣮ફ: stretcherΛ༻͍ͨPushܕσϓϩΠ
ΞʔΩςΫνϟͷհʹΔ
Docker
DockerΛͬͨσϓϩΠͷख๏
࣮ફ: Docker SwarmΛ༻͍ͨDockerͷσϓϩΠ
Dockerͷొഎܠ• Dockerͷൃද2013• PullܕσϓϩΠ• ʮίϯςφʯͱ͍͏ܗͰWebΞϓϦέʔγϣϯΛϥϯλΠϜ͝ͱpackͯ͠σϓϩΠ͢Δख๏• ʮσϓϩΠʯͷର͕ΞϓϦέʔγϣϯϓϩάϥϜʹՃ͑ͯϥϯλΠϜ·Ͱ͕ͬͨ
Serverless
LambdaΛ༻͍ͨαʔόʔϨεͷख๏
࣮ફ: lambrollΛ༻͍ͨPerl WebΞϓϦέʔγϣϯͷσϓϩΠ
Serverless/FaaSͷొഎܠ• ΞϓϦέʔγϣϯ੍࡞ऀ͕ཧ͢Δର͕࣌Λ͏͝ͱʹϨΠϠʔ্͕ͱ্͕͍͍ͬͯͬͯͨ• ཧαʔόʔ, Ծαʔόʔ, IaaS, ίϯςφ• ϥϯλΠϜϓϩηεͷϥΠϑαΠΫϧ·ͰΫϥυࣄۀऀʹ͓ئ͍ͯ͠͠·͏ͷ͕Serverless• Ϩϯλϧαʔόʔ/CGIͷճؼ, ΑΓޮԽ͞Εͨͷ
Serverless/FaaSͷྨࣅ• PaaS• Heroku, Elastic Beanstalk, AppEngine(Flexible Environment)…• ϥϯλΠϜͷΫϥυࣄۀऀ• ͨͩ͠αʔόʔతଘࡏ࣮֬ʹײ͡Δ, εέʔϦϯάઃఆͳͲ
͍͔͕Ͱͨ͠Ͱ͠ΐ͏͔
ొஃऀͷײ• σϓϩΠٕज़લʹΘΕٕͨज़ͷ՝Λղফ͢ΔͨΊʹੜ·Ε͖ͯͨ• ࢼߦࡨޡͷ݁Ռࠓ͕͋Δɻͭ·Γ “try/catch” Ͱ͢Ͷ• ͦΕͦΕͱͯ͠ɺੲͷٕज़ͰݟͲ͜Ζ͋Δ• CGI͕ಈ͘ϨϯλϧαʔόʔFaaSͱݴ͑Δ• ੲΑΓWebΞϓϦέʔγϣϯ͕ղ͜͏ͱ͢Δ՝͕ෳࡶʹͳ͍ͬͯΔͷͰɺཧํ๏ͷҰͭͰ͋ΔʮσϓϩΠʯෳࡶʹͳΔ
͋ͳͨͷ͖ͳʮσϓϩΠʯ͋Γ·͔ͨ͠ʁ
࠙ձͱ͔࿓ԼͰͯ͠ཉ͍͠• 2000ΑΓલͷJavaͱ͔Ͳ͏ͬͯσϓϩΠ͍ͯͨ͠ͷ͔ʁ• warͰݻΊͯΛFTPͰυʔϯ͍ͯͨ͠, TomcatͰͱ͍͏͕͋Γ·͢ɻ༗ࣝऀͷํʑͲ͏ͧ• ASPͱ͔IISͱ͔Windows Server• mod_perl͔FastCGIͲͪΒΛ͍͔ͬͯͨ• ͓͢͢ΊͷϨϯλϧαʔόʔ• ొஃऀXREAΛ͍ͬͯ·ͨ͠
࠙ձͱ͔࿓ԼͰͯ͠ཉ͍͠ ͦͷ2• ϩʔϦϯάϦελʔτ, ϒϧʔάϦʔϯσϓϩΠ• graceful restart• PullܕσϓϩΠ+graceful restartσϓϩΠ͕ΊͪΌΊͪΌ͔ͬͨ• ΠϯϑϥͷઃఆσϓϩΠͱΞϓϦέʔγϣϯͷσϓϩΠͷڥ