Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyと...
Search
Kazuhiko Yamashita
March 07, 2024
Programming
760
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyとGoの融合
PHPerKaigi2024でお話しました。
Kazuhiko Yamashita
March 07, 2024
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2.7k
継続的な負荷検証を目指して
pyama86
3
1.9k
成長期における、 ユーザー領域の複雑さと 整備の進め方
pyama86
1
850
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
6.8k
Managing Database Migrations in Go Backend Systems
pyama86
0
610
新しい職場の CI が 20 分かかっていたらあなたならどうする?
pyama86
2
1.6k
事業を差別化する技術を生み出す技術
pyama86
4
2.4k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
11k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
2.2k
Other Decks in Programming
See All in Programming
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
320
Groovy as a human and AI friendly programming language
paulk
0
180
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
260
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.5k
Crash Auto Pipelines
veronikapj
1
350
Getting Started with Vibe Coding
miccheng
0
180
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
120
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
260
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
280
No More NoSuchMethodError
exoego
1
120
はじめてのPLATEAU
nokonoko1203
1
310
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
140
Featured
See All Featured
Believing is Seeing
oripsolob
1
270
Ruling the World: When Life Gets Gamed
codingconduct
0
430
WENDY [Excerpt]
tessaabrams
14
40k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
970
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
2
1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
For a Future-Friendly Web
brad_frost
184
11k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
610
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
The agentic SEO stack - context over prompts
schlessera
0
1k
Transcript
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟͱ ৴པੑΛֵ৽͢Δ nginx+ngx_mrubyͱGoͷ༥߹ ʙϚΠΫϩαʔϏείΞμϯϓڵຯ͋ΔΜͰ͚͢Ͳฤʙ
ࢁԼ!QZBNB (.0ϖύϘٕज़ج൫νʔϜ γχΞɾϓϦϯγύϧ ɹΩϟϯϓɺཱྀߦɺώϧτϯ८ΓɺιϫχΤ८Γ 1SPYZαʔό։ൃɺ0QFO5FMFNFUSZ
ࠓ͢͜ͱ 1. PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ 2. Ծ߹ࣨ 3. νϡʔχϯάͱिץӡ༻࣮
PHPΞϓϦέʔγϣϯͷ εέʔϥϏϦςΟ
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ LAMPελοΫ(Linux, Apache, MySQL, PHP) LEMPελοΫ(Linux, nginx (Engine-X), MySQL/MariaDB, PHP)
ϚΠΫϩαʔϏεΞʔΩςΫνϟ αʔόʔϨεΞʔΩςΫνϟ ݱͰ࠾༻͞ΕΔΑ͏ͳΞʔΩςΫνϟPHPͰ࣮ݱͰ͖Δ
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ ࡢࠓͷWEB։ൃͰඞཁͳཁ݅Λຬ͍ͨͯ͠Δ දతWEBϑϨʔϜϫʔΫ ϛυϧΣΞ ίϛϡχςΟ Laravel,CakePHP, Symfony Database,NoSQL,CloudSDK https://www.php.net/conferences/index.php
ΧϯϑΝϨϯεͷۙ ͕Crazy Japanese 16 5
PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ ύϑΥʔϚϯεଟݴޠͱൺֱͯ͠े https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php-python3.html https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/php-ruby.html ※1 NମʢN-body problemʣɺཧֶʹ͓͍ͯɺޓ͍ʹॏྗͳͲͷྗͰӨڹ͠߹͏NݸͷମͷӡಈΛ༧ଌ͢ΔͰ͢ɻ ※2 ֤ݴޠͷ࣮݁ՌҾ༻ݩͷThe Computer
Language Benchmarks Gameͷ௨ΓͰɺݴޠͷ༏ྼͰͳ͘૬ରతʹ ੑೳ͕ेͱ͍͏͜ͱΛ͜ͷεϥΠυҙਤ͍ͯ͠·͢
ϘτϧωοΫ Ͳ͜ʹ͋Δͷ͔ʁ
Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPUϝϞϦͷϦιʔεෆ • σʔλετΞ(N+1ͳͲͷ࣮՝ؚΉ) • SaaS
Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPUϝϞϦͷϦιʔεෆ → εέʔϧΞοϓɾΞτ • σʔλετΞ(N+1ͳͲͷ࣮՝ؚΉ) → ؤுΔ •
SaaS → ࣌ͱ߹ͱɺ࣌ͷӡɺ࣌ʹͲ͏ʹͳΒͳ͍
େਓ͙ͬͯ͢ϨʔτϦϛοτͬͯ ݴ͏͚ͲɺϢʔβʔ͔ΒݟͨΒ མͪͯΔͷͱҰॹͩΑͶʙ
Ծ߹ࣨ
Ծ߹ࣨ ΞΫηεॱͰͪߦྻΛܗͯ͠ɺ ॱ൪ʹϢʔβʔΛαΠτʹҊ
߹ࣨAPIͷ֓ཁ (PͰ࣮͞Εͨ)551αʔό https://github.com/pyama86/waitingroom go on-memory cache redis query query response
response ଟͷߴͳσʔλετΞΛར༻ͯ͠ɺߴʹ࣮ߦ
߹ࣨͷঢ়ଶભҠ ىಈ ىಈத ղআ αΠτͷաΞΫηεΛܖػʹαΠτʹର͢Δ ߹ࣨΛىಈ͢Δ աΞΫηε͕མͪண͍ͨΒɺ ௨ৗ௨ΓΞΫηε͕Ͱ͖Δ ߹͕ࣨىಈதɺΞΫηεՄೳͳॱ൪ʹͳΔ·Ͱɺ ʮ̋ਓͪʯͱ߹ࣨͷը໘͕දࣔ͞ΕΔ
߹ࣨͷجຊػೳ ୯Ґ࣌ؒ͋ͨΓɺͲΕ͘Β͍ͷϢʔβʔΛΞΫηεՄೳʹ͢Δ͔ ΞΫηεՄೳ࣌ؒͲΕ͘Β͍͔ʁ ྫ:1͋ͨΓ50ΫϥΠΞϯτଓΛڐՄ͢Δ ྫ:ڐՄ͞ΕͨΫϥΠΞϯτڐՄޙɺ10ؒΞΫηεՄೳ
ཧػೳॆ࣮ ىಈ࣌ʹSlack௨ɺཧը໘ఏڙ https://github.com/cam-inc/viron
https://youtu.be/oIw4m5cT5YA?si=IAAo4uzhykxBkkgO
ngx_mruby MPDBUJPOIFMMP\ NSVCZ@DPOUFOU@IBOEMFS@DPEF /HJOYFDIP)FMMP8PSME ^ OHJOYͷ͋ΒΏΔΠϕϯτʹϑοΫͯ͠ɺNSVCZͷίʔυΛ࣮ߦ͠ɺ ϓϩάϥϚϒϧʹτϥϑΟοΫίϯτϩʔϧग़དྷΔ https://github.com/matsumotory/ngx_mruby
߹ࣨΞʔΩςΫνϟͷ֓ཁ Waiting Room ngx_mruby Client Origin 1.ϦΫΤετ 2.ىಈ͞Ε͍ͯΔ͔ʁ 3.ະىಈ͔ ڐՄࡁΈΫϥΠΞϯτ
4.ϦΫΤετ 5.Ϩεϙϯε 6.Ϩεϙϯε OHY@NSVCZ͔Β߹ࣨ"1*ʹ )551ϦΫΤετͯ͠ঢ়ଶ֬ೝ
߹ࣨىಈܖػ location / { limit_req zone=example nodelay; limit_req_status 512; error_page
512 =200 @waitingroom; } ϨʔτϦϛοτʹ֘ͨ͠Β εςʔλε512ͰΤϥʔѻ͍ʹ͔ͯ͠Βɺ εςʔλεΛ200ʹॻ͖͑ͯ ϦμΠϨΫτ OHJOYͷSBUFMJNJUNPEVMFΛར༻͠ɺ աΞΫηεΛݕ
߹ࣨىಈܖػ location @waitingroom { mruby_rewrite_handler enable_waitingroom.rb; proxy_pass origin_backend/$request_uri; internal; }
location ~ ^/queues { proxy_pass waitingroom; internal; } ߹ࣨAPImrubyͰ HTTPܦ༝Ͱίʔϧͯ͠ɺ ߹ࣨΛىಈ͢Δ
߹ࣨىಈܖػ 1.ϊϯϒϩοΩϯάʹϦΫΤετ 2.੍ݶதͰॱ൪ͪঢ়ଶͳΒ503 3.੍ݶ͞Εͯͳ͚ΕόοΫΤϯυϓϩΩγ
ngx_http_subrequest location / { subrequest /subrequest } location /subreqest {
puts "hello" } # http://localhost/ => hello ͋ΔϩέʔγϣϯʹདྷͨϦΫΤετΛ ଞͷϩέʔγϣϯʹϊϯϒϩοΩϯάʹ ϦΫΤετͯ͠ར༻͢Δ
ϊϯϒϩοΩϯά
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.Ϩεϙϯε
nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.Ϩεϙϯε 5.Ϩεϙϯε ઌߦͷϦΫΤετྃ·Ͱ ͨ͞ΕΔ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ
4.ϦΫΤετ ઌߦͷϦΫΤετྃΛ ͨͣʹଞͷॲཧ͕Ͱ͖Δ
nginxͱϊϯϒϩοΩϯά mrubyϦΫΤετϨεϙϯεͷॲཧͷҰ෦ͱ࣮ͯ͠ߦ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ ϦΫΤετΛड͚͚ͨͱ͖ ͳͲͷॲཧͷҰ෦ͱͯ͠
mruby͕࣮ߦ͞Ε͍ͯΔ
mrubyϒϩοΩϯάͯ͠͠·͏ nginxϊϯϒϩοΩϯάI/O͕ͩmrubyͰߟྀ͞Ε͍ͯͳ͍ SFRVFTU SFRVFTU SFRVFTU NSVCZ NSVCZ NSVCZ SFTQPOTF SFTQPOTF
SFTQPOTF XPSLFS ngx_mrubyʹ͓͚Δmruby࣮ߦ͕ϒϩοΫ͞ΕΔͱ͍͏ҙຯͰ͢
Nginx::Async::HTTP.sub_request )551ϦΫΤετͱಉ࣌ʹϒϩοΫΛ։์͠ɺ Ϩεϙϯε࣌ʹίʔϧόοΫΛड͚औΓ࠶։ SFRVFTU SFRVFTU NSVCZ SFTQPOTF SFTQPOTF NSVCZ TVCSFRFTU
3FRVFTU 3FTQPOTF
sub_requestΛ༻͍Δ͜ͱͰ ߴͳAPI࣮ߦΛ࣮ݱ Waiting Room ngx_mruby Client Origin sub_requestͰ ඇಉظϦΫΤετͳͷͰ ύϑΥʔϚϯεͷӨڹ͕গͳ͍
νϡʔχϯάͱ िץӡ༻࣮
νϡʔχϯάͱिץӡ༻࣮ 1.ຒ·Διέοτ 2.ͦͦ
ຒ·Διέοτ
߹ࣨͷϦΫΤετ͕ࣦഊ͢ΔΑ͏ʹͳͬͨ Waiting Room ngx_mruby Client Origin ϐʔΫλΠϜʹ ߹ࣨͷAPI͕ Connection Refused
DBUQSPDTZTOFUJQWJQ@MPDBM@QPSU@SBOHF TIME WAITͷେྔൃੜ ιέοτͷঢ়ଶ͕։์͕ؒʹ߹Θͣɺ৽ن௨৴͕ෆՄೳ OFUTUBUBOcHSFQ5*.&@8"*5cXDM Ұൠతͳ-JOVYαʔόσϑΥϧτͩͱ*1͋ͨΓ ϙʔτ͔͠ར༻Ͱ͖ͳ͍
߹ࣨʹେྔͷϦΫΤετ͕ߦΘΕΔ Waiting Room ngx_mruby Client Origin ߹ࣨͷىಈ֬ೝ͕ શϦΫΤετߦΘΕΔͷͰ ຖճ৽نଓ͞ΕΔ LFFQBMJWFޮ͍ͯͳ͍ͷͰʁ
nginxͷupstream keepaliveσϑΥϧτແޮ LFFQBMJWFσΟϨΫςΟϒͷઃఆͱ $POOFDUJPOϔομʔɺ )551όʔδϣϯͷࢦఆ͕ඞཁ VQTUSFBNIUUQ@CBDLFOE\ TFSWFS LFFQBMJWF ^ TFSWFS\
MPDBUJPOIUUQ\ QSPYZ@QBTTIUUQIUUQ@CBDLFOE QSPYZ@IUUQ@WFSTJPO QSPYZ@TFU@IFBEFS$POOFDUJPO ^ ^
ͦͦ
߹͕ࣨදࣔ͞ΕͨϢʔβʔ ΞΫηεͪʓʓਓͱ͔ ग़ͯΔ͚Ͳɺ མͪͯΜ͡ΌΜʂ
ͦͦ ͬͨ݁Ռɺ͕ߪೖͰ͖ͨͳͲͷ·͍݁͠Ռ͕ಘΒΕͨ߹ɺ ϙδςΟϒ ͬͨ݁Ռɺ·͍݁͠Ռ͕ಘΒΕͳ͍ɺͯ͘͠ͳ͍߹ɺ αʔό͕μϯ͍ͯ͠ΔͷͱମݧมΘΒͳ͍
ࣃΛ͍͂͘ɾɾɾ
ࠓͨ͜͠ͱ • PHPݴޠͱͯ͠WEB։ൃͰࠔΔ͜ͱ΄ͱΜͲͳ͍ • nginxͷϨʔτϦϛοτsub_requestΛ্खʹ͏ͱ ߴʹಈ࡞͢Δ͓͠Ζ࣮͕Ͱ͖Δ • ϘτϧωοΫͷ͏ͪɺղফͰ͖ͳ͍ͷ͋Γɺͦͷ߹ʹ߹ࣨ ༗ޮͳଧͪखͱͳΔ͕ɺΘͳ͍͍ͯ͘ʹӽͨ͜͠ͱͳ͍
1)1ΊͬͪΌ͋Γ·͢ɺ͋Γ͗ͯ͢ ᷓΕͯ·͢ ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU