Slide 1

Slide 1 text

PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟͱ ৴པੑΛֵ৽͢Δ nginx+ngx_mrubyͱGoͷ༥߹ ʙϚΠΫϩαʔϏε΋ίΞμϯϓ΋ڵຯ͋ΔΜͰ͚͢Ͳฤʙ

Slide 2

Slide 2 text

ࢁԼ࿨඙!QZBNB (.0ϖύϘٕज़ج൫νʔϜ γχΞɾϓϦϯγύϧ ɹΩϟϯϓɺཱྀߦɺώϧτϯ८ΓɺιϫχΤ८Γ 1SPYZαʔό։ൃɺ0QFO5FMFNFUSZ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ 1. PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ 2. Ծ૝଴߹ࣨ 3. νϡʔχϯάͱिץӡ༻࣮࿩

Slide 4

Slide 4 text

PHPΞϓϦέʔγϣϯͷ εέʔϥϏϦςΟ

Slide 5

Slide 5 text

PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ LAMPελοΫ(Linux, Apache, MySQL, PHP) LEMPελοΫ(Linux, nginx (Engine-X), MySQL/MariaDB, PHP) ϚΠΫϩαʔϏεΞʔΩςΫνϟ αʔόʔϨεΞʔΩςΫνϟ ݱ୅Ͱ࠾༻͞ΕΔΑ͏ͳΞʔΩςΫνϟ͸PHPͰ࣮ݱͰ͖Δ

Slide 6

Slide 6 text

PHPΞϓϦέʔγϣϯͷεέʔϥϏϦςΟ ࡢࠓͷWEB։ൃͰඞཁͳཁ݅Λຬ͍ͨͯ͠Δ ୅දతWEBϑϨʔϜϫʔΫ ϛυϧ΢ΣΞ ίϛϡχςΟ Laravel,CakePHP, Symfony Database,NoSQL,CloudSDK https://www.php.net/conferences/index.php

Slide 7

Slide 7 text

ΧϯϑΝϨϯεͷ௚ۙ ͕Crazy Japanese 16 5

Slide 8

Slide 8 text

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ͷ௨ΓͰɺݴޠͷ༏ྼͰ͸ͳ͘૬ରతʹ ੑೳ͕े෼ͱ͍͏͜ͱΛ͜ͷεϥΠυ͸ҙਤ͍ͯ͠·͢

Slide 9

Slide 9 text

ϘτϧωοΫ͸
 Ͳ͜ʹ͋Δͷ͔ʁ

Slide 10

Slide 10 text

Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPU΍ϝϞϦͷϦιʔεෆ଍ • σʔλετΞ(N+1ͳͲͷ࣮૷՝୊΋ؚΉ) • SaaS

Slide 11

Slide 11 text

Α͋͘ΔPHPΞϓϦέʔγϣϯͷϘτϧωοΫ • CPU΍ϝϞϦͷϦιʔεෆ଍ → εέʔϧΞοϓɾΞ΢τ • σʔλετΞ(N+1ͳͲͷ࣮૷՝୊΋ؚΉ) → ؤுΔ • SaaS → ࣌ͱ৔߹ͱɺ࣌ͷӡɺ࣌ʹͲ͏ʹ΋ͳΒͳ͍

Slide 12

Slide 12 text

େਓ͙ͬͯ͢ϨʔτϦϛοτͬͯ ݴ͏͚ͲɺϢʔβʔ͔ΒݟͨΒ མͪͯΔͷͱҰॹͩΑͶʙ

Slide 13

Slide 13 text

Ծ૝଴߹ࣨ

Slide 14

Slide 14 text

Ծ૝଴߹ࣨ ΞΫηεॱͰ଴ͪߦྻΛܗ੒ͯ͠ɺ
 ॱ൪ʹϢʔβʔΛαΠτʹҊ಺

Slide 15

Slide 15 text

଴߹ࣨAPIͷ֓ཁ (PͰ࣮૷͞Εͨ)551αʔό https://github.com/pyama86/waitingroom go on-memory cache redis query query response response ଟ૚ͷߴ଎ͳσʔλετΞΛར༻ͯ͠ɺߴ଎ʹ࣮ߦ

Slide 16

Slide 16 text

଴߹ࣨͷঢ়ଶભҠ ىಈ ىಈத ղআ αΠτͷա৒ΞΫηεΛܖػʹαΠτʹର͢Δ
 ଴߹ࣨΛىಈ͢Δ ա৒ΞΫηε͕མͪண͍ͨΒɺ
 ௨ৗ௨ΓΞΫηε͕Ͱ͖Δ ଴߹͕ࣨىಈத͸ɺΞΫηεՄೳͳॱ൪ʹͳΔ·Ͱɺ
 ʮ̋ਓ଴ͪʯͱ଴߹ࣨͷը໘͕දࣔ͞ΕΔ

Slide 17

Slide 17 text

଴߹ࣨͷجຊػೳ ୯Ґ࣌ؒ͋ͨΓɺͲΕ͘Β͍ͷϢʔβʔΛΞΫηεՄೳʹ͢Δ͔ ΞΫηεՄೳ࣌ؒ͸ͲΕ͘Β͍͔ʁ ྫ:1෼͋ͨΓ50ΫϥΠΞϯτ઀ଓΛڐՄ͢Δ ྫ:ڐՄ͞ΕͨΫϥΠΞϯτ͸ڐՄޙɺ10෼ؒΞΫηεՄೳ

Slide 18

Slide 18 text

؅ཧػೳ΋ॆ࣮ ىಈ࣌ʹSlack௨஌ɺ؅ཧը໘΋ఏڙ https://github.com/cam-inc/viron

Slide 19

Slide 19 text

https://youtu.be/oIw4m5cT5YA?si=IAAo4uzhykxBkkgO

Slide 20

Slide 20 text

ngx_mruby MPDBUJPOIFMMP\ NSVCZ@DPOUFOU@IBOEMFS@DPEF /HJOYFDIP)FMMP8PSME  ^ OHJOYͷ͋ΒΏΔΠϕϯτʹϑοΫͯ͠ɺNSVCZͷίʔυΛ࣮ߦ͠ɺ ϓϩάϥϚϒϧʹτϥϑΟοΫίϯτϩʔϧग़དྷΔ https://github.com/matsumotory/ngx_mruby

Slide 21

Slide 21 text

଴߹ࣨΞʔΩςΫνϟͷ֓ཁ Waiting Room ngx_mruby Client Origin 1.ϦΫΤετ 2.ىಈ͞Ε͍ͯΔ͔ʁ 3.ະىಈ͔
 ڐՄࡁΈΫϥΠΞϯτ 4.ϦΫΤετ 5.Ϩεϙϯε 6.Ϩεϙϯε OHY@NSVCZ͔Β଴߹ࣨ"1*ʹ )551ϦΫΤετͯ͠ঢ়ଶ֬ೝ

Slide 22

Slide 22 text

଴߹ࣨىಈܖػ location / { limit_req zone=example nodelay; limit_req_status 512; error_page 512 =200 @waitingroom; } ϨʔτϦϛοτʹ֘౰ͨ͠Β
 εςʔλε512ͰΤϥʔѻ͍ʹ͔ͯ͠Βɺ εςʔλεΛ200ʹॻ͖׵͑ͯ
 ϦμΠϨΫτ OHJOYͷSBUFMJNJUNPEVMFΛར༻͠ɺ ա৒ΞΫηεΛݕ஌

Slide 23

Slide 23 text

଴߹ࣨىಈܖػ location @waitingroom { mruby_rewrite_handler enable_waitingroom.rb; proxy_pass origin_backend/$request_uri; internal; } location ~ ^/queues { proxy_pass waitingroom; internal; } ଴߹ࣨAPI͸mrubyͰ
 HTTPܦ༝Ͱίʔϧͯ͠ɺ
 ଴߹ࣨΛىಈ͢Δ

Slide 24

Slide 24 text

଴߹ࣨىಈܖػ 1.ϊϯϒϩοΩϯάʹϦΫΤετ 2.੍ݶதͰॱ൪଴ͪঢ়ଶͳΒ503 3.੍ݶ͞Εͯͳ͚Ε͹όοΫΤϯυ΁ϓϩΩγ

Slide 25

Slide 25 text

ngx_http_subrequest location / { subrequest /subrequest } location /subreqest { puts "hello" } # http://localhost/ => hello ͋ΔϩέʔγϣϯʹདྷͨϦΫΤετΛ ଞͷϩέʔγϣϯʹϊϯϒϩοΩϯάʹ ϦΫΤετͯ͠ར༻͢Δ

Slide 26

Slide 26 text

ϊϯϒϩοΩϯά

Slide 27

Slide 27 text

nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ

Slide 28

Slide 28 text

nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ

Slide 29

Slide 29 text

nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ

Slide 30

Slide 30 text

nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ 4.Ϩεϙϯε

Slide 31

Slide 31 text

nginxͱϊϯϒϩοΩϯά ϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU XFCTFSWFS originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ 4.Ϩεϙϯε 5.Ϩεϙϯε ઌߦͷϦΫΤετ׬ྃ·Ͱ ଴ͨ͞ΕΔ

Slide 32

Slide 32 text

nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ

Slide 33

Slide 33 text

nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ

Slide 34

Slide 34 text

nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ

Slide 35

Slide 35 text

nginxͱϊϯϒϩοΩϯά ϊϯϒϩοΩϯάI/Oͷྫ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ 2.ϦΫΤετ 3.ϦΫΤετ 4.ϦΫΤετ ઌߦͷϦΫΤετ׬ྃΛ ଴ͨͣʹଞͷॲཧ͕Ͱ͖Δ

Slide 36

Slide 36 text

nginxͱϊϯϒϩοΩϯά mruby͸ϦΫΤετ΍ϨεϙϯεͷॲཧͷҰ෦ͱ࣮ͯ͠ߦ DMJFOU DMJFOU OHJOY originA originB 1.ϦΫΤετ ϦΫΤετΛड͚෇͚ͨͱ͖ ͳͲͷॲཧͷҰ෦ͱͯ͠ mruby͕࣮ߦ͞Ε͍ͯΔ

Slide 37

Slide 37 text

mruby͸ϒϩοΩϯάͯ͠͠·͏ nginx͸ϊϯϒϩοΩϯάI/O͕ͩmrubyͰ͸ߟྀ͞Ε͍ͯͳ͍ SFRVFTU SFRVFTU SFRVFTU NSVCZ NSVCZ NSVCZ SFTQPOTF SFTQPOTF SFTQPOTF XPSLFS ngx_mrubyʹ͓͚Δmruby࣮ߦ͕ϒϩοΫ͞ΕΔͱ͍͏ҙຯͰ͢

Slide 38

Slide 38 text

Nginx::Async::HTTP.sub_request )551ϦΫΤετͱಉ࣌ʹϒϩοΫΛ։์͠ɺ Ϩεϙϯε࣌ʹίʔϧόοΫΛड͚औΓ࠶։ SFRVFTU SFRVFTU NSVCZ SFTQPOTF SFTQPOTF NSVCZ TVCSFRFTU 3FRVFTU 3FTQPOTF

Slide 39

Slide 39 text

sub_requestΛ༻͍Δ͜ͱͰ ߴ଎ͳAPI࣮ߦΛ࣮ݱ Waiting Room ngx_mruby Client Origin sub_requestͰ ඇಉظϦΫΤετͳͷͰ ύϑΥʔϚϯεͷӨڹ͕গͳ͍

Slide 40

Slide 40 text

νϡʔχϯάͱ िץӡ༻࣮࿩

Slide 41

Slide 41 text

νϡʔχϯάͱिץӡ༻࣮࿩ 1.ຒ·Διέοτ 2.ͦ΋ͦ΋࿦

Slide 42

Slide 42 text

ຒ·Διέοτ

Slide 43

Slide 43 text

଴߹ࣨͷϦΫΤετ͕ࣦഊ͢ΔΑ͏ʹͳͬͨ Waiting Room ngx_mruby Client Origin ϐʔΫλΠϜʹ ଴߹ࣨͷAPI͕ Connection Refused

Slide 44

Slide 44 text

DBUQSPDTZTOFUJQWJQ@MPDBM@QPSU@SBOHF  TIME WAITͷେྔൃੜ ιέοτͷঢ়ଶ͕։์͕ؒʹ߹Θͣɺ৽ن௨৴͕ෆՄೳ OFUTUBUBOcHSFQ5*.&@8"*5cXDM  Ұൠతͳ-JOVYαʔό͸σϑΥϧτͩͱ*1͋ͨΓ ϙʔτ͔͠ར༻Ͱ͖ͳ͍

Slide 45

Slide 45 text

଴߹ࣨʹ͸େྔͷϦΫΤετ͕ߦΘΕΔ Waiting Room ngx_mruby Client Origin ଴߹ࣨͷىಈ֬ೝ͕ શϦΫΤετߦΘΕΔͷͰ ຖճ৽ن઀ଓ͞ΕΔ LFFQBMJWFޮ͍ͯͳ͍ͷͰ͸ʁ

Slide 46

Slide 46 text

nginxͷupstream keepalive͸σϑΥϧτແޮ LFFQBMJWFσΟϨΫςΟϒͷઃఆͱ $POOFDUJPOϔομʔɺ )551όʔδϣϯͷࢦఆ͕ඞཁ VQTUSFBNIUUQ@CBDLFOE\ TFSWFS LFFQBMJWF ^ TFSWFS\ MPDBUJPOIUUQ\ QSPYZ@QBTTIUUQIUUQ@CBDLFOE QSPYZ@IUUQ@WFSTJPO QSPYZ@TFU@IFBEFS$POOFDUJPO  ^ ^

Slide 47

Slide 47 text

ͦ΋ͦ΋࿦

Slide 48

Slide 48 text

଴߹͕ࣨදࣔ͞ΕͨϢʔβʔ ΞΫηε଴ͪʓʓਓͱ͔ ग़ͯΔ͚Ͳɺ མͪͯΜ͡ΌΜʂ

Slide 49

Slide 49 text

ͦ΋ͦ΋࿦ ଴ͬͨ݁Ռɺ঎඼͕ߪೖͰ͖ͨͳͲͷ๬·͍݁͠Ռ͕ಘΒΕͨ৔߹ɺ
 ϙδςΟϒ ଴ͬͨ݁Ռɺ๬·͍݁͠Ռ͕ಘΒΕͳ͍ɺ΋͘͠͸଴ͯͳ͍৔߹ɺ
 αʔό͕μ΢ϯ͍ͯ͠Δͷͱମݧ͸มΘΒͳ͍

Slide 50

Slide 50 text

ࣃΛ͍͂͘ɾɾɾ

Slide 51

Slide 51 text

ࠓ೔࿩ͨ͜͠ͱ • PHP͸ݴޠͱͯ͠͸WEB։ൃͰࠔΔ͜ͱ͸΄ͱΜͲͳ͍ • nginxͷϨʔτϦϛοτ΍sub_requestΛ্खʹ࢖͏ͱ
 ߴ଎ʹಈ࡞͢Δ͓΋͠Ζ࣮૷͕Ͱ͖Δ • ϘτϧωοΫͷ͏ͪɺղফͰ͖ͳ͍΋ͷ΋͋Γɺͦͷ৔߹ʹ଴߹ࣨ͸
 ༗ޮͳଧͪखͱͳΔ͕ɺ࢖Θͳ͍͍ͯ͘ʹӽͨ͜͠ͱ͸ͳ͍

Slide 52

Slide 52 text

1)1ΊͬͪΌ͋Γ·͢ɺ͋Γ͗ͯ͢ ᷓΕͯ·͢ ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ !QC@SFDSVJU