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
2
650
PHPアプリケーションのスケーラビリティと 信頼性を革新する nginx+ngx_mrubyとGoの融合
PHPerKaigi2024でお話しました。
Kazuhiko Yamashita
March 07, 2024
Tweet
Share
More Decks by Kazuhiko Yamashita
See All by Kazuhiko Yamashita
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
4.9k
Managing Database Migrations in Go Backend Systems
pyama86
0
150
新しい職場の CI が 20 分かかっていたらあなたならどうする?
pyama86
2
1.5k
事業を差別化する技術を生み出す技術
pyama86
4
1.9k
Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ
pyama86
9
9.8k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.9k
Tuning GraphQL on Rails
pyama86
2
2.4k
ttlcacheのここがスゴい
pyama86
1
220
クラウドサービスの 利用コストを削減する技術 - 円安の真南風を感じて -
pyama86
3
690
Other Decks in Programming
See All in Programming
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
210
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
300
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
550
Grafana:建立系統全知視角的捷徑
blueswen
0
260
[AtCoder Conference 2025] LLMを使った業務AHCの上⼿な解き⽅
terryu16
6
970
Graviton と Nitro と私
maroon1st
0
150
JETLS.jl ─ A New Language Server for Julia
abap34
2
470
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
570
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
320
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
150
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
470
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.5k
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
69
The Mindset for Success: Future Career Progression
greggifford
PRO
0
200
Music & Morning Musume
bryan
46
7k
Between Models and Reality
mayunak
0
150
Abbi's Birthday
coloredviolet
0
4k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
76
Mobile First: as difficult as doing things right
swwweet
225
10k
Skip the Path - Find Your Career Trail
mkilby
0
28
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
The Curse of the Amulet
leimatthew05
0
6.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
61
47k
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