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
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyと...
Search
Kazuhiko Yamashita
March 07, 2024
Programming
710
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.1k
継続的な負荷検証を目指して
pyama86
3
1.7k
成長期における、 ユーザー領域の複雑さと 整備の進め方
pyama86
1
650
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
6.4k
Managing Database Migrations in Go Backend Systems
pyama86
0
510
新しい職場の CI が 20 分かかっていたらあなたならどうする?
pyama86
2
1.5k
事業を差別化する技術を生み出す技術
pyama86
4
2.2k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
11k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
2.1k
Other Decks in Programming
See All in Programming
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
130
A2UI という光を覗いてみる
satohjohn
1
160
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
790
act1-costs.pdf
sumedhbala
0
120
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
170
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
230
これからAgentCoreを触る方へトレンドはGatewayです
har1101
2
330
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
310
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
980
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
370
Contextとはなにか
chiroruxx
1
380
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.5k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Navigating Weather and Climate Data
rabernat
0
250
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
550
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
BBQ
matthewcrist
89
10k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
620
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
160
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
870
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